封装运动函数

                                封装运动函数第一版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: skyblue;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <p> </p>

  <script>
    /*
      运动函数第一版

      问题: 封装哪一段代码 ?
        => 封装的就是事件内的一段代码
      问题: 封装的函数需要几个参数 ?
        => 让谁动 ?
        => 动哪一个样式 ?
        => 动到哪一个位置 ?
    */

    // 获取元素
    const ele = document.querySelector('div')

    // 通过事件触发
    ele.onclick = function () {
      // 调用运动函数
      move(ele, 'left', 200)


      // 定义一个初始值
      // let num = 0
      // // 定时器
      // const timer = setInterval(() => {
      //   // 随着定时器 num 增长
      //   num += 5

      //   // 给元素赋值
      //   ele.style.left = num + 'px'

      //   // 当到达目标位置的时候, 停止
      //   if (num === 200) {
      //     clearInterval(timer)
      //   }
      // }, 10)
    }


    // 获取元素
    const p = document.querySelector('p')

    // 通过事件触发
    p.onclick = function () {
      move(p, 'left', 300)
      // 定义一个初始值
      // let num = 0
      // // 定时器
      // const timer = setInterval(() => {
      //   // 随着定时器 num 增长
      //   num += 5

      //   // 给元素赋值
      //   p.style.left = num + 'px'

      //   // 当到达目标位置的时候, 停止
      //   if (num === 300) {
      //     clearInterval(timer)
      //   }
      // }, 10)
    }

    // 封装
    function move(ele, type, target) {
      // ele 表示哪一个元素移动
      // type 表示哪一个样式移动
      // target 表示目标位置
      // 定义一个初始值
      let num = 0
      // 定时器
      const timer = setInterval(() => {
        // 随着定时器 num 增长
        num += 5

        // 给元素赋值
        // 涉及变量相关的时候, 必须要使用 数组关联语法
        ele.style[type] = num + 'px'

        // 当到达目标位置的时候, 停止
        if (num === target) {
          clearInterval(timer)
        }
      }, 10)
    }

  </script>
</body>
</html>

 效果图;

     --------->

                                封装运动函数第二版
 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 100px;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: skyblue;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <script>
    /*
      运动函数第二版

      问题: 如果我的开始和目标之差不是 5 的倍数 ?
        => 没有办法到达指定目标位置
        => 解决方案1: 每次+1
      问题: 如果我的开始不是 0 ?
        => 会有从 0 开始的效果
        => 解决方案1: 把初始值设置成元素本身的位置


      问题: 如果我同时运动两个样式 ?
        => 当两个方向上距离不一致的时候, 会导致出现不希望的运动轨迹

    */

    // 获取元素
    const ele = document.querySelector('div')

    // 通过事件触发
    ele.onclick = function () {
      // 调用运动函数
      move(ele, 'left', 201)
      move(ele, 'top', 501)
    }


    // 封装
    function move(ele, type, target) {
      // 解决问题2: 不把初始值设置为 0 了
      // 设置成元素本身的位置
      // 如何拿到元素本身的位置 ? 元素非行内样式
      let num = parseInt(window.getComputedStyle(ele)[type])

      const timer = setInterval(() => {
        num += 1
        ele.style[type] = num + 'px'
        if (num === target) {
          clearInterval(timer)
        }
      }, 10)
    }

  </script>
</body>
</html>

 效果图:

 

                        封装运动函数第三版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 100px;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: skyblue;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <script>
    /*
      运动函数最终版

      问题: 如果我同时运动两个样式 ?
        => 当两个方向上距离不一致的时候, 会导致出现不希望的运动轨迹

      解决:
        => 出现问题的原因是 速度一致
        => 解决的方案就是需要 速度不一致
        => 因为时间必须要一致
        => 需要运动的距离不一致

      方案1:
        => 每一次运动总路程的 十分之一
      方案2:
        => 需要走出一个 减速运动
        => 不能走总路程的 十分之一
        => 需要走 剩余路程 的 十分之一


      问题: 不能到达目标位置 ?

    */

    // 获取元素
    const ele = document.querySelector('div')

    // 通过事件触发
    ele.onclick = function () {
      // 调用运动函数
      move(ele, 'left', 200)
      move(ele, 'top', 500)
    }


    // 封装
    function move(ele, type, target) {

      const timer = setInterval(() => {

        // 1. 拿到当前位置
        let current = parseInt(window.getComputedStyle(ele)[type])

        // 2. 计算本次距离
        let distance = (target - current) / 10

        // 3. 判断 结束 还是 赋值
        if (current === target) {
          // 到位
          clearInterval(timer)
          return
        }

        // 没到位
        // 赋值为 当前位置 + 本次距离
        ele.style[type] = current + distance + 'px'

      }, 10)

    }


    /*
      let num = parseInt(window.getComputedStyle(ele)[type])
      const timer = setInterval(() => {
        // speed 算出来的是本次应该运动的距离
        let speed = (target - num) / 10

        // 赋值的时候, 应该用当前位置 + 本次的距离
        // 你赋值以后, 你的位置变了, 但是 num 没有变
        ele.style[type] = num + speed + 'px'
        console.log(speed)
        if (parseInt(window.getComputedStyle(ele)[type]) === target) {
          clearInterval(timer)
        }
      }, 10)
    */

  </script>
