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


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弹性布局内容对齐(justify-content)属性使用详解
Jul 31 HTML / CSS
css3.0 图形构成实例练习一
Mar 19 HTML / CSS
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
Nov 11 HTML / CSS
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
Apr 26 HTML / CSS
几个CSS3的flex弹性盒模型布局的简单例子演示
May 12 HTML / CSS
详解CSS3弹性伸缩盒
Sep 21 HTML / CSS
HTML5 Canvas标签使用收录
Jul 07 HTML / CSS
html5中地理位置定位api接口开发应用小结
Jan 04 HTML / CSS
Data URI scheme详解和使用实例及图片base64编码实现方法
May 08 HTML / CSS
举例详解HTML5中使用JSON格式提交表单
Jun 16 HTML / CSS
Html5在手机端调用相机的方法实现
May 13 HTML / CSS
CSS中实现动画效果-附案例
Feb 28 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
php 接口类与抽象类的实际作用
2009/11/26 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
由浅入深讲解python中的yield与generator
2017/04/05 Python
python numpy中cumsum的用法详解
2019/10/17 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
python绘制玫瑰的实现代码
2020/03/02 Python
python 安装移动复制第三方库操作
2020/07/13 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
法国房车租赁网站:Yescapa
2019/08/26 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
受伤赔偿协议书
2014/09/24 职场文书
实习班主任自我评价
2015/03/11 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python