提升移动端体验,让你的页面平滑滚动!

2,418 阅读2分钟

当用户在移动端触发页面滚动行为时,你一般想到的用哪些方式, 来提升用户体验?

如果在早期使用JQuery时 ,那么你可以调用$.animate() 方法,使用如下:

$("#scroll_container").animate({
    scrollTop: "0px"
}, 500);

// 持续500毫秒,滚动至顶部

当然最原始直接的方式是在网页中使用锚点定位。

<a href="#">返回顶部</a>

当我们点击这个链接的时候,页面会马上定位到顶部,不过这样纯粹的效果,没有任何交互,是不是太简单了。。。

当然浏览器也提供了一些新的属性和方法,

第一个是 css 属性: scroll-behavior

在MDN上的解释为:

当用户手动导航或者 CSSOM scrolling API 触发滚动操作时,CSS 属性 scroll-behavior 为一个滚动框指定滚动行为,其他任何的滚动,例如那些由于用户行为而产生的滚动,不受这个属性的影响。在根元素中指定这个属性时,它反而适用于视窗。

常用的有两个属性:

scroll-behavior: auto; // 默认值
scroll-behavior: smooth; // 平滑效果

用法: 将scroll-behavior:smooth 写在滚动容器元素上,用户触发某个事件时,会有一个平滑滚动的效果。

Demo:

css代码:
.label {
    width: 100px;
    margin-right: -1px;
    border: 1px solid #ccc; border-bottom: 0;
    padding-top: 5px; padding-bottom: 5px;
    background-color: #eee;
    text-align: center;
    float: left;
}
.box { 
    height: 200px; 
    border: 1px solid #ccc; 
    scroll-behavior: smooth; 
    overflow: hidden; 
}
.content { 
    height: 100%; 
    padding: 0 20px; 
    position: relative; 
    overflow: hidden;
}
.box input { 
    position: absolute; top:0; 
    height: 100%; width: 1px;
    border:0; padding: 0; margin: 0;
    clip: rect(0 0 0 0);
}


html 代码:

<div class="tab">
    <label class="label" for="tab1">选项卡1</label>
    <label class="label" for="tab2">选项卡2</label>
    <label class="label" for="tab3">选项卡3</label>
</div>
<div class="box">
    <div class="content"><input id="tab1">
        <p>我是选项卡1的内容</p>
    </div>
    <div class="content"><input id="tab2">
        <p>我是选项卡2的内容</p>
    </div>
    <div class="content"><input id="tab3">
        <p>我是选项卡3的内容</p>
    </div>
</div>

所以。 添加一行代码,就可以实现滚动效果,是不是很酷??

第二个是 DOM元素的scrollIntoView() 方法

也是浏览器支持的原生jsAPI, 该方法会滚动元素的父容器,

语法:

element.scrollIntoView(); // 等同于element.scrollIntoView(true)

element.scrollIntoView(alignToTop); // Boolean型参数

element.scrollIntoView(scrollIntoViewOptions); // Object型参数

使用如下:

targetElement.scrollIntoView({
    behavior: "smooth",
    block: "end",
    inline: "nearest"
});

也可以只传一个参数(options),也可以不传, 更多用法,请参考 MDN

兼容性:

scroll-behavior:

scrollIntoView:

如果有更好的方法,欢迎大家留言,第一时间看到会及时回复。 感谢!