详解三种方式实现平滑滚动页面到顶部的功能


Posted in HTML / CSS onApril 23, 2019

背景

最近开发公司的公众号H5,做了一个点击icon滚动到顶部的功能。实现功能比较简单,直接调用window.scrollTo(0, 0),一行代码完成。但是作为一个攻城狮,怎么可能对自己要求这么低,所以我给自己加了个需求,实现 平滑滚动页面到顶部 的功能。经过调研和查看文档,有了以下三种方案。

1.使用CSS

完成功能的最高境界,只用CSS就搞定。代码如下:

html {
    scroll-behavior: smooth;
}

该样式的作用是为有滚动条的元素指定一个滚动的行为,但是只有在当用户手动导航或者 CSSOM scrolling API触发滚动的时候生效,不影响用户行为产生的滚动。就在我庆祝的时候,打开can i use看了下兼容性:

详解三种方式实现平滑滚动页面到顶部的功能

日了狗,还是老老实实用JS实现吧。

2.使用Window.scrollTo API

我们都知道window.scrollTo(x, y),通过传入文档中的x,y轴坐标来实现滚动到页面某个位置的功能。这个API其实还可以传入一个option,是一个对象,left值对应坐标中的x,top对应坐标中的y,还有一个值为behavior,可以让你自定义滚动行为,然后我们这样来实现滚动到顶部:

window.scrollTo({
    left: 0,
    top: 0,
    behavior: 'smooth'
})

真香,搞定。过了几天,产品经理扛着5米大刀来找我,说在Safari上滚动效果奇怪,体检极差。于是我默默打开了MDN文档,滚动到底部:

详解三种方式实现平滑滚动页面到顶部的功能

看到了这张图,虽然API浏览器都几乎支持,但是option选项在Safari上直接挂掉,于是我又打开了stackoverflow,总结了终极方案。

3.使用requestAnimationFrame

经常能看到大名鼎鼎的requestAnimationFrame,但是没机会用上,这次可以尝尝鲜了。我们知道requestAnimationFrame的作用就是告诉浏览器在下次重绘之前执行传入的回调函数,这个行为是浏览器自动帮你做的。于是有了如下代码:

const scrollToTop = () => {
    let scrollTop = document.documentElement.scrollTo || document.body.scrollTop
    if (scrollTop > 0) {
        window.requestAnimationFrame(scrollTop)
        window.scrollTop(0, scrollTop - scrollTo / 8)
    }
}

Done!!!Perfect!!!雀跃的同时,我还是打开了can i use查看了requestAnimationFrame的兼容性:

详解三种方式实现平滑滚动页面到顶部的功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
纯css3实现效果超级炫的checkbox复选框和radio单选框
Sep 01 HTML / CSS
CSS3的常见transformation图形变化用法小结
May 13 HTML / CSS
CSS3中引入多种自定义字体font-face
Jun 12 HTML / CSS
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
Dec 22 HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
Aug 22 HTML / CSS
html Table 表头固定的实现
Jan 22 HTML / CSS
HTML5 File API改善网页上传功能
Aug 19 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
Aug 02 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
Sep 20 HTML / CSS
可能这些是你想要的H5软键盘兼容方案(小结)
Apr 23 HTML / CSS
canvas小画板之平滑曲线的实现
Aug 12 HTML / CSS
html+css实现分层金字塔的实例
Jun 02 HTML / CSS
小程序canvas中文字设置居中锚点
Apr 16 #HTML / CSS
用canvas做一个DVD待机动画的实现代码
Apr 12 #HTML / CSS
Html5适配iphoneX刘海屏的简单实现
Apr 09 #HTML / CSS
html5唤醒APP小记
Mar 27 #HTML / CSS
html5录音功能实战示例
Mar 25 #HTML / CSS
浅析HTML5中的download属性使用
Mar 13 #HTML / CSS
手把手教你实现一个canvas智绘画板的方法
Mar 04 #HTML / CSS
You might like
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
MooTools 1.2介绍
2009/09/14 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
详解javascript中的Error对象
2019/04/25 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
python Django 创建应用过程图示详解
2019/07/29 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
学习全国两会精神心得体会范文
2014/03/17 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
门卫岗位职责
2015/02/09 职场文书
销售会议开幕词
2016/03/04 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
浅析NIO系列之TCP
2021/06/15 Java/Android
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python