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; }