¿Cómo puedo desplazarme a una ubicación específica en la página usando jquery?

133

¿Es posible desplazarse a una ubicación específica en la página usando jQuery?

¿La ubicación que quiero desplazar para tener que tener:

<a name="#123">here</a>

¿O simplemente puede pasar a un ID de DOM específico?

mrblah
fuente
3
solo una pequeña nota: el atributo "nombre" no está permitido en XHTML 1.1 Strict, use una ID en su lugar
Juraj Blahunka
pregunta interesante, ¿no puedes usar las coordenadas de la página para desplazarte? Creo que deberíamos poder hacerlo.
Omar Abid
Obtuve una solución similar a su requisito en [aquí] [1] [1]: stackoverflow.com/questions/3432656/…
user1493023
@mrblah ¿resolvió su problema?
Meghdad Hadidi

Respuestas:

242

Complemento de desplazamiento jQuery

Como esta es una pregunta etiquetada con jquery, debo decir que esta biblioteca tiene un complemento muy bueno para un desplazamiento suave, puede encontrarlo aquí: http://plugins.jquery.com/scrollTo/

Extractos de la documentación:

$('div.pane').scrollTo(...);//all divs w/class pane

o

$.scrollTo(...);//the plugin will take care of this

Función jQuery personalizada para desplazamiento

puede utilizar un enfoque muy ligero definiendo su función personalizada jquery de desplazamiento

$.fn.scrollView = function () {
    return this.each(function () {
        $('html, body').animate({
            scrollTop: $(this).offset().top
        }, 1000);
    });
}

y úsalo como:

$('#your-div').scrollView();

Desplazarse a las coordenadas de una página

Animado htmly bodyelementos con scrollTopo scrollLeftatributos

$('html, body').animate({
    scrollTop: 0,
    scrollLeft: 300
}, 1000);

JavaScript simple

desplazarse con window.scroll

window.scroll(horizontalOffset, verticalOffset);

solo para resumir, use window.location.hash para saltar al elemento con ID

window.location.hash = '#your-page-element';

Directamente en HTML (mejoras de accesibilidad)

<a href="#your-page-element">Jump to ID</a>

<div id="your-page-element">
    will jump here
</div>
Juraj Blahunka
fuente
Gracias @Juraj Blahunka, pero hago esto sin ningún complemento
Meghdad Hadidi
El enlace no me lleva a ScrollTo . ¿Puedes actualizarlo por favor?
Barna Tekse
Esta debería ser la respuesta!
neelmeg
128

Sí, incluso en JavaScript simple es bastante fácil. Usted le da una identificación a un elemento y luego puede usarlo como un "marcador":

<div id="here">here</div>

Si desea que se desplace allí cuando un usuario hace clic en un enlace, puede usar el método probado y verdadero:

<a href="#here">scroll to over there</a>

Para hacerlo mediante programación, use scrollIntoView()

document.getElementById("here").scrollIntoView()
nickf
fuente
@nickf Esto aún no es compatible en todas partes. caniuse.com/#search=scrollIntoView
Aditya Singh el
Esto es definitivamente compatible ( developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView ). Creo que no leyó el caniuse correctamente. Sin embargo, no será animado. Más bien un salto bastante brusco que no siempre es genial.
Perry
53

No es necesario utilizar ningún complemento, puede hacerlo así:

var divPosition = $('#divId').offset();

luego use esto para desplazar el documento a DOM específico:

$('html, body').animate({scrollTop: divPosition.top}, "slow");
Meghdad Hadidi
fuente
3
+1 Esta es probablemente la mejor respuesta. No hay mucho código y no requiere un complemento.
Tricky12
1
Tenga en cuenta que es posible que deba volver a calcular el desplazamiento al cambiar el tamaño de la ventana.
Bart Burg
2
@BartBurg buen punto, o simplemente recalcular justo antes de que .animateocurra la llamada
mikermcneil
55
Me encanta la respuesta simple. ¿Por qué la gente tiene que hacer las cosas tan complicadas? No quiero otro complemento.
sterfry68
1
De hecho, la mejor respuesta.
Robert Ross
21

