¿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?


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>

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 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");

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 "#".


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


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.


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

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


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";
});

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
            });
        }
    });
};

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();
            });
        });

Eso es demasiado código para una tarea tan simple. location.hash = 'idOfElement';debería ser suficiente
— Kolob Canyon

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.