32DOM高级操作 JS动画制作及封装

32DOM高级操作 JS动画制作及封装

一、运动的原理

让物体沿着某个方向随时间的变化改变位置,可以利用计时器setInterval,且间隔时间为30ms,因为电影播放每秒24帧,人眼就识别不出卡顿了,但是对于电脑来说,处理速度相对较快,需要每秒30帧以上才会显得流畅

二、缓冲运动

//缓冲动画公式

step = (target - beigin)/10

//走到最后几步的时候	Math.ceil(step)
//走到最后几步的时候	Math.floor(step)

三、使用计时器完成动画

布局

<button>盒子向左移动</button>
<button>盒子向右移动</button>
<div></div>

样式

* {
	margin: 0;
	padding: 0;
}

div {
	width: 200px;
	height: 200px;
	background: pink;
	position: absolute;
}

js

//获取button和div节点

var btn = document.querySelectorAll("button")
var div = document.querySelector("div")

//点击第一个按钮

btn[0].onclick = function(){
    
    //使用及时器之前,先清除计时器,以免多次点击按钮会使计时器叠加
    
	clearInterval(div.timer)
    
    //设置步长,且步长为缓冲运动的步长
    
	var step = Math.floor((0 - div.offsetLeft)/10)
    
    //使用计时器,时间为30ms,用于物体定时移动
    
	div.timer = setInterval(function(){ 
		div.style.left = div.offsetLeft - step + "px"
        
        //当移动到0位置时结束移动
        
		if(div.offsetLeft < 0){
			div.style.left = 0
			clearInterval(div.timer)
		}
	}, 30)
}

//点击第二个按钮

btn[1].onclick = function(){
    
    //使用及时器之前,先清除计时器,以免多次点击按钮会使计时器叠加
    
	clearInterval(div.timer)
    
    //设置步长,且步长为缓冲运动的步长
    
	var step = Math.ceil((800 - div.offsetLeft)/10)
    
    //使用计时器,时间为30ms,用于物体定时移动
    
	div.timer = setInterval(function(){ 
		div.style.left = div.offsetLeft + step + "px"
        
        //当移动到800位置时结束移动
        
		if(div.offsetLeft > 800){
			div.style.left = 800 + "px"
			clearInterval(div.timer)
		}
	}, 30)
}

四、将动画封装

封装的动画

//定义animation动画函数
//ele	需要绑定的节点	object
//target	需要移动的距离	number
//attr	需要移动的方向	string

function animation(ele, target, attr) {
    
    //使用及时器之前,先清除计时器,以免多次点击按钮会使计时器叠加
    
	clearInterval(ele.timer)
    
    //使用计时器,时间为30ms,用于物体定时移动
    
	ele.timer = setInterval(function () {
        
        //设置步长,且步长为缓冲运动的步长
        
		var step = (target - parseFloat(getStyle(ele, attr)))/10
        
        
        //走到最后几步的时候需要处理的步长
        
		step = step > 0 ? Math.ceil(step) : Math.floor(step)
        
        //设置定位的位置
        
		ele.style[attr] = parseFloat(getStyle(ele, attr)) + step + "px"
        
        //当到达目的位置是停止计时器的运行
        
        if(parseFloor(ele.style[attr]) == target){
            clearInterval(ele.timer)
        }
	}, 30)
    
    //定义getStyle函数。获取想要的位置参数的兼容写法
    
	function getStyle(ele, attr){
        
        //非IE写法
        
		if(window.getComputedStyle){
			return getComputedStyle(ele, null)[attr]
		}
        
        //IE写法
        
		else{
			return ele.currentStlye[attr]
		}
	}
}

那么想要计时器完成 三 的计时器的动画只需要在js改变为

//获取button和div节点

var btn = document.querySelectorAll("button")
var div = document.querySelector("div")

//点击第一个按钮引用函数animation

btn[0].onclick = function(){
	animation(div, 0, "left")
}

点击第二个按钮引用函数animation

btn[1].onclick = function(){
	animation(div, 800, "left")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值