</body>
</html>

 

                                         效果图:

                                        运动函数第四版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 99px;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: skyblue;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <script>
    /*
      运动函数最终版

      问题: 不能到达目标位置 ?

      分析问题:
        + 随着减速运动, 一定能有一个情况是在剩余距离不到 10, 是 9
        + 计算本次运动距离就是 0.9
        + 赋值的时候, 就是 191 + 0.9 赋值为 191.9
        + 因为浏览器描述不了不到 1px 的位置, 所以浏览器把元素还是放在 191 的位置
        + 你下次拿到的剩余距离还是 9
        + 计算出的运动距离还是 0.9
        + 赋值的时候, 还是 191 + 0.9 赋值为 191.9

      解决问题:
        + 不足 1px 的向上进位到 1px
        + 向上取整

      问题: 如果我做负方向运动 ?

      分析问题
        + 因为当你值是负数的时候, 你有可能会拿到剩余距离是 -9px
        + 计算出的本次运动距离就是 -0.9 px
        + 因为向上取整, 导致为 0 本次运动距离是 0
        + 下一次拿到的剩余距离还是 -9px

      解决问题:
        + 向下取整
        + 因为正方向运动需要向上取整
        + 判断, 如果 小于0 就向下取整, 如果大于0 就向上取整


      问题: 我想运动一个 opacity ?

    */

    // 获取元素
    const ele = document.querySelector('div')

    // 通过事件触发
    ele.onclick = function () {
      // 调用运动函数
      // move(ele, 'left', 203)
      move(ele, 'opacity', 0)
      // move(ele, 'top', 500)
    }


    // 封装
    function move(ele, type, target) {

      const timer = setInterval(() => {

        // 1. 拿到当前位置
        let current = parseInt(window.getComputedStyle(ele)[type])

        // 2. 计算本次距离
        let distance = (target - current) / 10
        distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

        console.log(distance)

        // 3. 判断 结束 还是 赋值
        if (current === target) {
          // 到位
          clearInterval(timer)
          return
        }

        // 没到位
        // 赋值为 当前位置 + 本次距离
        ele.style[type] = current + distance + 'px'

      }, 10)

    }


    /*
      let num = parseInt(window.getComputedStyle(ele)[type])
      const timer = setInterval(() => {
        // speed 算出来的是本次应该运动的距离
        let speed = (target - num) / 10

        // 赋值的时候, 应该用当前位置 + 本次的距离
        // 你赋值以后, 你的位置变了, 但是 num 没有变
        ele.style[type] = num + speed + 'px'
        console.log(speed)
        if (parseInt(window.getComputedStyle(ele)[type]) === target) {
          clearInterval(timer)
        }
      }, 10)
    */

  </script>
</body>
</html>

效果图:

 

                                 封装函数第五版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 99px;

      cursor: pointer;
      opacity: 0.1;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: skyblue;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <script>
    /*
      运动函数最终版

      问题: 我想运动一个 opacity ?

      分析原因:
        + opacity 的取值是 0 ~ 1 之间
          => 一定会有 0.xxx 的时候
          => 因为你的 parseInt() 直接变成 0
        + 因为取整
          => 要么计算出的本次距离是 1 要么是 -1
        + 赋值的时候
          => 你加入了 px 为单位
          => 但是 opacity 是没有单位的值

      解决取整问题:
        + 获取值的时候放大 100倍
        + 按照 0 ~ 100 进行计算
        + 最后赋值的时候缩小 100倍

      问题: 从 1 到 0 运动 opacity, 当你从 0 ~ 1 运动 opacity 的时候 ?
        + 不能实现运动了
    */

    // 获取元素
    const ele = document.querySelector('div')

    // 通过事件触发
    ele.onclick = function () {
      // move(ele, 'left', 203)
      move(ele, 'opacity', 1)
    }


    // 封装
    function move(ele, type, target) {

      const timer = setInterval(() => {
        // 1. 拿到当前位置
        let current = 0
        if (type === 'opacity') {
          // opacity 获取值的时候, 放大 100 倍
          current = window.getComputedStyle(ele)[type] * 100
        } else {
          current = parseInt(window.getComputedStyle(ele)[type])
        }

        // 2. 计算本次距离
        let distance = (target - current) / 10
        distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

        console.log(distance)

        // 3. 判断 结束 还是 赋值
        // 到位
        if (current === target) {
          clearInterval(timer)
          return
        }

        // 没到位
        if (type === 'opacity') {
          // opacity 赋值的时候 缩小 100 倍
          ele.style[type] = (current + distance) / 100
        } else {
          ele.style[type] = current + distance + 'px'
        }

      }, 300)

    }
  </script>
