20-JS:缓存动画、回调函数

1.缓动动画原理

缓动动画让元素运动速度有所变化,最常见的是让速度慢慢停下来
思路:
1.让盒子每次移动的距离慢慢变小,速度就会慢慢减下来
2:(目标位置 - 当前位置) / 10 作为每次移动的距离步长
3:停止条件 让盒子当前位置等于目标位置 就停止定时器
4:步长值需要取整
案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            position: absolute;
            left: 0;
            width: 100px;
            height: 100px;
            background-color: aqua;
        }
    </style>
</head>
<body>

    <button>点击</button>
    <div></div>

    <script>

        // Math.ceil  向上取整    Math.floor   向下取整

     //obj  目标对象    target  目标位置 
        var oDiv = document.querySelector('div');
        var oBtn =document.querySelector('button');

        function animate(obj,target){
              clearInterval(obj.timer);
              obj.timer = setInterval(function(){
                //   求步长   步长要写到定时器里面
                // 步长向上取整  变为1  到最后(目标位置 - 当前位置)小于10时  步长变为1px 1px的移动
                var step = Math.ceil((target - obj.offsetLeft) /10);
                // console.log(step,1)
                  if(obj.offsetLeft == target){
                      clearInterval(obj.timer)
                     
                  }
                //   缓动动画  把每次加1这个步长值改为一个慢慢变小的值
                // 步长公式:(目标位置 - 当前位置) / 10 
                  obj.style.left = obj.offsetLeft + step + 'px';
              },15)
        }
        oBtn.addEventListener('click',function(){
            animate(oDiv,500)
        })
       

        // 匀速动画  盒子当前位置 + 固定的值  1px
        // 缓动动画   盒子当前位置 + 变化的值  (目标位置-当前位置)/ 10
    </script>
</body>
</html>

2.多个目标值之间移动

让动画从100移动到800,再移动到1000,再移动到500
100--------500 目标值 > 当前位置 步长正值
800---------300 目标值 < 当前位置 步长负值
案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            position: absolute;
            left: 0;
            top: 50px;
            width: 100px;
            height: 100px;
            background-color: aqua;
        }
    </style>
</head>
<body>

    <button class="btn1">100</button>
    <button class="btn2">500</button>
    <div></div>

    <script>

        // Math.ceil  向上取整    Math.floor   向下取整

     //obj  目标对象    target  目标位置 
        var oDiv = document.querySelector('div');
        var oBtn1 =document.querySelector('.btn1');
        var oBtn2 =document.querySelector('.btn2');

        function animate(obj,target){
              clearInterval(obj.timer);
              obj.timer = setInterval(function(){
                //   求步长   步长要写到定时器里面
                // 步长向上取整  变为1  到最后(目标位置 - 当前位置)小于10时  步长变为1px 1px的移动
                var step = (target - obj.offsetLeft) /10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step)
                // console.log(step,1)
                  if(obj.offsetLeft == target){
                      clearInterval(obj.timer)
                     
                  }
                //   缓动动画  把每次加1这个步长值改为一个慢慢变小的值
                // 步长公式:(目标位置 - 当前位置) / 10 
                  obj.style.left = obj.offsetLeft + step + 'px';
              },15)
        }
        oBtn1.addEventListener('click',function(){
            animate(oDiv,100)
        })
       
        oBtn2.addEventListener('click',function(){
            animate(oDiv,500)
        })

        // 匀速动画  盒子当前位置 + 固定的值  1px
        // 缓动动画   盒子当前位置 + 变化的值  (目标位置-当前位置)/ 10
    </script>
</body>
</html>

3.回调函数

函数作为一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完后,再执行传进去的这个函数,这个过程叫回调

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

    <script>
          
        //   b传的是一个函数  就相当于形参的变量值是一个函数
        function fn(a,b){
            var c = a + 10;
            console.log(c)

            b()
        }

        fn(20,function(){
            alert(123)
        })
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            position: absolute;
            left: 0;
            top: 50px;
            width: 100px;
            height: 100px;
            background-color: aqua;
        }
    </style>
</head>
<body>

    <button class="btn1">100</button>
    <button class="btn2">500</button>
    <div></div>

    <script>

        // Math.ceil  向上取整    Math.floor   向下取整

     //obj  目标对象    target  目标位置 
        var oDiv = document.querySelector('div');
        var oBtn1 =document.querySelector('.btn1');
        var oBtn2 =document.querySelector('.btn2');

        function animate(obj,target,callback){
              clearInterval(obj.timer);
              obj.timer = setInterval(function(){
                //   求步长   步长要写到定时器里面
                // 步长向上取整  变为1  到最后(目标位置 - 当前位置)小于10时  步长变为1px 1px的移动
                var step = (target - obj.offsetLeft) /10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step)
                // console.log(step,1)
                  if(obj.offsetLeft == target){

                    // 清除定时器------最后执行的代码
                      clearInterval(obj.timer)
                    //   alert('我到终点了')
                    // 回调函数写在定时器结束里面
                    callback && callback()
                     
                  }
                //   缓动动画  把每次加1这个步长值改为一个慢慢变小的值
                // 步长公式:(目标位置 - 当前位置) / 10 
                  obj.style.left = obj.offsetLeft + step + 'px';
              },15)
        }
        oBtn1.addEventListener('click',function(){
            animate(oDiv,100)
        })
       
        oBtn2.addEventListener('click',function(){
            animate(oDiv,500,function(){
                alert('动画结束了')
            })
        })

        // 匀速动画  盒子当前位置 + 固定的值  1px
        // 缓动动画   盒子当前位置 + 变化的值  (目标位置-当前位置)/ 10
    </script>
</body>
</html>

4.返回顶部

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .main{
            width: 1000px;
            margin: 30px auto;
        }
        .box1{
            height: 300px;
            background-color: red;
        }
        .box2{
            height: 500px;
            background-color: yellow;
        }
        .box3{
            height: 900px;
            background-color: blueviolet;
        }
        .back{
            position: absolute;
            left: 80%;
            top: 400px;
            display: none;
            width: 50px;
            height: 50px;
            background-color: blue;
        }
    </style>
</head>
<body>
    
    <div class="box1 main"></div>
    <div class="box2 main"></div>
    <div class="box3 main"></div>

    <div class="back"></div>



    <script>
      
    //   1  获取元素
    var oBack = document.querySelector('.back');

    var oBox2 = document.querySelector('.box2');
    var oBox2Top = oBox2.offsetTop




     document.addEventListener('scroll',function(){
          
        // 我们页面被卷走的头部距离大于等于 黄色盒子 距页面顶部的距离  把back 设置为固定定位
        if(window.pageYOffset >= oBox2Top){
            oBack.style.position = 'fixed';
            oBack.style.display = 'block';
        }else{
            oBack.style.position = 'absolute';
            oBack.style.display = 'none';
        }
     })


     /* 
     window.scroll (x,y) 想要置于左上角的像素点的横纵坐标 
     浮动窗口至文档中指定的位置
     */
    </script>
</body>

5.轮播图

1.鼠标经过轮播图模块,左右按钮显示,离开左右按钮隐藏;

2.点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮一样的道理

3.图片播放的同时,小圆点跟着一起播放;

4.点击小圆点还可以播放相应的图片;

5.鼠标不经过轮播图,轮播图会自动播放;

6.鼠标经过轮播图,轮播图自动播放停止;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值