JS动画完美框架

html部分
<!DOCTYPE html>
<html lang="en">
<head>
<link href="../css/default.css" rel="stylesheet">
<script src="../js/main.js">
</script>
<meta charset="utf-8">
<title>
Document
</title>
<script type="text/javascript">
window.onload=function(){
var div=document.getElementsByTagName('div');
for(var i=0;i<div.length;i++){
div[i].timer=null; div[i].onmouseover = function() {
// var _this = this;
// var _this2 = _this;
startMove(this, {width:400,height:400,opacity:100});
// startMove(_this, 400, 'height', function() {
// startMove(_this2, 100, 'opacity');
// });
// }); //用this可以调取当前的节点对象
};
div[i].onmouseout = function() {
// var _this = this;
// var _this2 = _this;
startMove(this,{width:200,height:200,opacity:30});
// startMove(_this, 200, 'height', function() {
// startMove(_this2, 200, 'width');
// });
// }); //用this可以调取当前的节点对象
}; } };
</script>
</meta>
</link>
</head>
<body>
<div id="div1">
</div>
<div id="div2">
</div>
</body>
</html>
js部分
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr];//针对IE获取样式
} else {
return getComputedStyle(obj, false)[attr];//针对非IE获取样式。
}
} //获取样式的好处,是防止出现obj.offsetWidth与boder这样的Bug。
function startMove(obj, json, fn) { //iTarget是具体的数字,attr是宽或高或透明度之类的。json[attr],包括2者
clearInterval(obj.timer); //清除计时器
obj.timer = setInterval(function() {
var flag=true;//假设所有都到达了目标
for (var attr in json) { //用json,这样的话,可以2个函数同时运行。
var icur = 0;
var speed = 0;
if (attr == 'opacity') {
icur = Math.round(parseFloat(getStyle(obj, attr)) * 100); //这里获取到的是透明度
} else {
icur = parseInt(getStyle(obj, attr)); //因为获取到的宽或者高是小数,所以需要强制转换下,这里获取到的是宽高之类的
} /*上面部分是获取具体的值,及是否是透明度*/
speed = (json[attr] - icur) / 8; //因为这里的attr不能直接代表obj.offsetLeft,要用样式去获取.
//json[attr]代替iTarget《==》speed=(iTarget-obj.offsetLeft)/8
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(json[attr] != icur) {
flag=false;
}
if(attr == 'opacity') {
obj.style[attr] = (icur + speed) / 100; //icur+speed是当前的透明度加上变化的速度
obj.style.filter = 'alpha(opacity' + (icur + speed) + ')';
} else {
obj.style[attr] = icur + speed + 'px';
}
if(flag) {
clearInterval(obj.timer);
if (fn) {
fn(); //如果有回调函数就执行回调函数。
}
}
}
}, 30);
}
css部分
* {
margin:;
padding: 0
}
div {
width: 200px;
height: 200px;
filter: alpha(opacity:30);//针对IE的透明度
opacity: 0.3;//非IE的透明度
background: blue;
margin-bottom: 20px;
}
js 分4部分
1.判断类型,是透明度还是宽或者高
2.算运动速度
3.检测停止
4.清除计时器
JS动画完美框架的更多相关文章
- Hexo - 快速,轻量,强大的 Node.js 博客框架
Hexo 是一个快速,轻量,强大的 Node.js 博客框架.带给你难以置信的编译速度,瞬间生成静态文件:支持 Markdown,甚至可以在 Hexo 中集合 Octopress 插件:只需要一个命令 ...
- js动画学习(五)
九.多属性同时运动 前面的例子都是每个属性单独运动,如果想要多属性同时运动怎么办?比如,我想要一个div的onmouseover事件中宽和高同时变化.下面这个函数是单独变宽: window.onloa ...
- js动画(四)
终于到了最后了,这里要告一段落了,整了个js运动框架,咳咳咳,好冷 啊啊啊啊啊啊,这天气.妈的,工资怎么也不发,啊,说好的 人与人之间的信任呢?哎,气诶,不到150字啊,又是这个梗..怎么办?说些什么 ...
- JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...
- 转 10 个最佳的 Node.js 的 MVC 框架
10 个最佳的 Node.js 的 MVC 框架 oschina 发布于: 2014年02月24日 (33评) 分享到: 收藏 +322 Node.js 是一个基于Chrome JavaScri ...
- Android动画学习(一)——Android动画系统框架简介
2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...
- 【06-23】js动画学习笔记01
<html> <head> <style> * { margin:0; padding:0; } #div1{ width:200px; height:200px; ...
- css动画与js动画的区别
CSS动画 优点: (1)浏览器可以对动画进行优化. 1. 浏览器使用与 requestAnimationFrame 类似的机制,requestAnimationFrame比起setTimeout ...
- CSS VS JS动画,哪个更快[译]
英文原文:https://davidwalsh.name/css-js-animation 原作者Julian Shapiro是Velocity.js的作者,Velocity.js是一个高效易用的js ...
随机推荐
- Delphi locate函数
使用ADO等数据控件的时候,经常会用到 locate 函数,在结果数据集中查询和定位,下面介绍一下: (一) function Locate(const KeyFields: String; cons ...
- 【Bootstrap】 框架 栅格布局系统设计原理
前提条件(Bootstrap 自带) 首先使用这个布局之前要定义一下代码: 这行代码如果不懂,可以搜索一下,总之大致意思就是,被定义的元素的内边距和边框不再会增加它的宽度,不加入的话排版会有问题. 不 ...
- CF540D Bad Luck Island(期望dp)
传送门 解题思路 比较容易的一道期望\(dp\),设\(f[i][j][k]\)表示石头\(i\)个,剪刀\(j\)个,步子\(l\)个.然后转移的时候用组合数算一下就好了. 代码 #include& ...
- Python内置的一个用于命令项选项与参数解析的模块argparse
一.argparse简单使用 我们先来看一个简单示例.主要有三个步骤: 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() ...
- 去除springboot内置tomcat
/** * @author zx * @title: ServletInitializer * @projectName activiti * @description: 解决内置tomcat * @ ...
- Putty 两步代理访问互联网
工作在机房,有时需要访问外网. 此时浏览器需要使用代理服务器,访问的流程如下: 由于SERVER2不能直接访问互联网,而SERVER3可以(机房无法直接访问SERVER3)所以需要两步代理. 配置流程 ...
- LOL遇到登录服务器问题,未能连接到网络原因
通过打开各种浏览器,发现只有IE不能上网,QQ之类的都能上网,不能登入LOL 只有IE是出现:远程计算机或设备将不接受连接 这个问题 解决办法是: 1.win+r --> 输入regedit 打 ...
- 安装mysql时,服务无法启动的问题
1.下载mysql镜像文件:mysql-installer-community-8.0.17.0.msi 2.点击镜像进行安装,一直next即可 3.cmd以管理员身份,进入到安装的mysql安装目录 ...
- 【python】快速排序
快速排序思想和C++的差不多,主要是通过写排序对python的语法更加了解. # 快速排序 def qsort(arr, left, right): if left >= right: retu ...
- Python+Django+SAE系列教程6-----本地配置Django
前五章.我们介绍了Python的语法,本章開始介绍Django. Python的Web框架有非常多,有Django.web2py.tornado.web.py等.我们这里选 则Django.至于这些框 ...