博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue 折腾记 - (6) 写一个不大靠谱的backToTop组件
阅读量:6377 次
发布时间:2019-06-23

本文共 4168 字,大约阅读时间需要 13 分钟。

前言

返回顶部这个功能用jq实现,好容易实现,一个animate配合scrollTo就搞定了

今天我们来试试vue封装一个原生js实现的返回顶部;

写起来够呛,借助github,看了别人的gist,稍微封装了下;

当然不是用scrollTo直接调位那种,没有过渡效果怎么说得过去!!还是捣鼓出来了.

废话不多说,看效果图...


效果图

实现思路

  • 过渡用的是requestAnimationFrame,这货只支持IE10+,所以必须做兼容
  • 滚动视图是window.pageYOffset,这货支持IE9+;
  • 为了让可控性更强,图标采用iconfont,具体瞅代码

你能学到什么?

  • 学到一些页面计算相关的东东
  • 动画API的一些知识
  • Vue封装组件相关知识和生命周期和事件监听销毁相关知识的运用

实现功能

  • 视图默认在350处显示返回顶部的按钮和图标
  • 提示文字和颜色,在图标上下左右的自定义,字段都限制了格式和默认值
  • 图标颜色和形状,大小的自定义,字段都限制了格式和默认值
  • 过渡动效的自定义,用法:scrollIt(0, 1500, 'easeInOutCubic', callback);
    • 返回到视图的point,也就是滚动到哪里
    • 过渡时间(ms级别)
    • 一堆过渡效果,字符串格式,其实就是滚动的计算函数..
    • 当然少不了默认参数了,除了callback
  • 兼容性是IE9+,特意开了虚拟机去尝试

代码

  • scrollIt.js --过渡滚动实现
export function scrollIt(  destination = 0,  duration = 200,  easing = "linear",  callback) {  // define timing functions -- 过渡动效  let easings = {    // no easing, no acceleration    linear(t) {      return t;    },    // accelerating from zero velocity    easeInQuad(t) {      return t * t;    },    // decelerating to zero velocity    easeOutQuad(t) {      return t * (2 - t);    },    // acceleration until halfway, then deceleration    easeInOutQuad(t) {      return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;    },    // accelerating from zero velocity    easeInCubic(t) {      return t * t * t;    },    // decelerating to zero velocity    easeOutCubic(t) {      return --t * t * t + 1;    },    // acceleration until halfway, then deceleration    easeInOutCubic(t) {      return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;    },    // accelerating from zero velocity    easeInQuart(t) {      return t * t * t * t;    },    // decelerating to zero velocity    easeOutQuart(t) {      return 1 - --t * t * t * t;    },    // acceleration until halfway, then deceleration    easeInOutQuart(t) {      return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;    },    // accelerating from zero velocity    easeInQuint(t) {      return t * t * t * t * t;    },    // decelerating to zero velocity    easeOutQuint(t) {      return 1 + --t * t * t * t * t;    },    // acceleration until halfway, then deceleration    easeInOutQuint(t) {      return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;    }  };  // requestAnimationFrame()的兼容性封装:先判断是否原生支持各种带前缀的  //不行的话就采用延时的方案  (function() {    var lastTime = 0;    var vendors = ["ms", "moz", "webkit", "o"];    for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {      window.requestAnimationFrame =        window[vendors[x] + "RequestAnimationFrame"];      window.cancelAnimationFrame =        window[vendors[x] + "CancelAnimationFrame"] ||        window[vendors[x] + "CancelRequestAnimationFrame"];    }    if (!window.requestAnimationFrame)      window.requestAnimationFrame = function(callback, element) {        var currTime = new Date().getTime();        var timeToCall = Math.max(0, 16 - (currTime - lastTime));        var id = window.setTimeout(function() {          callback(currTime + timeToCall);        }, timeToCall);        lastTime = currTime + timeToCall;        return id;      };    if (!window.cancelAnimationFrame)      window.cancelAnimationFrame = function(id) {        clearTimeout(id);      };  })();  function checkElement() {    // chrome,safari及一些浏览器对于documentElemnt的计算标准化,reset的作用    document.documentElement.scrollTop += 1;    let elm =      document.documentElement.scrollTop !== 0        ? document.documentElement        : document.body;    document.documentElement.scrollTop -= 1;    return elm;  }  let element = checkElement();   let start = element.scrollTop; // 当前滚动距离  let startTime = Date.now(); // 当前时间  function scroll() { // 滚动的实现    let now = Date.now();    let time = Math.min(1, (now - startTime) / duration);    let timeFunction = easings[easing](time);    element.scrollTop = timeFunction * (destination - start) + start;    if (element.scrollTop === destination) {      callback; // 此次执行回调函数      return;    }    window.requestAnimationFrame(scroll);  }  scroll();}复制代码
  • backToTop.vue
复制代码

总结

从心血来潮到折腾出来,为了兼顾兼容性和拓展性,好像几个小时了.

不过实现了.你再搬到其他语言,类似ng4,也就是十来分钟的事情,
思路会了,实现更多的是写法而已,至于性能优化,可以一边写一边考虑,也可以实现后有空再优化.
有更好的实现方案和思路可以往下面留言,谢谢

转载地址:http://uzxqa.baihongyu.com/

你可能感兴趣的文章
洛谷 题解 P3627 【[APIO2009]抢掠计划】
查看>>
springboot传入json和文件_SpringBoot系列教程22-整合SpringMVC之HttpMessageConverters
查看>>
不礼让行人怎么抓拍的_张家川公安交警持续曝光机动车不礼让行人【第24期】...
查看>>
用pythonturtle写名字_去年爆款新生儿名字,家长自以为起的不错,却有“棺材”的意思...
查看>>
句子分类_语法微课句子的分类+文本讲解
查看>>
显示提示_体检报告显示:“转氨酶”升高!提示身体可能出现了这些健康问题...
查看>>
图形化分析工具_推荐一款基于小米 soar 的开源 sql 分析与优化的 web 图形化工具...
查看>>
485 工控机 接线方式_RS485温湿度传感器的接线方式及注意事项
查看>>
u3d游戏开发视频潭州_unity3d教程视频-unity3d教程中文零基础入门/u3d游戏开发/特效案例/项目实战V2.0 最新版 - 极光站...
查看>>
c++区块链实例_cpp 区块链模拟示例(二)工程代码解析
查看>>
java 接口的本质_Java基本概念:接口
查看>>
java死锁的解决_java中常见的死锁以及解决方法代码
查看>>
java菜单栏不下拉_我java代码中的下拉列表设好后为什么无法下拉?
查看>>
java传递引用类型的实质_java的引用类型以及值传递
查看>>
java策略模式使用场景,Java设计模式—策略模式
查看>>
RHEL6.3实现基于加密的用户认证验证访问
查看>>
SCCM2012 R2实战系列之十一:解决OSD分发Windows7 系统盘盘符为’D’问题
查看>>
经验分享:我是如何在网店无货源情况下快速出单?
查看>>
限免的Mac App套件,工程师绝对不可错过
查看>>
Exchange 2013 添加地址列表到脱机通讯簿
查看>>