В последнее время я был очень занят, на этот раз я нашел время, чтобы написать陶冶下情操
,浏览器滚动
Я действительно вижу вас каждый день. Например, эту статью, которую вы сейчас читаете, вам нужно прокрутить вниз, чтобы прочитать ее. В этой статье в основном говорится о滚动相关
Некоторые из方法
и属性
, и несколько интересных примеров 🎈 статья посвящена方法或属性
В конце статьи будет ссылка, по которой каждый сможет ознакомиться сам!
Классификация
По моему личному пониманию, точки прокатки全局滚动(浏览器窗口)
и局部滚动(自定义的盒子)
, большая часть следующего относится к全局滚动
,局部滚动
получить指定的DOM
позвони снова相应的API
Вот и все ✅
Как установить глобальную высоту полосы прокрутки
- Самый распространенный метод:
window.scrollTo(0, 0);
// or
window.scrollTo({
left: 0,
top: 100
});
- также доступны
相对滚动
настраивать:
window.scrollBy(0, 0);
// or
window.scrollBy({
left: 0,
top: 100
});
- или использовать
scrollTop
настраивать:
document.scrollingElement.scrollTop = 100;
Уведомление:scrollTo
иscrollBy
Параметры одинаковые, разница естьscrollBy
Расстояние прокрутки зависит от текущего положения полосы прокрутки для прокрутки ✅
Сравнение эффектов выглядит следующим образом:
Это понятно,前者
заключается в том, чтобы установить высоту прокрутки на100
,и后者
увеличивается с каждым разом100
, потому и называется相对滚动
✅
Как указать элемент для отображения в окне просмотра
- Самый распространенный метод:
// 获取元素的offsetTop(元素距离文档顶部的距离)
let offsetTop = document.querySelector(".box").offsetTop;
// 设置滚动条的高度
window.scrollTo(0, offsetTop);
Эффект следующий:
- или с якорями:
<a href="#box">盒子出现在顶部</a>
<div id="box"></div>
Эффект следующий:
- или использовать
scrollIntoView
Показывать:
document.querySelector(".box").scrollIntoView();
Эффект следующий:
Вы также можете указать, где появится элемент:
// start出现在视口顶部、center出现在视口中央、end出现在视口底部
document.querySelector(".box").scrollIntoView({
block: "start" || "center" || "end"
});
Эффект следующий:
Как настроить прокрутку с эффектами плавного перехода
- используя каждый метод
参数
настраивать:
window.scrollTo({
behavior: "smooth"
});
window.scrollBy({
behavior: "smooth"
});
document.querySelector(".box").scrollIntoView({
behavior: "smooth"
});
Эффект следующий:
- или использовать
css
Настройки свойства:
html {
scroll-behavior: smooth; // 全局滚动具有平滑效果
}
// 或者所有
* {
scroll-behavior: smooth;
}
Эффект следующий:
Примечание. После установки этого свойства все методы можно задать без установкиbehavior
параметры, вы можете выбрать один из двух, потому что оба控制当前指定元素的滚动行为
, так якорь прыгать, ставитьscrollTop
тоже гладкая(smooth
)из滚动行为
✅
что-то интересное
1. scrollingElement
Объект может быть очень兼容
приобрестиscrollTop
,scrollHeight
и другие свойства, в移动端
иPC端
Проверено и проверено 🤞
Помните, когда я писал этот метод совместимости:
let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
Теперь вам просто нужно:
let scrollHeight = document.scrollingElement.scrollHeight;
Так какMDN
Он описывается таким образом:
Стандартный режим возвращаетсяdocumentElement
, режим причуд возвращаетсяbody
;
2. Прокрутите вниз
window.scrollTo({
left: 0,
top: document.scrollingElement.scrollHeight
});
// 如果你实在是懒的话...
window.scrollTo(0, 999999);
Примечание. Плавная прокрутка до顶部
или底部
Вы можете сами добавить параметры или атрибуты ✅
3. Определите, прокрутил ли браузер вниз
window.addEventListener("scroll", () => {
let {
scrollTop,
scrollHeight,
clientHeight
} = document.scrollingElement;
// 当前滚动高度 + 视口高度 >= 文档总高度
if (scrollTop + clientHeight >= scrollHeight) {
console.log("已到达底部");
}
});
Эффект следующий:
регулирование функции
Когда вы не добавляете регулирование функции:
window.addEventListener("scroll", () => console.log("我在滚我在滚!"));
Эффект следующий:
После добавления функции дросселирования:
window.addEventListener("scroll", throttle(() => console.log("我在滚我在滚!")));
Эффект следующий:
throttle
Исходный код:
function throttle(fn, interval = 500) {
let run = true;
return function () {
if (!run) return;
run = false;
setTimeout(() => {
fn.apply(this, arguments);
run = true;
}, interval);
};
}
Полезно: уменьшите частоту выполнения кода ✅
Функция защиты от тряски
При добавлении функции анти-встряски:
window.addEventListener("scroll", debounce(() => console.log("滚动结束!")));
Эффект следующий:
debounce
Исходный код:
function debounce(fn, interval = 500) {
let timeout = null;
return function () {
clearTimeout(timeout);
timeout = setTimeout(() => {
fn.apply(this, arguments);
}, interval);
};
}
Использование: судить о动作结束
, например, конец прокрутки только что, конец ввода ввода и т. д. ✅
Решите проблему, что частичная прокрутка устройств IOS не плавная (липкие руки)
Помимо встроенной прокрутки в браузере,自定义的滚动条
Эта ситуация будет иметь место, и для ее решения можно добавить следующие свойства:
.box {
-webkit-overflow-scrolling: touch;
}
Сравнение выглядит следующим образом:
Примечание. Вам нужна настоящая машина, чтобы увидеть эффект, здесь имеется в виду局部滚动
Относится к自己定义的盒子
, затем установитеoverflow: auto || scroll;
поведение прокрутки после;
скользящий спред
означает несколько滚动区域
, когда滚动区域
После прокрутки продолжить прокрутку будет传播到
Поведение для продолжения прокрутки к родительской области:
.box {
overscroll-behavior: contain; // 阻止滚动传播
}
График сравнительного эффекта выглядит следующим образом:
Горизонтальная прокрутка
移动端
Для этого есть много потребностей, и это часто используется для отображения изображений:
<ul>
<li>
<img src="">
</li>
// ...
</ul>
ul {
white-space: nowrap; // 超出不换行
overflow-x: auto;
li {
display: inline-block;
img {
display: block;
width: 200px;
}
}
}
Эффект следующий:
После прокрутки принудительно прокрутите до указанного элемента
На основе приведенного выше примера мы устанавливаем следующие свойства:
ul {
scroll-snap-type: x mandatory;
li {
scroll-snap-align: start;
}
}
Эффект следующий:
Если вы посмотрите внимательно, вы обнаружите, что когда мы отпускаем, мы最近的元素
Прокрутите вправо (исходное положение, вверху для оси Y, справа для оси X)
Его также можно настроить так, чтобы он отображался посередине:
li {
scroll-snap-align: center;
}
Эффект следующий:
Таким образом, простой轮播图
Эффект есть!
Также возможна полноэкранная прокрутка:
Примечание: это свойство будет в вашем滚动完
сделать обработку позже, а значит можно图片1
прыгать, чтобы图片9
✅
Наконец
упомянутый выше方法或属性
Документация выглядит следующим образом:
- scrollTo
- scrollBy
- scrollIntoView
- scrollingElement
- scroll-behavior
- -webkit-overflow-scrolling
- overscroll-behavior
- scroll-snap-type
- scroll-snap-align
Если вы считаете, что эта статья хороша, пожалуйста, не забудьте нажать赞
и关注
О~😊