</body>
</html>

封装函数第六版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 99px;

      cursor: pointer;
      opacity: 0.1;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: skyblue;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <script>
    /*
      运动函数最终版

      问题: 从 1 到 0 运动 opacity, 当你从 0 ~ 1 运动 opacity 的时候 ?
        + 不能实现运动了

      分析问题:
        + 你计算的时候, 取值范围是 0 ~ 100 进行计算
        + 你调用 move 函数设置 opacity 的时候, 写的是 1
        + 你是按照 0 ~ 1 的区间进行设置, 按照 0 ~ 100 的区间进行计算赋值

      解决:
        + 方案1: 你在调用 move 按照的时候, 按照 0 ~ 100 的区间进行赋值
        + 方案2: 你在调用 move 的时候, 还是按照 0 ~ 1 进行赋值
          => 我再 move 函数的一开始, 判断一下, 如果你设置的是 opacity 我来帮你放大 100 倍

      问题: 需要同时运动 多个样式 的时候 ?
        + 不能一个 运动函数 运动多个样式
    */

    // 获取元素
    const ele = document.querySelector('div')

    // 通过事件触发
    ele.onclick = function () {
      // move(ele, 'left', 203)
      move(ele, 'opacity', 0.96)
    }


    // 封装
    function move(ele, type, target) {

      // 判断 opacity
      if (type === 'opacity') target *= 100

      const timer = setInterval(() => {
        // 1. 拿到当前位置
        let current = 0
        if (type === 'opacity') {
          // opacity 获取值的时候, 放大 100 倍
          current = window.getComputedStyle(ele)[type] * 100
        } else {
          current = parseInt(window.getComputedStyle(ele)[type])
        }

        // 2. 计算本次距离
        let distance = (target - current) / 10
        distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

        // 3. 判断 结束 还是 赋值
        // 到位
        if (current === target) {
          clearInterval(timer)
          return
        }

        // 没到位
        if (type === 'opacity') {
          // opacity 赋值的时候 缩小 100 倍
          ele.style[type] = (current + distance) / 100
        } else {
          ele.style[type] = current + distance + 'px'
        }

      }, 10)

    }
  </script>
