У меня есть страница, на которой полоса прокрутки, содержащая строки таблицы с div в них, динамически создается из базы данных. Каждая строка таблицы действует как ссылка, вроде того, что вы видите в плейлисте YouTube рядом с видеоплеером.
Когда пользователь посещает страницу, опция, на которой он находится, должна находиться в верхней части прокручиваемого div. Этот функционал работает. Проблема в том, что это заходит слишком далеко. Как и вариант, который они используют, на 10 пикселей больше. Итак, страница посещается, URL-адрес используется для определения того, какой вариант был выбран, а затем прокручивается этот параметр в верхнюю часть прокручиваемого div. Примечание. Это не полоса прокрутки окна, это div с полосой прокрутки.
Я использую этот код, чтобы переместить выбранный параметр в верхнюю часть div:
var pathArray = window.location.pathname.split( '/' );
var el = document.getElementById(pathArray[5]);
el.scrollIntoView(true);
Он перемещает его в верхнюю часть div, но примерно на 10 пикселей выше. Кто-нибудь знает, как это исправить?
источник
scrollIntoView
.Ответы:
Если это около 10 пикселей, я думаю, вы могли бы просто вручную настроить
div
смещение прокрутки содержащего его следующим образом:источник
scrollIntoView
?scrollIntoView
функция DOM не вызывает анимацию. Вы говорите о плагине scrollIntoView jQuery?el.scrollIntoView({ behavior: 'smooth' });
. Однако поддержка невелика!Плавно прокрутите до нужной позиции
Получите правильную
y
координату и используйтеwindow.scrollTo({top: y, behavior: 'smooth'})
источник
jQuery('#el').offset().top
а затем использоватьwindow.scrollTo
scroll={el => { const yCoordinate = el.getBoundingClientRect().top + window.pageYOffset; const yOffset = -80; window.scrollTo({ top: yCoordinate + yOffset, behavior: 'smooth' }); }}
- где смещение составляет 10-15 пикселов больше , чем размер вашего заголовка только для лучшего расстоянияСделать это можно в два этапа:
источник
scrollIntoView()
запуском прокрутка не завершиласьscrollBy()
, последняя прокрутка отменит первую. По крайней мере, в Chrome 71.scrollIntoView({adjustment:y})
, я думаю, это должно быть возможно с помощью специального кода в концеПозиционирование якоря абсолютным методом
Другой способ сделать это - расположить якоря именно там, где вы хотите, на странице, а не полагаться на прокрутку по смещению. Я считаю, что это позволяет лучше контролировать каждый элемент (например, если вам нужно другое смещение для определенных элементов), а также может быть более устойчивым к изменениям / различиям API браузера.
Теперь смещение указано как -100 пикселей относительно элемента. Создайте функцию для создания этой привязки для повторного использования кода, или, если вы используете современную структуру JS, такую как React, сделайте это, создав компонент, который отображает вашу привязку, и передайте имя привязки и выравнивание для каждого элемента, который может или может не быть таким же.
Тогда просто используйте:
Для плавной прокрутки со смещением 100 пикселей.
источник
Я решил эту проблему, используя,
Это заставляет элемент отображаться
center
после прокрутки, поэтому мне не нужно вычислятьyOffset
.Надеюсь, поможет...
источник
scrollTo
не на,element
а наwindow
Это работает для меня в Chrome (с плавной прокруткой и без временных интервалов)
Он просто перемещает элемент, запускает прокрутку, а затем перемещает его назад.
Если элемент уже находится на экране, видимого "выскакивания" не происходит.
источник
Основываясь на предыдущем ответе, я делаю это в проекте Angular5.
Началось с:
Но это дало некоторые проблемы и нужно было установить время для scrollBy () следующим образом:
И он отлично работает в MSIE11 и Chrome 68+. В FF не тестировал. 500 мс были самой короткой задержкой, на которую я бы рискнул. Спуск вниз иногда не удался, поскольку плавная прокрутка еще не завершилась. Отрегулируйте, как требуется для вашего собственного проекта.
+1 к Fred727 за это простое, но эффективное решение.
источник
Предполагая, что вы хотите прокрутить до div, которые находятся на одном уровне в DOM и имеют имя класса «scroll-with-offset», тогда этот CSS решит проблему:
Смещение от верха страницы составляет 100 пикселей. Он будет работать только по назначению с block: 'start':
Что происходит, так это то, что верхняя точка div находится в обычном месте, но их внутреннее содержимое начинается на 100 пикселей ниже нормального местоположения. Вот для чего нужен padding-top: 100px. margin-bottom: -100px - это смещение дополнительного поля нижнего div. Чтобы завершить решение, также добавьте этот CSS для смещения полей / отступов для самого верхнего и самого нижнего div:
источник
Это решение принадлежит @ Arseniy-II , я просто упростил его до функции.
Использование (вы можете открыть консоль прямо здесь, в StackOverflow и протестировать ее):
источник
Вы также можете использовать
element.scrollIntoView()
опциикоторый поддерживает большинство браузеров
источник
У меня есть это, и он отлично работает для меня:
Надеюсь, поможет.
источник
Другое решение - использовать offsetTop, например:
источник
Так что, возможно, это немного неуклюже, но пока все хорошо. Я работаю в angular 9.
файл
.ts
файл
.html
Я регулирую смещение с помощью полей и отступов сверху.
Салудо!
источник
Нашел обходное решение. Скажем, вы хотите прокрутить до div, например, Element, и хотите, чтобы над ним был интервал 20 пикселей. Установите ссылку на созданный над ним div:
<div ref={yourRef} style={{position: 'relative', bottom: 20}}/> <Element />
Это создаст желаемый интервал.
Если у вас есть заголовок, создайте пустой блок div также позади заголовка и назначьте ему высоту, равную высоте заголовка, и укажите на него ссылку.
источник
Моя основная идея - создать tempDiv над представлением, к которому мы хотим прокрутить. Он хорошо работает без запаздывания в моем проекте.
Пример использования
Надеюсь, это поможет
источник
Основываясь на ответе Арсения-II: у меня был вариант использования, в котором объект прокрутки был не самим окном, а внутренним шаблоном (в данном случае div). В этом сценарии нам нужно установить идентификатор для контейнера прокрутки и получить его,
getElementById
чтобы использовать его функцию прокрутки:Оставьте его здесь на случай, если кто-то столкнется с подобной ситуацией!
источник
Вот мои 2 цента.
У меня также была проблема с прокруткой scrollIntoView немного дальше элемента, поэтому я создал сценарий (собственный javascript), который добавляет элемент в место назначения, расположил его немного вверх с помощью css и прокрутил до этого. После прокрутки снова удаляю созданные элементы.
HTML:
Файл Javascript:
CSS:
Надеюсь, это кому-нибудь поможет!
источник
Я добавляю эти советы css для тех, кто не решил эту проблему с помощью решений выше:
источник
UPD: я создал пакет npm, который работает лучше, чем следующее решение, и более прост в использовании.
Моя функция smoothScroll
Я взял замечательное решение Стива Бентона и написал функцию, которая делает его более удобным в использовании. Было бы проще использовать
window.scroll()
или дажеwindow.scrollBy()
, как я пробовал раньше, но у этих двоих есть некоторые проблемы:Вот код
Просто скопируйте это и возитесь с этим, как хотите.
Чтобы создать элемент ссылки, просто добавьте следующий атрибут данных:
Также вы можете установить другой атрибут в качестве дополнения
Он представляет собой
block
вариантscrollIntoView()
функции. По умолчанию этоstart
. Узнать больше о MDN .в заключение
Настройте функцию smoothScroll в соответствии с вашими потребностями.
Например, если у вас есть фиксированный заголовок (или я называю его словом
masthead
), вы можете сделать что-то вроде этого:Если у вас нет такого дела, то просто удалите его, почему бы и нет :-D.
источник
Простое решение для прокрутки определенного элемента вниз
источник
Для элемента в строке таблицы используйте JQuery, чтобы получить строку над той, которую вы хотите , и вместо этого просто прокрутите до этой строки.
Предположим, у меня есть несколько строк в таблице, некоторые из которых должны быть просмотрены администратором. В каждой строке, требующей проверки, есть стрелки вверх и вниз, чтобы перейти к предыдущему или следующему элементу для просмотра.
Вот полный пример, который нужно запустить, если вы создадите новый HTML-документ в блокноте и сохраните его. Есть дополнительный код для определения верхней и нижней части наших элементов для проверки, поэтому мы не выдаем никаких ошибок.
источник