С конца прошлого года браузер начал поддерживать собственное позиционирование с плавной прокруткой браузера, CSSscroll-behavior
Свойства и JSscrollIntoView()
любой метод.
1. CSS прокрутка и плавная прокрутка
scroll-behavior:smooth
Написано на элементе контейнера прокрутки, чтобы сгладить прокрутку контейнера (не вызывается жестами мыши).
Сначала рассмотрим реальный случай.
8 лет назад"Реализация эффекта переключения поворота табуляции с помощью чистого CSS без JavaScript«В этом посте рассказывается о методе реализации переключения вкладок (по сути, запускающего прокрутку полосы прокрутки) с использованием позиционирования привязки в чистом CSS.
Это может быть трудно щелкнуть здесь:Демонстрация эффекта переключения без JavaScript
См. следующий скриншот GIF для эффекта после реализации:
Основные функции могут быть удовлетворены, но есть две проблемы: во-первых, изменение местоположения, реализованное с помощью хэша местоположения, вызовет собственное поведение прокрутки браузера, и это не очень хорошо;
Итак, позже я изобрел чистый эффект переключения вкладок CSS, основанный на том, что фокус элемента управления вызывает изменение положения прокрутки.Это упоминается в главе о переполнении книги «Мир CSS», вы можете нажать здесь:демонстрация позиционирования привязки фокуса и переключения вкладок переполнения
Это также чистая реализация CSS без кода JavaScript по сравнению с прямым использованием.<a>
элементальhref
Метод прыжка привязки, этот метод не будет запускать прокрутку внешней формы браузера, и опыт будет улучшен до более высокого уровня, но все еще есть проблема, то есть когда содержимое вкладки переключается, это по-прежнему "пиф-паф". Эффект Бабы не имеет мокрого эффекта скольжения.
Не волнуйтесь, сейчас с поведением прокрутки CSS, проблема гладкой прокрутки также может быть решена. Вы можете нажать здесь:Демонстрация плавной прокрутки вкладки CSS scroll-behavior
По сравнению с предыдущей сухой реализацией есть такое предложение CSS——scroll-behavior:smooth
:
.box {
scroll-behavior: smooth;
overflow: hidden;
}
В результате появился интерактивный эффект, похожий на весенний ветерок, ударивший в лицо, см. следующий эффект скриншота видео (статья Nuggets не поддерживает встроенное видео, вы можете перейти кПосмотреть исходный текст), Или статический вид мозга тоника:
Более простое и практичное использование
фактическиscroll-behavior
Цветочных головок в его употреблении не так много, вы просто запомните эту фразу -
Просто добавьте scroll-behavior:smooth везде, где вам нужно прокручивать!
Вам все равно, может он им пользоваться или нет, и вам не важна совместимость с браузером, вы его добавляете. Это как бесплатная лотерея без денег.Если не выиграешь-не беда,и терять нечего.Если выиграешь-хорошо,вишенка на торте!scroll-behavior:smooth
Это моча.
Например, в браузерах для ПК прокрутка веб-страниц по умолчанию составляет<html>
На этикетке большинство мобильных терминалов в<body>
На этикетке я добавил это предложение:
html, body { scroll-behavior:smooth; }
На этом этапе нажатие на ссылку «наверх», показанную в приведенном ниже коде, приведет к плавной прокрутке вверх.
<a href="#">返回顶部</a>
С этой точки зрения сброс CSS отраслевых браузеров может добавить такое правило:
html, body { scroll-behavior:smooth; }
2. JS scrollIntoView и плавная прокрутка
элемент DOMscrollIntoView()
Метод представляет собой нативный API JS, который также поддерживается браузерами IE6, который позволяет элементам вводить в просмотр экрана, вызвав позиционирование контейнера прокрутки.
С Chrome и Firefox браузеры стали поддерживать CSSscroll-behavior
свойства, кстатиscrollIntoView()
Метод был обновлен для поддержки большего количества параметров, одним из которых является плавная прокрутка.
Синтаксис следующий:
target.scrollIntoView({
behavior: "smooth"
});
Открываем случайным образом связанную страницу, прокручиваем первую ссылку за пределы экрана, а затем вводим в консоль следующий код, мы видим, что страница прокручивается плавно и позиционируется:
document.links[0].scrollIntoView({
behavior: "smooth"
});
Скриншот видео ниже:
разное:
-
scrollIntoView()
Модернизированный метод, в дополнение к поддержке'behavior'
,а также'block'
а также'inline'
и другие параметры, если вы заинтересованы, вы можете обратиться кДокументы, связанные с MDN. - Если наша веб-страница настроена с помощью CSS
scroll-behavior:smooth
оператор, мы непосредственно выполняемtarget.scrollIntoView()
метод будет иметь плавную прокрутку, никаких дополнительных настроек не требуетсяbehavior
параметр. Например, если вы просматриваете эту статью на оригинальном сайте Xin Space, открываете консоль и выполняете следующий код, вы можете увидеть эффект плавной прокрутки:document.forms[0].scrollIntoView();
3. Плавная прокрутка JS обратно совместима
JS добиться плавной прокрутки не сложно, в jQueryanimate()
метод:
scrollContainer.animate({
scrollTop: 0
});
или использоватьrequestAnimationFrame APIЭтот тип собственного JS также может быть реализован. Например, вот метод, который я набросал:
/**
@description 页面垂直平滑滚动到指定滚动高度
@author zhangxinxu(.com)
*/
var scrollSmoothTo = function (position) {
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function(callback, element) {
return setTimeout(callback, 17);
};
}
// 当前滚动高度
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
// 滚动step方法
var step = function () {
// 距离目标滚动距离
var distance = position - scrollTop;
// 目标滚动位置
scrollTop = scrollTop + distance / 5;
if (Math.abs(distance) < 1) {
window.scrollTo(0, position);
} else {
window.scrollTo(0, scrollTop);
requestAnimationFrame(step);
}
};
step();
};
ИспользоватьМой собственный JS-алгоритм анимации замедления, прокручивайте быстрее, затем медленнее.
Используйте, например, следующее: мы хотим, чтобы веб-страница плавно прокручивалась вверх напрямую:
scrollSmoothTo(0);
Вот и все.
Сложность заключается в том, как поддерживать нативную браузерную обработку плавной прокрутки, а браузеры, которые ее не поддерживают, по-прежнему используют для ее обработки старый метод JS. Например, IE и Safari еще не поддерживают встроенную плавную прокрутку.
Нужно рассматривать отдельно, JS мой процесс суждения выглядит следующим образом:
if (typeof window.getComputedStyle(document.body).scrollBehavior == 'undefined') {
// 传统的JS平滑滚动处理代码...
}
Это обеспечивает бесшовное соединение.
(Конец этой статьи)