最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 实现页面平滑滚动的N种姿势

    正文概述 掘金(moozi)   2020-11-25   839

    在用 React Hooks 实现返回顶部按钮一文里的彩蛋环节里,我们向大家介绍了页面平滑滚动的两种姿势:CSS设置 scroll-behavior: smooth; 属性和使用 window.scrollTo(options) 方法。其实除了这两种姿势,还有两种实现页面平滑滚动的姿势,它们就是 Element.scrollIntoView(scrollIntoViewOptions) 方法和 window.requestAnimationFrame(callback) 。

    css scroll-behavior

    scroll-bahavior: smooth; 添加在滚动容器元素上,可以让容器的滚动变得平滑。例如在PC浏览器中,网页默认滚动是在 标签上的,移动端大多数在 标签上,我们可以给 html 和 body 都加上,在点击页面上的【返回顶部】按钮时,就可以实现页面的平滑滚动。

    html, body {
        scroll-bahavior: smooth;
    }
    

    到目前为止,并非所有的浏览器都支持该属性:

    实现页面平滑滚动的N种姿势

    window.scrollTo()

    window.scrollTo(x, y) 可以通过传入文档(HTML 中的 document)中的x轴坐标和y轴坐标将页面滚动到某个位置。该 API 还支持传入一个 options 对象,其中left属性等同于x轴坐标;top属性等同于y轴坐标;behavior 属性表示滚动行为,其类型为 String,可选值有 3 个:smooth (平滑滚动 )、instant (瞬间滚动)、auto (默认值)。auto 实测效果等同于 instant 。

    window.scrollTo({
      left: 0, // x坐标
      top: 0,  // y 坐标
      behavior: 'smooth' // 可选值:smooth、instant、auto
    })
    

    所有主要浏览器都支持该 API ,但 IE浏览器和 Safari 浏览器不支持 options 选项:

    实现页面平滑滚动的N种姿势

    Element.scrollIntoView()

    DOM 元素的 scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内。该方法支持传入一个 scrollIntoViewOptions 对象,其中的 behavior 属性定义滚动时的动画过渡效果,可选值为 auto 或 smooth,默认值为 auto,无动画效果;smooth 可使页面平滑滚动。

    target.scrollIntoView({
        behavior: "smooth"
    });
    

    我们随便打开一个有链接的页面,把首个链接滚动到屏幕外,然后控制台输入类似下面代码,我们就可以看到页面平滑滚动定位了:

    document.links[0].scrollIntoView({
        behavior: "smooth"
    });
    

    所有浏览器都支持该 API,但 IE浏览器和 Safari 浏览器不支持 scrollIntoViewOptions 选项:

    实现页面平滑滚动的N种姿势

    requestAnimationFrame

    requestAnimationFrame 是浏览器用于定时循环操作的一个接口,类似于 setTimeout,主要用途是按帧对网页进行重绘。这个API就是告诉浏览器,希望执行一个动画,让浏览器在下次重绘之前调用指定的回调函数更新动画。

    requestAnimationFrame 使用一个回调函数作为参数,这个回调函数会在浏览器下一次重绘之前执行。

    requestID = window.requestAnimationFrame(callback);
    

    requestAnimationFrame 的返回值是一个 long 整数,是回调列表中唯一的标识。可以将这个值传给 window.cancelAnimationFrame() 以取消回调函数。

    我们使用 requestAnimationFrame() 来是实现返回页面顶部的效果:

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

    需要注意的是,requestAnimationFrame 是在主线程上完成的。这意味着,如果主线程非常繁忙,requestAnimationFrame 的动画效果会大打折扣。

    几乎所有的主流浏览器都支持 window.requestAnimationFrame:

    实现页面平滑滚动的N种姿势

    参考文档:

    javascript.ruanyifeng.com/htmlapi/req…

    developer.mozilla.org/zh-CN/docs/…


    起源地下载网 » 实现页面平滑滚动的N种姿势

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元