浏览器的一些“滚动”行为鉴赏

sw

分类

按照我的个人理解,滚动分全局滚动(浏览器窗口)跟局部滚动(自定义的盒子),以下内容绝大部分都是指全局滚动,局部滚动的话获取指定的DOM再调用相应的API即可✅

如何设置全局滚动条高度

最常用的方法:

(0,0);//({left:0,top:100});复制代码

也可以利用相对滚动设置:

(0,0);//({left:0,top:100});复制代码

或者利用scrollTop设置:

=100;复制代码

注意:scrollTo跟scrollBy的参数是一样的,区别就是scrollBy滚动距离是相对与当前滚动条位置进行滚动✅

效果对比如下:

很明显,前者就是把滚动高度设置成100,而后者是每次都增加100,这就是为什么称之为相对滚动了✅

如何指定一个元素显示在视窗

最常用的方法:

效果如下:

或者用锚点:

效果如下:

或者利用scrollIntoView进行展现:

(".box").scrollIntoView();复制代码

效果如下:

还可以指定元素的出现位置:

效果如下:

如何设置滚动具有平滑的过渡效果

利用每个方法的参数设置:

({behavior:"smooth"});({behavior:"smooth"});(".box").scrollIntoView({behavior:"smooth"});复制代码

效果如下:

或者用css属性设置:

html{scroll-behavior:smooth;//全局滚动具有平滑效果}//或者所有*{scroll-behavior:smooth;}复制代码

效果如下:

注意:设置了该属性之后,所有方法都可以不用设置behavior参数了,二选一即可,因为都是控制当前指定元素的滚动行为,所以锚点跳转、设置scrollTop也具有平滑(smooth)的滚动行为✅

一些有趣的东西

1.scrollingElement

该对象可以非常兼容地获取scrollTop、scrollHeight等属性,在移动端跟PC端都屡试不爽

还记得当初写这个兼容性方法:

letscrollHeight=||;复制代码

现在你只需要:

letscrollHeight=;复制代码

因为在MDN中是这样介绍它的:

标准模式返回documentElement,怪异模式返回body;

2.滚动到底部

({left:0,top:});//如果你实在是懒的话(0,999999);复制代码

3.判断浏览器已滚动到底部

("scroll",()={let{scrollTop,scrollHeight,clientHeight}=;//当前滚动高度+视口高度=文档总高度if(scrollTop+clientHeight=scrollHeight){("已到达底部");}});复制代码

效果如下:

函数节流

当你没加函数节流:

("scroll",()=("我在滚我在滚!"));复制代码

效果如下:

当你加了函数节流之后:

("scroll",throttle(()=("我在滚我在滚!")));复制代码

效果如下:

throttle源码:

functionthrottle(fn,interval=500){letrun=true;returnfunction(){if(!run)return;run=false;setTimeout(()={(this,arguments);run=true;},interval);};}复制代码

用处:减少代码执行频率✅

函数防抖

当你加了函数防抖之后:

("scroll",debounce(()=("滚动结束!")));复制代码

效果如下:

debounce源码:

functiondebounce(fn,interval=500){lettimeout=null;returnfunction(){clearTimeout(timeout);timeout=setTimeout(()={(this,arguments);},interval);};}复制代码

用处:判断某个动作结束,如刚刚的滚动结束、input输入结束等✅

解决IOS设备局部滚动不顺畅(粘手)

除了浏览器原生滚动,自定义的滚动条都会出现这种情况,加以下属性就可以解决:

.box{-webkit-overflow-scrolling:touch;}复制代码

对比如下:

注意:要真机才能看到效果,这里指的局部滚动是指自己定义的盒子,然后设置overflow:auto||scroll;后的滚动行为;

滚动传播

指有多个滚动区域,当一个滚动区域滚动完之后,继续滚动会传播到到父区域继续滚动的行为:

.box{overscroll-behavior:contain;//阻止滚动传播}复制代码

对比效果图如下:

横向滚动

移动端遇到此需求比较多,常用于图片展示:

ulliimgsrc=""/li///ulul{white-space:nowrap;//超出不换行overflow-x:auto;li{display:inline-block;img{display:block;width:200px;}}}复制代码

效果如下:

滚动结束后,强制滚动到指定元素

基于上面的例子,我们设置如下属性:

ul{scroll-snap-type:xmandatory;li{scroll-snap-align:start;}}复制代码

效果如下:

也可以设置出现在中间:

li{scroll-snap-align:center;}复制代码

效果如下:

这样,一个简易的轮播图效果就出来啦!

还可以实现全屏滚动:

注意:该属性会在你滚动完之后再做处理,也就是说你可以一下子从图片1跳到图片9✅

最后

以上涉及到的方法或属性文档如下:

scrollTo

scrollBy

scrollIntoView

scrollingElement

scroll-behavior

-webkit-overflow-scrolling

overscroll-behavior

scroll-snap-type

scroll-snap-align

文章版权声明:除非注明,否则均为慢乐懂生活原创文章,转载或复制请以超链接形式并注明出处。

上一篇:九江在哪个省

下一篇:七画的字有哪些