LiYajie web前端

web前端-js原生动画

2017-03-19  本文已影响44人  LiYajie
  • 匀速动画, 顾名思义就是速度不变的动画Demo 地址
<button id="btn">开始</button>
<div class="box" id="box"></div>

下面的代码是修改一个盒子的 left 相当于修改这个盒子的位置, 所以盒子需要进行绝对定位

var btn = document.getElementById('btn');
var box = document.getElementById('box');

// 开始位置
var begin = 0;
// 结束位置
var end = 600;
// 速度
var speed = 5;
// 定时器
var timer = null;
btn.onclick = function() {
  clearInterval(timer);
  timer = setInterval(function(){
    begin += speed;
    obj.style.left = begin + 'px';
    if(begin >= target) {
      box.style.left = target + 'px';
      clearInterval(timer);
    }
  }, 50)
}

改进后的代码, 主要是把开始位置使用了offsetLeft来改进

var btn = document.getElementById('btn');
var box = document.getElementById('box');

var timer = null;
var target = 600;
var speed = 5;
btn.onclick = function(){
  clearInterval(timer);
  timer = setInterval(function(){
     begin = box.offsetLeft;
     begin += speed ;
     box.style.left = begin + 'px'
    if(begin >= target) {
      box.style.left = target+'px';
      clearInterval(timer);
    }
  },50)
}

封装匀速动画函数

// 匀速动画函数
// obj: 要进行运动的 dom 对象
// target : 运动到的目标位置
// speed : 运动速度
function constant(obj,target,speed) {
clearInterval(obj.timer);
var myspeed = target > obj.offsetLeft ? speed : -speed;
obj.timer = setInterval(function(){
    obj.style.left = obj.offsetLeft + myspeed + 'px';
    if (Math.abs(obj.offsetLeft - target) < speed) {
        obj.style.left = target + 'px';
        clearInterval(obj.timer);
    }
},20)
}
  • 缓动动画, 就是动画的速度是由快变慢 Demo 地址

缓动动画公式(目标位置 - 开始位置) / 系数 = 速度 这里这个速度是每次减小的.

封装一个简单的缓动动画的函数库

<button id="btn">开始</button>
<button id="goback">回去</button>
<div class="box" id="box"></div>
* {
    margin: 0;
    padding: 0;
}

.box {
    position: absolute;
    width: 100px;
    height: 100px;
    background-color: #0094ff;
}
window.onload = function() {
    var btn = document.getElementById('btn');
    var back = document.getElementById('goback');
    var box = document.getElementById('box');
    btn.onclick = function() {
        move(box, 400);
    }
    back.onclick = function() {
        move(box, 0)
    }

    function move(obj, target) {
        clearInterval(obj.timer);
        obj.timer = setInterval(function() {
            var begin = obj.offsetLeft;
            var speed = (target - begin) * 0.2;
            speed = target > begin ? Math.ceil(speed) : Math.floor(speed);
            obj.style.left = begin + speed + 'px';
            if (target == begin) {
                clearInterval(obj.timer);
            }
        }, 50)
    }
}

这里就说下这两种简单的动画实现, 其实还有多值动画(就是同时改变多个属性, 如改变位置和宽高) , 这里就先不介绍了, 期待下一篇吧.


有问题@me

上一篇下一篇

猜你喜欢

热点阅读