JavaScript для прокрутки длинной страницы до DIV

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

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
106
0
172 853
16

Ответы 16

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

Хех ... я начал публиковать решение для JavaScript, а затем прочитал ваше ... и дал себе пощечину. Хорошая работа! :-)

Shog9 16.09.2008 04:21

<a href = "#myAnchorALongWayDownThePage">Click here to scroll</a>

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

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

Вопрос просил javascript выполнить то же самое.

Scott Swezey 16.09.2008 04:21

Проверьте ответ Питера Боутона в stackoverflow.com/questions/66964 - присвоение div идентификатору вместо использования именованных якорей работает так же, но имеет гораздо лучшее семантическое значение и требует меньше разметки.

nickf 16.09.2008 04:21

как указал Скотт ниже: document.location.hash = "myAnchor";

Aaron Watters 23.10.2009 22:56

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

Обновлено: ответ JQuery очень хорош, если вам нужна плавная прокрутка - я раньше не видел этого в действии.

Как насчет JQuery ScrollTo - см. Этот пример кода

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

George Mauer 23.02.2010 19:59

@BjornTipling - если он хотел увидеть здесь JavaScript, это demos.flesler.com/jquery/scrollTo/js/jquery.scrollTo-min.js

Norman H 10.08.2012 19:20

Вам нужно свойство location.hash. Например:

. location.hash = 'вверху'; // перейдет к названной якорной "вершине"

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

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

Отличное простое решение ... также работает с IE6 и IE8 (не тестировалось с IE7)

ckarras 07.12.2009 22:54

Это, безусловно, лучший ответ; это просто, надежно и не требует библиотеки. +1

user1720624 13.01.2014 20:59

scrollTop (IIRC) - это место, где в документе прокручивается верхняя часть страницы. scrollTo прокручивает страницу так, чтобы верхняя часть страницы находилась там, где вы указываете.

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

Это должно указать вам правильное направление.

Дополнительно: извините, я подумал, что вы хотите, чтобы откуда-то «выскочил» отдельный div (вроде того, что иногда делает этот сайт), а не перемещать всю страницу в раздел. Этого эффекта можно добиться при правильном использовании анкеров.

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

Свойство scrollTop доступно для любого элемента DOM, включая тело документа. Установив его, вы можете контролировать, насколько далеко что-то прокручивается. Вы также можете использовать свойства clientHeight и scrollHeight, чтобы узнать, сколько требуется прокрутки (прокрутка возможна, когда clientHeight (область просмотра) меньше 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);
  }
}

Если вы не хотите добавлять дополнительное расширение, следующий код должен работать с 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;
        }
    });

Поправьте меня, если я ошибаюсь, но я читаю вопрос снова и снова и все еще думаю, что Ангус МакКотеуп спрашивал, как установить элемент в положение position: fixed.

Angus McCoteup, посмотрите http://www.cssplay.co.uk/layouts/fixed.html - если вы хотите, чтобы ваш DIV вел себя как меню, посмотрите там CSS

Существует плагин jQuery для общего случая прокрутки к элементу DOM, но если производительность является проблемой (а когда это не так?), Я бы предложил сделать это вручную. Это включает в себя два этапа:

  1. Определение позиции элемента, к которому вы прокручиваете.
  2. Прокрутка до этой позиции.

quirksmode дает хорошее объяснение механизма, лежащего в основе первого. Вот мое предпочтительное решение:

function absoluteOffset(elem) {
    return elem.offsetParent && elem.offsetTop + absoluteOffset(elem.offsetParent);
}

Он использует приведение от нуля к нулю, что в некоторых кругах не соответствует этикету, но мне это нравится :) Во второй части используется window.scroll. Итак, остальная часть решения:

function scrollToElement(elem) {
    window.scroll(absoluteOffset(elem));
}

Вуаля!

вы забыли установить первый параметр - window.scroll (0, absoluteOffset (elem));

Richard 11.11.2012 10:08

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

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

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

Совсем не плавная прокрутка (по крайней мере, в Firefox), но она работает с одной строкой кода, без сторонних материалов. Отлично.

MatrixFrog 13.08.2010 01:57

Проблема со встроенной прокруткой в ​​представление заключается в том, что при просмотре длинной страницы пользователь может потеряться, когда вы прокручиваете страницу. Я написал анимированную версию этой функции, которая прокручивает контейнер только когда необходимо и выполняет этот с анимацией, чтобы пользователь мог увидеть, что произошло. Впоследствии он также может запускать полную функцию. Он похож на плагин jQuery scrollTo за исключением того, что вам не нужно предоставлять прокручиваемого предка. Он ищет это автоматически.

Robert Koritnik 02.05.2011 19:37

@ Роберт, звучит фантастически. Можете ли вы предоставить ссылку или, возможно, дать ответ, содержащий код?

Kirk Woll 30.05.2011 00:05

Простота этого потрясающая.

MeanMatt 29.08.2012 09:02

Не так хорошо работает в Chrome для Android при горизонтальной прокрутке. :)

Andres Riofrio 13.12.2012 12:39

Привет, футта, я действительно хочу использовать встроенную функцию, так как она будет поддерживаться всеми браузерами. Но в моем случае у div нет идентификатора, так как вы это делаете? (Можно ли делать это только с помощью встроенных функций?) Заранее спасибо!

Franva 06.02.2014 16:32

@Franva Вам нужен способ ссылки на элемент. Вы не можете прокрутить до элемента, если браузер не знает, к какому элементу вы хотите прокрутить!

Cruncher 13.05.2014 00:56

Полезный. Спасибо за это.

kaoscify 07.08.2015 20:00

ссылка caniuse.com, показывающая проблемы совместимости: caniuse.com/#feat=scrollintoview

Lukas Liesis 23.04.2017 01:06

Для людей, которым нужна анимация или плавная прокрутка: document.getElementById('#something').scrollIntoView({ behavior: 'smooth', block: 'center' });

Khalil Laleh 20.11.2018 12:33

Я лично нашел ответ Джоша на основе jQuery выше лучшим, что я видел, и отлично работал для моего приложения ... конечно, я был уже, использующим jQuery ... Я бы точно не стал включать всю библиотеку jQ только для этого одна цель.

Ваше здоровье!

Обновлено: ОК ... всего через несколько секунд после публикации я увидел еще один ответ, просто мой ниже (не уверен, что все еще ниже меня после редактирования), в котором говорилось, что нужно использовать:

document.getElementById ('ваш_элемент_ID_here'). scrollIntoView ();

Это работает отлично и с гораздо меньшим количеством кода, чем версия jQuery! Я понятия не имел, что в JS есть встроенная функция под названием .scrollIntoView (), но она есть! Итак, если вам нужна нарядная анимация, перейдите на jQuery. Быстро и грязно ... используйте это!

Для плавной прокрутки полезен этот код

$('a[href*=#scrollToDivId]').click(function() {
    if (location.pathname.replace(/^//,'') == this.pathname.replace(/^//,'') && location.hostname == this.hostname) {
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      var head_height = $('.header').outerHeight(); // if page has any sticky header get the header height else use 0 here
      if (target.length) {
        $('html,body').animate({
          scrollTop: target.offset().top - head_height
        }, 1000);
        return false;
      }
    }
  });

Я не могу добавить комментарий к ответу Futtta выше, но для более плавного использования прокрутки:

onClick = "document.getElementById('more').scrollIntoView({block: 'start', behavior: 'smooth'});"

Прекрасно работает в Chrome. Спасибо!

Al Belmondo 04.01.2019 18:33

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

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

Вы можете использовать метод 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

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

Другие вопросы по теме