2020-09-13---js中的运动

52 篇文章 0 订阅

js文件

let timer = null;
//匀速运动
//01从左向右走,走向目标
function sport01(obj){
    clearInterval(timer);
    timer = setInterval(function(){
        if(obj.offsetLeft >= 500){
            clearInterval(timer);
        }else{
            obj.style.left = obj.offsetLeft + 10 + 'px';
        }
    },50)    
}

//02从右向左走,走向目标
function sport02(obj){
    clearInterval(timer);
    timer = setInterval(function(){
        if(obj.offsetLeft <= 500){
            clearInterval(timer);
        }else{
            obj.style.left = obj.offsetLeft - 10 + 'px';
        }
    },50);
}

//03从左向右和从右向左,都能走向目标
//把目标位置,还有加速度都传过来
function sport03(obj,target,speed){
    clearInterval(timer);
    timer = setInterval(function(){
        //这种写法会出现物体在目标边缘抖动的情况
        // if(target - obj.offsetLeft <= 0){
        //     obj.style.left = obj.offsetLeft - speed +'px';
        // }else if(target - obj.offsetLeft >= 0){
        //     obj.style.left = obj.offsetLeft + speed + 'px';
        // }else{
        //     clearInterval(timer);
        // }

        if(obj.offsetLeft === target){
            clearInterval(timer);
        }else{
            obj.style.left = obj.offsetLeft + speed + 'px';
        }
    },50)
}

//04从左向右和从右向左,都能走向目标
//传目标位置
function sport04(obj,target){
    clearInterval(timer);
    timer = setInterval(function(){
        //先判断物体现在在目标位置的左还是右,进而确定加速度为正还是为负
        var speed = obj.offsetLeft > target ? -10 : 10;
        if(obj.offsetLeft === target){
            clearInterval(timer);
        }else{
            obj.style.left = obj.offsetLeft + speed + 'px';
        }
    },50)
}

//05从左向右和从右向左,都能走向目标,解决加速度和位移差不是整数倍关系问题(物体会在目标位置边缘抖动的问题)
//传目标位置
function sport05(obj,target){
    clearInterval(timer);
    timer = setInterval(function(){
        //先判断物体现在在目标位置的左还是右,进而确定加速度为正还是为负
        var speed = obj.offsetLeft > target ? -7 : 7;
        if(Math.abs(obj.offsetLeft - target) < Math.abs(speed)){
            obj.style.left = target + 'px';
            clearInterval(timer);
        }else{
            obj.style.left = obj.offsetLeft + speed + 'px';
        }
    },50)
}

//缓冲运动(速度越来越慢)
//06从左向右和从右向左,都能走向目标
//传目标位置
function sport06(obj,target){
    clearInterval(timer);
    timer = setInterval(function(){
        //缓冲运动,速度不是一个固定的值,用物体当前的位置减去目标的位置,再除以一个固定的值,就会得到一个变化的速度,因为当前的位置在不断的变化,所以当前的位置减去目标的位置的差是一个变化的数,且这个数越来越小。
        var speed = (target - obj.offsetLeft ) / 8 ;
        //处理小数问题  (因为到了最后速度有可能变为一个不变的小数,导致永远到不了目标位置),让小数都取整,每次减1,知道减到目标位置。
        // 速度为正的时候,向上取整,为负的时候,向下取整
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
        //缓冲一定能到目标位置,判断条件为是否到了目标位置,到了就停止计时器。
        if(obj.offsetleft === target + 'px'){   
            clearInterval(timer);
        }else{
            obj.style.left = obj.offsetLeft + speed + 'px';
        }
    },50)
}

let alpha = 100;//假设当前的opacity值为1,因为计算机处理小数有问题,所以先扩大100倍,最终再除以100.
//淡入淡出效果(透明度的变化)
//07鼠标移入,透明度改变
function sport07(obj,target){
    clearInterval(obj.timer);
    obj.timer = setInterval(function(){
        //计算速度
        var speed = (target - alpha) / 8 ;
        //处理小数
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
        if(obj.style.opacity === target ){   
            clearInterval(obj.timer);
        }else{
            alpha += speed;
            obj.style.opacity = alpha / 100;
            // obj.style.opacity = alpha / 100 + speed;
            obj.style.filter = 'alpha(opacity = ' + alpha + ')';
        }
    },50)
}

//宽度变化
//08鼠标移入,宽度改变
function sport08(obj,target){
    clearInterval(obj.timer);
    obj.timer = setInterval(function(){
        //计算速度
        var speed = (target - obj.offsetWidth) / 8 ;
        //处理小数
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
        if(obj.style.offsetWidth === target ){   
            clearInterval(obj.timer);
        }else{
            obj.style.width = obj.offsetWidth + speed + 'px';
        }
    },50)
}

//宽度变化 
//兼容问题 当盒子加了border之后,盒子的宽度就回不去了
//09鼠标移入,宽度改变
function getStyle(obj,attr){
    return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,1)[attr]
}
function sport09(obj,target){
    clearInterval(obj.timer);
    obj.timer = setInterval(function(){
        //获取当前宽度
        var cur = parseInt( getStyle(obj,'width') );//获取回来的宽度有单位,取整,去掉单位。
        // var cur = getStyle(obj,'width');
        //计算速度
        var speed = (target - cur) / 8 ;
        //处理小数
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
        if(cur === target ){   
            clearInterval(obj.timer);
        }else{
            obj.style.width = cur + speed + 'px';
        }
    },50)
}

