day16 运动(上)

概述 :

  运动 ( 动画 ) , 就是操作对应的dom元素发生变化 , ( 这个变化要持续多次 ( 修改样式 ) ) , 每次间隔的时间是你肉眼察觉不到的 ( 时间比较短 ) . 当到达目标位置就停止 , 这个就是所谓的动画

主要实现原理

  • 利用定时器定时操作dom的样式

  • 当设置的目标值到达后 清除定时器

运动三大要素

  • 当前值 ( current )

  • 变化值 ( step )

  • 目标值 ( target )

主要动画

匀速运动 ( 每次变化的值是一样的 )
  • 示例 ( 操作div的宽度变化 )
复制代码
//匀速运动每次变化的值 是固定的
//获取页面上的元素
var div = document.querySelector('div')
//获取当前的样式
var current = parseInt(getStyle(div).width)
//设置目标值
var target = 500
//设置步长(变化值)
var step = 10
//给div设置点击事件,并添加定时器,通过定时器来实现样式的变化
div.onclick=function(){
    var timer = setInterval(()=>{
        //判断当前值是否等于目标值,相等就清除定时器
        if(current == target){
            clearInterval(timer)
        }else{
            //否则给div设置样式
            //每次将当前值加上变化值,完成变化
            current += step
            div.style.width = current + 'px'
        }
    },40)
    }
//封装一个获取页面上样式的方法
function getStyle(element){
    if(window.getComputedStyle){
        return window.getComputedStyle(element,'')
    }else{
        return element.currentStyle
    }
}    
复制代码
  • 封装的匀速运动代码 ( 如果设置值不一样 , 那么动画将不会一起完成 )
复制代码
//匀速运动的封装方法
//element表示移动的元素 , target是目标位置{width:500,left:500}
function yunsu(element,targetObj){
    //遍历targetObj
    for(let key in targetObj){//key是字符串
        //获取当前样式
        let current = parseFloat(getStyle(element)[key])
        //获取目标值
        let target = targetObj[key]
        //获取步长(变化值)
        let step = target - current >0?10:-10
        //设置定时器,没有添加事件会自动开启定时器
        let timer = setInterval(()=>{
            //判断是否有到达目标位置,到了就清除清时期
            if(current == target){
                clearInterval(timer)
            }else{
                //否则给元素设置样式
                //更改每次变化后的值(当前值+步长赋给当前值继续下一轮遍历)
                current += step
                element.style[key]=current + 'px'
            }
        },40)
    }
}
//封装一个获取页面上样式的方法
function getStyle(element){
    if(window.getComputedStyle){
        return window.getComputedStyle(element,'')
    }else{
        return element.currentStyle
    }
}
复制代码
缓冲运动 ( 每次变化的值是越来越小的 )
  • 示例 ( 操作div的位置变化 )
复制代码
//div位置变化,以缓冲运动进行变化
//1.获取div
var div = document.querySelector('div')
//2.1.获取当前样式
let current = parseInt(getStyle(div).left)
//3.设置目标值
let target = 500
//5.给div添加点击事件并设置定时器
div.onclick=function(){
    let timer = setInterval(()=>{
        //6.判断当前样式值是否等于目标样式值,相等就清除定时器
        if(current == target){
            clearInterval(timer)
        }else{
            //4.设置步长
            //变化值应是(目标值-当前)/10,因为每次的值都会除10会出现小数点然后无线增加,导致永远道不了目标值,所以要取下整数
            let step = Math.ceil((target - current)/10)
            //7.不相等就先获取当前的变化样式,再赋值给div
            current += step
            div.style.left = current + 'px'
        }
    },40)
}
//2.0封装一个获取页面上样式的方法
function getStyle(element){
    if(window.getComputedStyle){
        return window.getComputedStyle(element,'')
    }else{
        return element.currentStyle
    }
}
复制代码
  • 缓冲封装
复制代码
//封装一个获取样式的方法
function getStyle(element){
    if(window.getComputedStyle){
        return window.getComputedStyle(element,'')
    }else{
        return element.currentStyle
    }
}
//封装缓存动画的方法,参数有元素和目标值对象
function buffer(element,targetObj){
    //判断是否有元素,没有就直接报错,不往下走
    if(!element){
        throw new Error('元素不能少')
    }
    //给这个元素设置定时器
    element.timer=setInterval(()=>{
        //默认都能执行
        var flag = true
        //遍历目标值对象
        for(let key in targetObj){
            //取出当前样式值
            let current = parseInt(getStyle(element)[key])
            //取出目标值
            let target = targetObj[key]
            //判断当前是否是宽高及位置的变化
            if(key == 'width' || key== 'height' || key =='left' || key == 'top'){
                //是就先取出变化值,负值向下取整,正值向上取整
                let step = target-current>0?Math.ceil((target-current)/10):Math.floor((target-current)/10)
                //把变化值赋给当前值,并设置给元素
                current += step
                element.style[key] = current + 'px'
            }
            //判断是否为透明度的变化
            if(key == 'opacity'){
                //是就先取出变化值,负值向下取整,正值向上取整
                let step = target - current>0?Math.ceil((target-current)*1000/10):Math.floor((target-current)*1000/10)
                current += step /1000
                element.style[key] = current
            }
            //如果是层高就直接赋值
            if(key == 'zIndex'){
                element.style[key] = target
            }
            //如果当前值不等于目标值,就是false
            if(current != target){
                flag = false
            }
        }
        //如果全部走完了,就清除定时器
        if(flag){
            clearInterval(element.timer)
        }
    },40)

}
复制代码

 

posted @   邱你咋滴  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示