Как я могу прокрутить до определенного места на странице, используя jquery?


133

Можно ли прокрутить до определенного места на странице с помощью jQuery?

Нужно ли иметь местоположение, которое я хочу прокрутить:

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

Или он может просто перейти к определенному идентификатору DOM?


3
просто небольшая заметка: атрибут «имя» не допускается в XHTML 1.1 Strict, используйте вместо этого идентификатор
Juraj Blahunka

интересный вопрос, не можете использовать координаты страницы для прокрутки? Я думаю, что мы должны быть в состоянии.
Омар Абид

Я получил решение, аналогичное вашему требованию, в [здесь] [1] [1]: stackoverflow.com/questions/3432656/…
user1493023

@mrblah ваша проблема решена?
Мегдад Хадиди

Ответы:


242

Плагин jQuery Scroll

так как это вопрос с тегом jquery, я должен сказать, что в этой библиотеке есть очень хороший плагин для плавной прокрутки, вы можете найти его здесь: http://plugins.jquery.com/scrollTo/

Выдержки из документации:

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

или

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

Пользовательская функция jQuery для прокрутки

Вы можете использовать очень легкий подход , определив пользовательскую функцию JQuery прокрутки

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

и используйте это как:

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

Прокрутить до координат страницы

Анимация htmlи bodyэлементы с scrollTopили scrollLeftатрибутами

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

Простой javascript

прокрутка с window.scroll

window.scroll(horizontalOffset, verticalOffset);

только чтобы подвести итог, используйте window.location.hash, чтобы перейти к элементу с идентификатором

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

Непосредственно в HTML (улучшения доступности)

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

<div id="your-page-element">
    will jump here
</div>

Спасибо @Juraj Blahunka, но я делаю это без какого-либо плагина
Мегдад Хадиди 01

Ссылка не ведет меня в ScrollTo . Можете ли вы обновить его, пожалуйста?
Barna Tekse

Это должен быть ответ!
neelmeg

128

Да, даже в простом JavaScript это довольно просто. Вы даете элементу идентификатор, а затем можете использовать его как «закладку»:

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

Если вы хотите, чтобы он прокручивался там, когда пользователь нажимает ссылку, вы можете просто использовать проверенный метод:

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

Чтобы сделать это программно, используйте scrollIntoView()

document.getElementById("here").scrollIntoView()

@nickf Это пока поддерживается не везде. caniuse.com/#search=scrollIntoView
Адитья Сингх

Это я определенно поддержал ( developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView ). Думаю, вы не правильно прочитали канюсу. Тем не менее, не будет анимированным. Довольно крутой прыжок, что не всегда хорошо.
Перри

53

Никаких плагинов использовать не нужно, это можно сделать так:

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

затем используйте это, чтобы прокрутить документ до определенного DOM:

$('html, body').animate({scrollTop: divPosition.top}, "slow");

3
+1 Наверное, это лучший ответ. Не много кода и не требует плагина.
Tricky12

1
Обратите внимание, что вам может потребоваться пересчитать смещение при изменении размера окна.
Барт Бург

2
@BartBurg хороший момент - или просто пересчитайте прямо перед .animateзвонком
mikermcneil

5
Люблю простой ответ. Почему люди должны все усложнять? Не хочу еще один плагин.
sterfry68

1
Действительно лучший ответ.
Роберт Росс

21

Вот чистая версия javascript:

location.hash = '#123';

Он будет прокручиваться автоматически. Не забудьте добавить префикс "#".


1
Используя примитивный способ именованной привязки, вы можете получить URL-адрес, который включает хэш. Например, mywebsite.com/page-about/#123 Закладки также включают поведение hash + scrollintoview.
ОКВ

1
Было бы здорово, если бы вы могли немного объяснить
Дж. Галлардо


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>

В этом примере показано, как найти конкретный идентификатор div, в данном случае idVal. Если у вас есть последующие элементы div / таблицы, которые будут открываться на этой странице через ajax, вы можете назначить уникальные элементы div и вызвать скрипт для прокрутки к определенному месту для каждого содержимого элементов div.

Надеюсь, это будет полезно.


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

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


Было бы здорово, если бы вы добавили несколько комментариев к своему коду. Как это помогает спрашивающему решить их вопрос?
Артемикс


0

Вот вариант облегченного подхода @ juraj-blahunka . Эта функция не предполагает, что контейнер является документом, и прокручивается, только если элемент находится вне поля зрения. Анимация очереди также отключена, чтобы избежать ненужного подпрыгивания.

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

У меня была проблема с отскоком, но ваш метод не работает
Anon

0

Использование jquery.easing.min.js, с исправленными ошибками консоли 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();
            });
        });

Это слишком много кода для такой простой задачи. location.hash = 'idOfElement';должно хватить
Колоб Каньон

0

Ты можешь использовать scroll-behavior: smooth; для этого без Javascript

https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior


поведение прокрутки: плавно; не совместимо с браузером
Super Model

проверьте совместимость браузера ниже по ссылке - developer.mozilla.org/en-US/docs/Web/CSS/…
Sairam

Да, данная таблица в ваших ссылках показывает: Edge, IE и safari не совместимы с этим свойством.
Super Model
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.