封装了一个JS方法,支持元素的基本动画:宽、高、透明度...等,也支持链式动画和同时运动。

获取元素的属性的函数并进行了兼容性处理:

     function getStyle(obj, attr) {
if(obj.currentStyle){ //IE浏览器
return obj.currentStyle[attr];
}else{ //chrome、firefox等浏览器
return getComputedStyle(obj,null)[attr];
}
}

动画函数:

     var timer = null;  // 声明一个timer来存储定时器
function animate(obj, json, callback) {
clearInterval(obj.timer);
obj.timer = setInterval(function() {
/*
* 当我们改变多个属性时,如果其中一个属性已经达到目标值,就会清除定时器,就会导致其他没有达到目标值的属性也会停止
* 为了解决这个问题,我们声明一个节流阀flag,让它为true
* 判断是否还有没达到目标值的属性,如果还有,就让flag为false(关闭节流阀),让定时器继续执行
* 当所有属性都达到了目标值时,才执行清除定时器那一步
*/
var flag = true;
for(var attr in json) { // for...in...遍历对象
var icur = 0; // 存储获取过来的属性值
if(attr == 'opacity') { // 判断获取过来的属性是否为opacity
icur = Math.round(parseFloat(getStyle(obj, attr)) * 100); // float会有小误差,所以需要四舍五入一下
} else {
icur = parseInt(getStyle(obj, attr)); // 获取过来的值可能带单位,所以需要用到parseInt()
}
var speed = (json[attr] - icur) / 10; // 速度 逐渐变慢(也可以设为固定值实现匀速运动)
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); // speed并不总是整数,会导致和目标值不相等,所以需要对speed进行取整,大于0向上取整,小于0向下取整
if(icur != json[attr]) { // 判断是否还有属性没有达到目标值
flag = false;
}
if(attr == 'opacity') { // opacity是没有单位的,所以在这里需要判断一下
obj.style.filter = 'alpha(opacity = '+ (icur + speed) +')';
obj.style.opacity = (icur + speed) / 100; // opacity别忘了除以100
} else {
obj.style[attr] = icur + speed + 'px'; // 原来的值加上速度赋值给属性
}
}
if(flag) { // 当所有属性都达到目标值,即flag为true时,再停止定时器
clearInterval(obj.timer);
callback && callback(); // 判断是否有回调函数,有的话就执行
}
}, 25)
}

接下来我们来测试一下:

     var box = document.querySelector('.box');
box.addEventListener("mouseover", function() {
animate(this, {width: 300, height: 200, opacity: 100}, function() {
animate(box, {width: 200, height: 100, opacity: 30});
});
});

结果如下:

原生JS实现动画函数的封装的更多相关文章

  1. js-特效部分学习-offsetParent、scrollHeight 、动画函数的封装

    1. offsetParent  获取的最近的定位的父元素   offsetLeft/offsetTop  是相对于offsetParent的距离 offsetHeight/offsetWidth 获 ...

  2. 移动端 transition动画函数的封装(仿Zepto)以及 requestAnimationFrame动画函数封装(仿jQuery)

    移动端 css3 transition 动画 ,requestAnimationFrame 动画  对于性能的要求,h5优先考虑: 移动端 单页有时候 制作只用到简单的css3动画即可,我们封装一下, ...

  3. js 变速动画函数

    //获取任意一个元素的任意一个属性的当前的值---当前属性的位置值 function getStyle(element, attr) { return window.getComputedStyle ...

  4. Node.js用ES6原生Promise对异步函数进行封装

    Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初 ...

  5. js变速动画函数封装 回调函数及层级还有透明度

    //点击按钮,改变宽度到达一个目标值,高度到达一个目标值 //获取任意一个元素的任意一个属性的当前的值---当前属性的位置值 function getStyle(element, attr) { re ...

  6. 原生javascript 基础动画函数封装(二)

    <!DOCTYPE html> <html> <head> <title></title> <style type="tex ...

  7. 原生javascript 基础动画函数封装(一)

    <!DOCTYPE html> <html> <head> <title></title> <style type="tex ...

  8. 移动端滑屏全应用【四】移动端动画贞动画函数mTween封装

    首先此函数是基于大家都知道的Tween动画算法的,在此基础上使用了三中讲到的兼容版动画贞,可以使动画变得更流畅. 1. 首先要记得引入Tween.js 2. 引入mTween.js 3. 调用 * m ...

  9. 编写原生JS的insertAfter函数

    DOM里有insertBefore函数,但没有insertAfter函数,所以自己编写一个该函数: function insertAfter(newElement, targetElement){ v ...

随机推荐

  1. Protues7.8仿真软件有中文路径无法正常运行怎么办?

    Protues7.8是一款功能强大的单片机仿真软件,在我们的学习生活中经常会用的到,在装软件时明明已经装好了,却不能报错跳出两行红字,让人心痛. 一般都是因为账户名字是中文的问题,这个软件对中文不兼容 ...

  2. linux常见配置文件路径

    1:/etc/sysconfig/i18n                        (语言配置文件). 2:/etc/sysconfig/network-scripts/ifcfg-eth0   ...

  3. React躬行记(15)——React Hooks

    Hook(钩子)是React v16.8新引入的特性,能以钩子的形式为函数组件附加类组件的状态.生命周期等特性.React的类组件有难以拆分.测试,状态逻辑分散,难以复用等问题,虽然可以通过渲染属性( ...

  4. Celery框架实现异步执行任务

    Celery 官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/la ...

  5. Java工作流引擎-中间件模式代码集成

    关键词:工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流  bpm工作流系统  java工作流主流框架  自定义工作流引擎 表单设计器  流程设计器 前端代码集成步骤 ...

  6. JVM虚拟机详解+Tomcat性能优化

    1.JVM(java virtual mechinal) ()JVM有完善的硬件架构,如处理器.堆栈.寄存器当,还具有相应的指令系统. ()JVM的主要工作时解释自己的指令集(即字节码),并映射到本地 ...

  7. VLAN实验4(在eNSP上利用单臂路由实现VLAN间路由)

    原理概述: 以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响*并增强 网络的安全性和可管理性.其缺点足同时也严格地隔离了不同VLAN之间的任何二层流量,使分属于不同VLAN的用户 不能直 ...

  8. Python开发GUI工具介绍,实战:将图片转化为素描画!

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  9. IJKPlayer如何支持https

    给ijkplayer安装支持https 首先使用如下终端命令安装yasm 第一: 1. curl http://www.tortall.NET/projects/yasm/releases/yasm- ...

  10. 使用.NET Core创建Windows服务 - 使用.NET Core工作器方式

    原文:Creating Windows Services In .NET Core – Part 3 – The ".NET Core Worker" Way 作者:Dotnet ...