</body>
</html>

        封装函数第七版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 99px;

      cursor: pointer;
      opacity: 1;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: skyblue;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <script>
    /*
      运动函数最终版

      问题: 需要同时运动 多个样式 的时候 ?
        + 不能一个 运动函数 运动多个样式

      解决: 封装一个多属性运动函数

      问题: 如何设计函数的参数 ?
        + 方案1: function move(元素, 样式1, 值1, 样式2, 值2, 样式3, 值3, ...) {}
        + 方案2: function move(元素, { 样式名: 样式值, 样式名: 样式值, ... })

      问题: 我想在运动结束做一些事情 ?
        + 运动完全结束以后, 开始实现一些效果, 会出现多次
    */

    // 获取元素
    const ele = document.querySelector('div')

    // 通过事件触发
    ele.onclick = function () {
      move(ele, { left: 200, top: 303, width: 400, height: 302 })

    }


    // 封装多属性运动函数
    function move(ele, options) {
      // ele 表示要运动的元素
      // options 表示要运动的所有样式

      // options 内有多少个样式, 开启多少个定时器
      // 循环遍历 opaions, 循环一次开启一个定时器
      for (let k in options) {
        // 在循环内, k 每一个 样式名, options[k] 是每一个目标值
        const type = k
        const target = options[k]

        // 判断 opacity
        if (type === 'opacity') target *= 100
        const timer = setInterval(() => {
          // 1. 拿到当前位置
          let current = 0
          if (type === 'opacity') {
            // opacity 获取值的时候, 放大 100 倍
            current = window.getComputedStyle(ele)[type] * 100
          } else {
            current = parseInt(window.getComputedStyle(ele)[type])
          }

          // 2. 计算本次距离
          let distance = (target - current) / 10
          distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

          // 3. 判断 结束 还是 赋值
          // 到位
          if (current === target) {
            clearInterval(timer)

            console.log('运动结束了')

            return
          }

          // 没到位
          if (type === 'opacity') {
            // opacity 赋值的时候 缩小 100 倍
            ele.style[type] = (current + distance) / 100
          } else {
            ele.style[type] = current + distance + 'px'
          }
        }, 20)
      }
    }





    // 封装
    // function move(ele, type, target) {

    //   // 判断 opacity
    //   if (type === 'opacity') target *= 100

    //   const timer = setInterval(() => {
    //     // 1. 拿到当前位置
    //     let current = 0
    //     if (type === 'opacity') {
    //       // opacity 获取值的时候, 放大 100 倍
    //       current = window.getComputedStyle(ele)[type] * 100
    //     } else {
    //       current = parseInt(window.getComputedStyle(ele)[type])
    //     }

    //     // 2. 计算本次距离
    //     let distance = (target - current) / 10
    //     distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

    //     // 3. 判断 结束 还是 赋值
    //     // 到位
    //     if (current === target) {
    //       clearInterval(timer)
    //       return
    //     }

    //     // 没到位
    //     if (type === 'opacity') {
    //       // opacity 赋值的时候 缩小 100 倍
    //       ele.style[type] = (current + distance) / 100
    //     } else {
    //       ele.style[type] = current + distance + 'px'
    //     }

    //   }, 10)

    // }
  </script>
</body>
</html>

封装函数第八版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 99px;

      cursor: pointer;
      opacity: 1;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: orange;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <p> </p>

  <script>
    /*
      运动函数最终版

      问题: 我想在运动结束做一些事情 ?
        + 运动完全结束以后, 开始实现一些效果, 会出现多次

      解决:
        + 不管你开启了多少个定时器, 当最后一个定时器结束的时候, 才算运动完全结束

      问题: 如何知道最后一个定时器结束了 ?
        + 计数器
        + 你开一个定时器 计数器++
        + 关一个定时器 计数器--
        + 当计数器为 0 的时候, 所有定时器都关闭了

      问题: 如果我使用运动函数运动多个元素 ?
        + 我希望一号元素运动完毕以后改变背景颜色
        + 我希望二号元素运动完毕以后浏览器弹出层提示
        + 在不同的运动结束之后做不同的事情
    */

    // 获取元素
    const ele = document.querySelector('div')
    const p = document.querySelector('p')

    // 通过事件触发
    ele.onclick = function () {
      move(ele, { left: 200, top: 303, width: 400, height: 302 })
    }

    p.onclick = function () {
      move(p, { top: 300 })
    }


    // 封装多属性运动函数
    function move(ele, options) {
      // 准备一个变量当做 计数器
      let count = 0


      for (let k in options) {
        // 随着循环, 每循环一次, 就会开启一个定时器
        count++

        const type = k
        const target = options[k]

        // 判断 opacity
        if (type === 'opacity') target *= 100
        const timer = setInterval(() => {
          // 1. 拿到当前位置
          let current = 0
          if (type === 'opacity') {
            current = window.getComputedStyle(ele)[type] * 100
          } else {
            current = parseInt(window.getComputedStyle(ele)[type])
          }

          // 2. 计算本次距离
          let distance = (target - current) / 10
          distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

          // 3. 判断 结束 还是 赋值
          // 到位
          if (current === target) {
            clearInterval(timer)

            // 这里的代码每执行一次, 定时间关闭一个
            count--

            if (count === 0) ele.style.backgroundColor = 'skyblue'

            return
          }

          // 没到位
          if (type === 'opacity') {
            ele.style[type] = (current + distance) / 100
          } else {
            ele.style[type] = current + distance + 'px'
          }
        }, 20)
      }
    }





    // 封装
    // function move(ele, type, target) {

    //   // 判断 opacity
    //   if (type === 'opacity') target *= 100

    //   const timer = setInterval(() => {
    //     // 1. 拿到当前位置
    //     let current = 0
    //     if (type === 'opacity') {
    //       // opacity 获取值的时候, 放大 100 倍
    //       current = window.getComputedStyle(ele)[type] * 100
    //     } else {
    //       current = parseInt(window.getComputedStyle(ele)[type])
    //     }

    //     // 2. 计算本次距离
    //     let distance = (target - current) / 10
    //     distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

    //     // 3. 判断 结束 还是 赋值
    //     // 到位
    //     if (current === target) {
    //       clearInterval(timer)
    //       return
    //     }

    //     // 没到位
    //     if (type === 'opacity') {
    //       // opacity 赋值的时候 缩小 100 倍
    //       ele.style[type] = (current + distance) / 100
    //     } else {
    //       ele.style[type] = current + distance + 'px'
    //     }

    //   }, 10)

    // }
  </script>
