JavaScript运动

在js中实现运动的原理:

在开启定时器setInterval()/setTimeout()和清楚定时器clearInterval()/clearTimeout()来控制运动,其中setInterval()方法可以让物体动起来,而clearInterval()方法可以让运动停止;在定时器过程中不断更改需要改变的值。

总结一下运动所需要用到的知识:

1.定时器(异步的 多次)

let id = setInterval(function(){},毫秒值)
clearInterval(id)

2.延时器 (异步的 执行一次)

setTimeout(function(){},延迟的毫秒值)

3.DOM操作

获取样式

window.getComputerStyle(element,null) || element.currentStyle

设置样式

element.style.样式名 = 样式值

4.offset家族

offsetParent 偏移的父元素(从里往外找 先加了定位就是谁 找不到就找body)

offsetWidth 宽度 offsetHeight 高度

offsetLeft 离左边的距离 offsetTop 离上面的距离

5.区间的判断(利用一个公共的变量 来控制变量)

(target - current) <= step //区间判断

6.计算公式

随机数区间生成

Math.round(Math.random() * (max-min) + min) //随机整数

圆的的x轴 y轴计算

x = Math.cos(2*Math.PI*角度值)*半径+圆心点的x轴
y = Math.sin(2*Math.PI*角度值)*半径+圆心点的y轴

一.匀速运动

1.首先我们要页面要有个运动的元素div,这个元素div有宽度高度背景以及定位

 *{margin: 0;padding: 0;}
        #box{
            width: 100px;
            height: 100px;
            background: pink;
            position: absolute;
        }


    <button>移动到600</button>
    <button>移动到200</button>
    <div id="box"></div>

2.如何让元素div匀速运动起来?可以用定时器来控制元素div的定位left以及top的值来改变元素div的位置。

<script>
        var box = document.getElementById('box') //获取box
        function animatedMoveX(element,target){ //定义一个移动的方法 第一个参数是移动的对象 第二个参数是x移动多少
            let timer = null //定义一个变量用来一开始就清除定时器
            clearInterval(timer) //清掉定时器
            timer = setInterval(() => { //创建一个定时器
                var d = element.offsetLeft>target?-10:10 //判断元素在目标位置的左边还是右边 -10表示往左 10表示右
                element.style.left = element.offsetLeft+d+'px' 
                if (Math.abs(target-element.offsetLeft)<=Math.abs(d)) {//如果偏移量与要移动的x值差是
                    element.style.left = target+'px' 
                    clearInterval(timer)
                }
            }, 50); 
        }
        //获取按钮给按钮加点击事件
        var btns = document.getElementsByTagName('button')
        btns[0].onclick = function(){
            animatedMoveX(box,600)
        }
        btns[1].onclick = function(){
            animatedMoveX(box,200)
        }
    </script>

效果图:

二.缓冲运动

缓冲运动的效果与匀速运动的区别就是速度会越来越小,起到一个缓冲的作用。

缓冲运动的原理:步长由距离来决定,离目标位置越来越近时步长会越来越小。步长 =(目标值-当前值)/缩放比例。

<style>
        .box{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
        }
   </style>


    <button>缓存动画</button>
    <div class="box">

js代码

<script>
        var btn = document.querySelector('button') //获取按钮
        var box = document.getElementsByClassName('box')[0] //获取div
        btn.onclick = function(){  //给按钮加点击事件
            let timer = setInterval(() => {   //添加定时器
                var currentX = box.offsetLeft  //获取div当前的x偏移量
                var step = (400-currentX)/10  //步长  步长越小速度越慢
                step = step>0?Math.ceil(step):Math.floor(step) //如果步长大于0向上取整 如果小于向下取整 保持速度在一段区间是匀速的
                box.style.left = currentX+step+'px'   //改变div的位置
                if (Math.abs(400-currentX)<=Math.abs(step)) { //如果到达目标位置清除定时器
                    clearInterval(timer)
                }
            }, 60);
        }
    </script>

效果图

 三.链式运动

当一个运动执行完成之后,在继续执行另一个运动,我们成为链式运动。(相当于在回调函数里面执行后面的操作,回调函数在我后面提到)

示例:一个div运动到400px然后在把透明度慢慢变成0.5宽度增加一定宽度

<style>
        .box{
            width: 500px;
            height: 500px;
            background: pink;
            position: relative;
        }
        .innerBox{
            height: 100px;
            background-color: red;
            position: absolute;
        }
    </style>

    <button>action</button>
    <div class="box">
        <div class="innerBox"></div>
    </div>

js代码(这里我引入了一个js封装的缓冲运动方法,后面单独发了我)

<script src="js/animatedPlus.js"></script>
    <script>
        //获取按钮
        let btn = document.querySelector('button')
        btn.onclick = function(){ //给按钮加点击事件
            let innerBox = document.querySelector('.innerBox') //获取innerBox盒子
            innerBox.style.width = '100px' //给盒子加宽度
            animated(innerBox,{"height":500,"left":400,"opacity":0.5},function(){  //调用封装的方法
                animated(innerBox,{"width":500})
            })
        }
    </script>

效果图

四.抛物线运动

用定时器,进行间隔性刷新,更新小球位置,以实现动态效果,运动物体的left以及top都要一直变化。

实例:

<style>
        div{
            width: 30px;
            height: 30px;
            background: blue;
            border-radius: 50%;
            position: absolute;
        }
    </style>

<div></div>

js代码(js封装地址js缓冲运动的封装_fuyuyuki的博客-CSDN博客

<script src="js/animatedPlus.js"></script>
    <script>
        let div =document.querySelector('div')
        document.onclick = function(e){
            e = e || windwo.event
            let targetX = e.clientX
            let targetY = e.clientY
            let timer = setInterval(() => {
                let currentX = parseFloat(getStyle(div,'left'))
                let currentY = parseFloat(getStyle(div,'top'))
                let stepX = (targetX-currentX)/5
                stepX = stepX>0?Math.ceil(stepX):Math.floor(stepX)
                let stepY = (targetY-currentY)/10
                stepY = stepY>0?Math.ceil(stepY):Math.floor(stepY)
                div.style.left = currentX+stepX+"px"
                div.style.top = currentY+stepY+"px"
                if (Math.abs(targetX-currentX)<=Math.abs(stepX) && Math.abs(targetY-currentY)<=Math.abs(stepY)) {
                    clearInterval(timer)                  
                }
            }, 200);
        }
    </script>

效果图

 五.圆周运动

运用js实现圆周运动,要注意三点:
1:物体运动的圆心
2:物体运动的半径
3:物体发生运动的速度

<style>
        div{
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background: red;
            position: absolute;
            left: 500px;
            top: 400px;
        }
    </style>

<div></div>
    <button>圆周运动</button>

js代码

<script>
        //获取div
        var div  = document.querySelector('div');
        //获取按钮
        var btn  = document.querySelector('button')
        btn.onclick = function(){
            //确定圆心
            let x =500;
            let y =400;
            //确定半径
            let r =100;
            let i = 0; //代表转过的弧度
            setInterval(function(){
                i++;
                let radian = i * Math.PI/180; //弧度
                let a = Math.sin(radian) * r; 
                let b = Math.cos(radian) * r; 
                //逆时针运动
                // let a = Math.cos(radian) * r; 
                // let b = Math.sin(radian) * r;
                //让红色小方块做顺时针圆周运动 
                div.style.left = x + a + 'px';
                div.style.top = y - b + 'px';
            },10)
        }
    </script>

效果图

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值