//多物体透明度变化
//多个物体不能共用一个透明度
//10鼠标移入,透明度改变
function sport10(obj,target){
    clearInterval(obj.timer);
    obj.timer = setInterval(function(){
        //当前透明度
        //  获取回来是字符串 '0.5462' 先变为数字parseFloat  再乘以100然后取整
        var cur = parseInt(parseFloat(getStyle(obj,'opacity')) * 100 );
        //计算速度
        var speed = (target - cur) / 8 ;
        //处理小数
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
        if(cur === target ){   
            clearInterval(obj.timer);
        }else{
            obj.style.opacity = (cur + speed) / 100;
            // obj.style.opacity = alpha / 100 + speed;
            obj.style.filter = 'alpha(opacity = ' + cur + speed + ')';
        }
    },50)
}

//多物体各种样式变化
//多个物体不能共用一个透明度
//11鼠标移入,对应属性改变
//需要把要改变的属性传过来
function sport11(obj,attr,target){
    clearInterval(obj.timer);
    obj.timer = setInterval(function(){
        //当前透明度
        //  获取回来是字符串 '0.5462' 先变为数字parseFloat  再乘以100然后取整
        var cur = attr === 'opacity' ? parseInt(parseFloat(getStyle(obj,'opacity')) * 100 ) : parseInt( getStyle(obj,attr) );
        //计算速度
        var speed = (target - cur) / 8 ;
        //处理小数
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
        if(cur === target ){   
            clearInterval(obj.timer);
        }else{
            if(attr === 'opacity'){
                obj.style.opacity = (cur + speed) / 100;
                // obj.style.opacity = alpha / 100 + speed;
                obj.style.filter = 'alpha(opacity = ' + cur + speed + ')';
            }else{
                //必须使用[]访问attr属性
                obj.style[attr] = cur + speed + 'px';
            }
        }
    },50)
}

应用案例:
1.多物体多属性变化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>18多物体多属性变化</title>
    <style>
        #box{
            width: 100px;
            height: 100px;
            background: red;
            margin: 10px;
            border: 1px solid black;
            opacity: 1;
            filter: alpha(opacity = 100);
            /* position: absolute; */
        }
    </style>
</head>
<body>
    <div id="box">变宽</div>
    <div id="box">变高</div>
    <div id="box">透明</div>
    <div id="box">变粗</div>
    <div id="box">变大</div>
    <script src="js/sport.js"></script>
    <script>
        var o_box = document.querySelectorAll('#box');
        o_box[0].onmouseenter = function(){
            sport11(this,'width',400);
        }
        o_box[0].onmouseout = function(){
            sport11(this,'width',100);
        }

        o_box[1].onmouseenter = function(){
            sport11(this,'height',400);
        }
        o_box[1].onmouseout = function(){
            sport11(this,'height',100);
        }
       
        o_box[2].onmouseenter = function(){
            sport11(this,'opacity',30);
        }
        o_box[2].onmouseout = function(){
            sport11(this,'opacity',100);
        }

        o_box[3].onmouseenter = function(){
            sport11(this,'borderWidth',40);
        }
        o_box[3].onmouseout = function(){
            sport11(this,'borderWidth',1);
        }

        o_box[4].onmouseenter = function(){
            sport11(this,'fontSize',40);
        }
        o_box[4].onmouseout = function(){
            sport11(this,'fontSize',1);
        }
    </script>
</body>
</html>

2.移入移出

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>19仿飞秋</title>
    <style>
        #box{
            width: 200px;
            height: 500px;
            background-color: pink;
            position: absolute;
            left: -200px;
            top: 100px;
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <div id="box"></div>
    <script src="js/sport.js"></script>
    <script>
        var o_box = document.querySelector('#box');
        // o_box.onmouseenter = function(){
        //     sport05(this,0);
        // }
        // o_box.onmouseout = function(){
        //     sport05(this,-200);
        // }

        o_box.onmouseenter = function(){
            sport11(this,'left',0);
        }
        o_box.onmouseout = function(){
            sport11(this,'left',-200);
        }
    </script>
</body>
</html>

3.分享到

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>20分享到</title>
    <style>
        #box{
            width: 200px;
            height: 400px;
            background-color: pink;
            position: absolute;
            left: -200px;
            top: 100px;
        }
        #sp{
            width: 20px;
            height: 70px;
            background-color: grey;
            position: absolute;
            left: 200px;
            top: 160px;
        }
    </style>
</head>
<body>
    <div id="box">
        <span id="sp">分享到</span>
    </div>
    <script src="js/sport.js"></script>
    <script>
        //当鼠标移入span让box出来,鼠标移出span让box回去,会发生抖动现象,利用冒泡的原理,把移入事件加在box上,当鼠标滑入span的时候,冒泡到父级box。
        // var o_sp = document.querySelector('#sp');
        var o_box = document.querySelector('#box');
        o_box.onmouseenter = function(){
            sport06(o_box,0);
        }
        o_box.onmouseout = function(){
            sport06(o_box,-200);
        }
    </script>
</body>
</html>

效果
默认:
在这里插入图片描述
鼠标滑入‘分享到’
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值