Scroll
- Dom元素滚动时触发的Scroll事件
- 事件对象:window, Dom元素
- 事件捕捉:元素滚动条滚动时
滚动原理(滚动发生了什么?)
- 页面重排: 页面重新生成布局,重排必定引起重绘
- 页面重绘: 页面重新绘制,不一定重排
事件方法
方法名 |
说明 |
onScroll |
滚动对象内部内容区域的滚动事件 |
onwheel |
鼠标滚轮滚动触发事件(主要和onScroll 做区别) |
scroll(x, y) 或 scroll(options) |
元素滚动到特定的坐标 |
scrollBy(x, y) 或 scrollBy(options) |
元素滚动一段特定的距离 x,y : 坐标 options: {x:0, y:2, behavior: 'smooth'} |
scrollTo(x, y) 或 scroll(options) |
元素滚动到特定的坐标 |
属性
名称 |
说明 |
编辑性质 |
scrollLeft |
滚动条到元素左边的距离 |
可读写 element.scrollLeft = 12px |
scrollTop |
滚动条到元素顶部的距离 |
可读写 element.scrollTop = 12px |
scrollRight |
滚动条到元素右边的距离 |
可读写 element.scrollRight = 12px |
常用滚动事件
- 滚动条触底
if(target.scrollTop + target.offsetHeight > target.scrollHeight){
//滚动条已触底
}
- 到顶
if(target.scrollTop === 0){
//滚动条到顶
}
- 及左
if(target.scrollLeft === 0){
//横向滚动条到左部
}
- 及右
if(target.scrollLeft === target.offsetWidth > target.scrollWidth){
//横向滚动条到右部
}
- 滚动方向
/*
scrollTopPre < scrollTop = 'down'
scrollTopPre > scrollTop = 'up'
*/
let scrollTopPre = 0;
function onScroll(e){
const {target: {scrollTop}} = e
if( scrollTopPre < scrollTop){ console.log('down')}
if( scrollTopPre > scrollTop){ console.log('up')}
...
// end
scrollTopPre = scrollTop
}
注意事项及性能优化
- 防抖
a. 可以用 lodash 的 debounce 方法 `debounce(onScroll, 200, {})`
b. 也可自造轮子
- 节流
a. 可以用 lodash 的 throttle 方法 `throttle(onScroll, 200, {})`
b. 也可自造轮子
-
使用 window.requestAnimationFrame
将浏览器读写操作分离, 把写操作放到下一次重新渲染
// 参考阮一峰
window.addEventListener('scroll', (e)=>{
window.requestAnimationFrame((timestamp)=>{
// timestamp 一个 long 整数,请求 ID ,是回调列表中唯一的标识。是个非零值,没别的意义。你可以传这个值给 window.cancelAnimationFrame() 以取消回调函数。
onScroll(e)
})
})
滚动条相关
- 滚动条组成
属性 |
说明 |
::-webkit-scrollbar |
滚动对象内部内容区域的滚动事件 |
::-webkit-scrollbar-button |
滚动条两端的按钮 |
::-webkit-scrollbar-thumb |
滚动条 |
::-webkit-scrollbar-track |
滚动条滚动轨道 |
::-webkit-scrollbar-track-piece |
滚动条未及的滚动轨道 |
::-webkit-scrollbar-corner |
横向与竖向滚动交叉的边角 |
::-webkit-resizer |
右下角拖动块儿 |
- 样式设置示例
::-webkit-scrollbar {
width: 10px;
height: 10px;
}