Aquí hay una versión pura de JavaScript:

location.hash = '#123';

Se desplazará automáticamente. Recuerde agregar el prefijo "#".

OK W
fuente
1
Utilizando la forma primitiva de ancla con nombre, puede tener una URL que incluya el hash Por ejemplo, mywebsite.com/page-about/#123 Bookmarking también incluye el comportamiento hash + scrollintoview.
okw
1
Sería genial si puedes explicar un poco
JGallardo
6

Javascript simple:

window.location = "#elementId"
Luiz Picanço
fuente
5
<div id="idVal">
    <!--div content goes here-->
</div>
...
<script type="text/javascript">
     $(document).ready(function(){
         var divLoc = $('#idVal').offset();
         $('html, body').animate({scrollTop: divLoc.top}, "slow");
     });
</script>

Este ejemplo muestra la ubicación de una identificación div particular, es decir, 'idVal' en este caso. Si tiene divs / tablas posteriores que se abrirán en esta página a través de ajax, puede asignar divs únicos y llamar al script para desplazarse a la ubicación particular para cada contenido de divs.

Espero que esto sea útil.

usuario2793243
fuente
4
<script type="text/javascript">
    $(document).ready(function(){
        $(".scroll-element").click(function(){
            $('html,body').animate({
                scrollTop: $('.our_companies').offset().top
            }, 1000);

            return false;
        });
    })
</script>

Yogesh Rathod
fuente
Sería genial si agrega algunos comentarios a su código. ¿Cómo ayuda al que pregunta a resolver su pregunta?
Artemix
1

Prueba esto

<div id="divRegister"></div>

$(document).ready(function() {
location.hash = "divRegister";
});
Ajay-Systematix
fuente
0

Aquí hay una variante del enfoque liviano de @ juraj-blahunka . Esta función no asume que el contenedor es el documento y solo se desplaza si el elemento no está a la vista. La cola de animación también está desactivada para evitar rebotes innecesarios.

$.fn.scrollToView = function () {
    return $.each(this, function () {
        if ($(this).position().top < 0 ||
            $(this).position().top + $(this).height() > $(this).parent().height()) {
            $(this).parent().animate({
                scrollTop: $(this).parent().scrollTop() + $(this).position().top
            }, {
                duration: 300,
                queue: false
            });
        }
    });
};
Richie
fuente
Tuve el problema del rebote, pero su método no funciona
Anon
0

Usando jquery.easing.min.js, con errores fijos de la consola IE

HTML

<a class="page-scroll" href="#features">Features</a>
<section id="features" class="features-section">Features Section</section>


        <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
        <script src="js/jquery.js"></script>
        <!-- Include all compiled plugins (below), or include individual files as needed -->
        <script src="js/bootstrap.min.js"></script>

        <!-- Scrolling Nav JavaScript -->
        <script src="js/jquery.easing.min.js"></script>

Jquery

//jQuery to collapse the navbar on scroll, you can use this code with in external file with name scrolling-nav.js
        $(window).scroll(function () {
            if ($(".navbar").offset().top > 50) {
                $(".navbar-fixed-top").addClass("top-nav-collapse");
            } else {
                $(".navbar-fixed-top").removeClass("top-nav-collapse");
            }
        });
        //jQuery for page scrolling feature - requires jQuery Easing plugin
        $(function () {
            $('a.page-scroll').bind('click', function (event) {
                var anchor = $(this);
                if ($(anchor).length > 0) {
                    var href = $(anchor).attr('href');
                    if ($(href.substring(href.indexOf('#'))).length > 0) {
                        $('html, body').stop().animate({
                            scrollTop: $(href.substring(href.indexOf('#'))).offset().top
                        }, 1500, 'easeInOutExpo');
                    }
                    else {
                        window.location = href;
                    }
                }
                event.preventDefault();
            });
        });
Súper modelo
fuente
Eso es demasiado código para una tarea tan simple. location.hash = 'idOfElement';debería ser suficiente
Kolob Canyon