JavaScript для прокрутки длинной страницы в DIV - PullRequest
94 голосов
/ 16 сентября 2008

У меня есть ссылка на длинной HTML-странице. Когда я нажимаю на нее, я хочу, чтобы div на другой части страницы был виден в окне при прокрутке.

Немного похоже на EnsureVisible на других языках.

Я проверил scrollTop и scrollTo, но они кажутся красными сельдями.

Может кто-нибудь помочь?

Ответы [ 16 ]

365 голосов
/ 03 марта 2010

старый вопрос, но если кто-нибудь найдет это через гугл (как я) и кто не хочет использовать якоря или jquery; есть встроенная функция javascript для «перехода» к элементу;

document.getElementById('youridhere').scrollIntoView();

и что еще лучше; в соответствии с большими таблицами совместимости в режиме quirksmode, поддерживается всеми основными браузерами !

23 голосов
/ 16 сентября 2008

Если вы не хотите добавлять дополнительное расширение, следующий код должен работать с jQuery.

$('a[href=#target]').
    click(function(){
        var target = $('a[name=target]');
        if (target.length)
        {
            var top = target.offset().top;
            $('html,body').animate({scrollTop: top}, 1000);
            return false;
        }
    });
22 голосов
/ 16 сентября 2008
15 голосов
/ 16 сентября 2008
<a href="#myAnchorALongWayDownThePage">Click here to scroll</a>

<A name='myAnchorALongWayDownThePage"></a>

Никакой причудливой прокрутки, но она должна вас там перенести.

8 голосов
/ 16 сентября 2008

Сложность прокрутки заключается в том, что вам может понадобиться не только прокрутить страницу, чтобы показать элемент div, но вам также может понадобиться прокрутить прокручиваемые элементы div на любом количестве уровней.

Свойство scrollTop доступно для любого элемента DOM, включая тело документа. Установив его, вы можете контролировать, как далеко вниз прокручивается что-то. Вы также можете использовать свойства clientHeight и scrollHeight, чтобы увидеть, сколько прокрутки необходимо (прокрутка возможна, когда clientHeight (viewport) меньше scrollHeight (высота содержимого).

Вы также можете использовать свойство offsetTop, чтобы выяснить, где в контейнере расположен элемент.

Чтобы построить действительно универсальную процедуру «прокрутки в поле зрения» с нуля, вам нужно начать с узла, который вы хотите показать, убедиться, что он находится в видимой части своего родителя, затем повторить то же самое для родителя и т. д. до самого верха.

Один шаг этого будет выглядеть примерно так (непроверенный код, не проверяя крайние случаи):

function scrollIntoView(node) {
  var parent = node.parent;
  var parentCHeight = parent.clientHeight;
  var parentSHeight = parent.scrollHeight;
  if (parentSHeight > parentCHeight) {
    var nodeHeight = node.clientHeight;
    var nodeOffset = node.offsetTop;
    var scrollOffset = nodeOffset + (nodeHeight / 2) - (parentCHeight / 2);
    parent.scrollTop = scrollOffset;
  }
  if (parent.parent) {
    scrollIntoView(parent);
  }
}
6 голосов
/ 20 декабря 2016

Это сработало для меня

document.getElementById('divElem').scrollIntoView();
5 голосов
/ 16 сентября 2008

Ответ опубликован здесь - то же решение вашей проблемы.

Редактировать: ответ JQuery очень хорош, если вы хотите плавную прокрутку - я не видел этого в действии.

4 голосов
/ 16 сентября 2008

Необходимое вам свойство location.hash. Например:

location.hash = 'top'; // прыгнул бы к названному якору "top

Я не знаю, как сделать хорошую анимацию прокрутки без использования dojo или какого-либо подобного инструментария, но если вам просто нужно, чтобы перейти на якорь, location.hash должен это сделать.

(протестировано на FF3 и Safari 3.1.2)

4 голосов
/ 16 сентября 2008

Почему не именованный якорь?

3 голосов
/ 19 апреля 2018

Вы можете использовать метод Element.scrollIntoView(), как было упомянуто выше. Если вы оставите его без параметров внутри, у вас будет мгновенный уродливый свиток . Для предотвращения этого вы можете добавить этот параметр - behavior:"smooth".

Пример:

document.getElementById('scroll-here-plz').scrollIntoView({behavior: "smooth", block: "start", inline: "nearest"});

Просто замените scroll-here-plz на div или элемент на веб-сайте. И если вы видите свой элемент в нижней части окна или позиция не соответствует ожидаемой, поиграйте с параметром block: "". Вы можете использовать block: "start", block: "end" или block: "center".

Помните: всегда используйте параметры внутри объекта {}.

Если у вас все еще будут проблемы, перейдите к https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView

Для этого метода имеется подробная документация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...