</body>
</html>

效果图:

 

 封装函数第九版

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    div {
      width: 100px;
      height: 100px;
      background-color: pink;
      position: absolute;
      left: 99px;

      cursor: pointer;
      opacity: 1;
    }

    p {
      width: 100px;
      height: 100px;
      background-color: orange;

      position: absolute;
      top: 130px;
    }
  </style>
</head>
<body>

  <div></div>

  <p> </p>


  <script src="../utils.js"></script>
  <script>
    /*
      运动函数最终版

      问题: 如果我使用运动函数运动多个元素 ?
        + 我希望一号元素运动完毕以后改变背景颜色
        + 我希望二号元素运动完毕以后浏览器弹出层提示
        + 在不同的运动结束之后做不同的事情

      解决问题: 回调函数
        + 你把你想在最后做的事情放在一个 "盒子" 里面
        + 传递给 move 函数, 告诉 move 函数, 在运动结束以后, 把 "盒子" 内的代码执行一遍
        + 可以装代码的盒子 --- 函数
    */

    // 获取元素
    const ele = document.querySelector('div')
    const p = document.querySelector('p')

    // 通过事件触发
    ele.onclick = function () {
      move(ele, { left: 200, top: 303, width: 400, height: 302 }, function () {
        ele.style.backgroundColor = 'skyblue'
      })
    }

    p.onclick = function () {
      move(p, { top: 300 }, () => {
        alert('运动结束了')
      })
    }


    // 封装多属性运动函数
    // function move(ele, options, cb = function () {}) {
    //   // cb 需要在运动结束执行的函数
    //   let count = 0
    //   for (let k in options) {
    //     count++

    //     const type = k
    //     const target = options[k]

    //     if (type === 'opacity') target *= 100
    //     const timer = setInterval(() => {
    //       // 1. 拿到当前位置
    //       let current = 0
    //       if (type === 'opacity') {
    //         current = window.getComputedStyle(ele)[type] * 100
    //       } else {
    //         current = parseInt(window.getComputedStyle(ele)[type])
    //       }

    //       // 2. 计算本次距离
    //       let distance = (target - current) / 10
    //       distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

    //       // 3. 判断 结束 还是 赋值
    //       // 到位
    //       if (current === target) {
    //         clearInterval(timer)

    //         // 这里的代码每执行一次, 定时间关闭一个
    //         count--

    //         // 在运动完全结束以后, 调用函数
    //         if (count === 0) cb()

    //         return
    //       }

    //       // 没到位
    //       if (type === 'opacity') {
    //         ele.style[type] = (current + distance) / 100
    //       } else {
    //         ele.style[type] = current + distance + 'px'
    //       }
    //     }, 20)
    //   }
    // }





    // 封装
    // function move(ele, type, target) {

    //   // 判断 opacity
    //   if (type === 'opacity') target *= 100

    //   const timer = setInterval(() => {
    //     // 1. 拿到当前位置
    //     let current = 0
    //     if (type === 'opacity') {
    //       // opacity 获取值的时候, 放大 100 倍
    //       current = window.getComputedStyle(ele)[type] * 100
    //     } else {
    //       current = parseInt(window.getComputedStyle(ele)[type])
    //     }

    //     // 2. 计算本次距离
    //     let distance = (target - current) / 10
    //     distance = distance < 0 ? Math.floor(distance) : Math.ceil(distance)

    //     // 3. 判断 结束 还是 赋值
    //     // 到位
    //     if (current === target) {
    //       clearInterval(timer)
    //       return
    //     }

    //     // 没到位
    //     if (type === 'opacity') {
    //       // opacity 赋值的时候 缩小 100 倍
    //       ele.style[type] = (current + distance) / 100
    //     } else {
    //       ele.style[type] = current + distance + 'px'
    //     }

    //   }, 10)

    // }
  </script>
</body>
</html>

效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值