首页 > 其他分享 >day16 运动(上)

day16 运动(上)

时间:2022-10-24 21:23:36浏览次数:38  
标签:target element current day16 let key 运动 div

概述 :

  运动 ( 动画 ) , 就是操作对应的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)

}

 

标签:target,element,current,day16,let,key,运动,div
From: https://www.cnblogs.com/itlulu/p/16823038.html

相关文章

  • day17.运动(下)+轮播图 .笔记
    链式动画就是动画执行完接另一个动画,不断的进行链接封装进阶(通过传入回调函数完成链式运动)//0.缓冲运动的封装//element表示元素,targetObj表示目标对象,ca......
  • SYSU-SSE 3D游戏编程与设计 学习笔记(2)--空间与运动
    前言中山大学软件工程学院3D游戏编程与设计课程学习记录博客游戏代码:游戏代码简答题游戏对象运动的本质是什么游戏对象的运动过程本质上就是游戏对象transform......
  • day16 正则表达式 & 反射 & Java内存模型(JMM)
    day16class1)获取一个类的所有信息(变量、方法、构造方法)2)创建类对象newInstance()Field1)访问变量或给变量赋值Method1)执行具体类对象的指定方法3.Method(获取方法对......
  • day 16 运动(上)
    概述:运动也就是动画,操作对应的dom元素持续多次的修改样式,并且有比较短的时间的间隔(肉眼无法察觉),达到目标位置后停止,这就是动画主要实现原理利用定时器定时操作dom的样......
  • day17 运动(下)
    day17运动(下)链式动画动画执行完接另一个动画不断进行链接。封装进行(通过传入回调函数完成链式运动)//缓冲运动封装//element表示当前的元素target表示目标对象callb......
  • 基于HTML体育运动兵乓球网站项目的设计与实现【学生网页设计作业源码】
    ......
  • 《剑指offer》day16
    把数组排成最小的数题目描述思路本题是遇到的第一道自定义排序的题这类题目关键是要理清排序规则,比如本题中"30"+"3"<"3"+"30",所以"30"<"3"字符串化+插入排序将......
  • java_day16
    Java基础Java集合框架Map接口用于存储任意键值对key-value键:无序、无下标、不允许重复值:无序、无下标、运行重复方法put(key,value)将对象存入到集合中,关联键......
  • 动作捕捉用于仿生机器人的运动规划
    随着机器人、三维动画、虚拟现实等产业的发展,关于仿生机器人的动作研究早已成为重要的热点课题。如何让机器人或虚拟人物做出合理、流畅的姿态呢?这就要涉及到逆运动学算法......
  • VL53L1CBV0FY(测距传感器)ISM330DHCXTR(运动传感器) 概述 应用
    概述1、VL53L1X飞行时间(ToF)测距传感器是最先进的激光测距传感器,进一步丰富了STFlightSense系列产品。该款远距离测距微型ToF传感器测距精度达4米,频率高达50Hz。VL53L1......