• 第二十章 运动函数的封装


    运动函数

    1、含义: 封装一个函数让一个元素改变现有状态,将来想要让元素运动的时候直接调用这个函数就可以了;

    2、原理:利用定时器setInterval()不断移动盒子位置

    3、实现步骤 

    =>获取当前盒子的位置

    =>让盒子在当前位置上加上一个需要移动距离

    =>利用定时器不断重复这个操作

    =>加一个定时器结束的条件

    注意:此元素需要添加定位,才可以使用 元素.style.left

    4、步骤实现

    =>当开始的距离不是 0,就是有一个往回走的过程,所以我们可以获取到元素之前的初始位置

    =>运动的距离不同,要同时到达目标位置,所以我们需要调整运动的速度,这个也是一个减速运动, 每次走剩余距离的 1/10

    =>按照上面的方式,我们不能准确的到达目标位置,一定会出现小数0.9,而浏览器能识别的最小的单位是 1 px,所以需要我们向上取整

    =>我们反方向运动的时候需要,向下取整

    =>如果运动的是 opacity 属性 , 不能产生效果,存在两个原因:一个是单位,一个是opacity取值是0-1,存在小数问题

            ->单位解决办法:我们在运动的时候判断是不是opacity属性,如果是: 我们的就不加单位(px),反之添加

            ->小数问题:我们上来就需要判断一下是不是opacity属性,如果是 我们放大100倍,赋值的时候在缩小100倍

    =>依旧是opacity属性在运动 , 到不了中间的位置,原因是:按照我们的计算方式 , 永远不能出现小数,所以我们可以上来就判断是不是opacity属性,如果是 我们给它放大100倍

    =>同时我们这时发现,不能同时运动多个属性,需要考虑参数位的设计,以对象的方式传递参数

    =>通过一个计数器,可以准确的知道什么时候运动真正的结束了

    =>如果想要在结束之后做一些其他的事情,可以传入第三个参数,要是不需要我们可以不传,需要在单独加上一个判断即可

    5、完整代码实现

    1. function move(ele,options,fn){
    2. let count = 0
    3. for(let k in options){
    4. // 执行一次进行一次count++
    5. count++
    6. // 这里判断输入的参数是否是opacity
    7. if(k === 'opacity'){
    8. options[k] = options[k] * 100
    9. }
    10. let time = setInterval(function(){
    11. // 得到开始距离,注意传入的是字符类型
    12. let start
    13. // 在这里判断是否是opacity,若是*100方便计算
    14. if(k === 'opacity'){
    15. start = window.getComputedStyle(ele)[k] * 100
    16. }else{
    17. start = parseInt(window.getComputedStyle(ele)[k])
    18. }
    19. let distance = (options[k] - start) / 10
    20. if(distance > 0){
    21. // 注意取整问题,因为会在0.9哪里一直循环,定时器无法停止,所以需要我们向上取整
    22. distance = Math.ceil(distance)
    23. }else{
    24. distance = Math.floor(distance)
    25. }
    26. // 判断如果开始距离是否等于输入的距离,从而结束定时器
    27. if(start === options[k]){
    28. clearInterval(time)
    29. // 这里进行count--
    30. count--
    31. if(count === 0){
    32. fn&&fn()
    33. }
    34. }else{
    35. // 判断是否是opacity,若是需要除以之前*100
    36. if(k === 'opacity'){
    37. ele.style[k] = (distance + start) / 100
    38. }else{
    39. ele.style[k] = distance + start + 'px'
    40. }
    41. }
    42. },20)
    43. }
    44. }
    45. box.onclick = function(){
    46. // 调用函数
    47. move(box,{top:200,left:300,width:400,opacity:0.3},function(){
    48. box.style.background = 'yellow'
    49. })
    50. }

  • 相关阅读:
    49.【拷贝构造函数与重载】
    CSS实现文字颜色渐变
    Hadoop配置集群有哪几种模式?分别表示什么意思?伪分布式应用在什么场景?
    boost 库记录
    让你效率飞起的右键工具——超级右键
    零基础数模之回归专题
    flink-sql自定义函数
    这是我见过最详细的Linux学习分享了,面面俱到,相见恨晚呐
    VBA技术资料MF57:VBA_自动创建PowerPoint演示文稿
    系统架构设计——互联网金融的架构设计
  • 原文地址:https://blog.csdn.net/Girasoles/article/details/128098272