<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>任意值的运动框架</title>
<style>
div {
float: left;
width: 200px;
height: 200px;
margin: 20px;
background-color: yellow;
border: 1px solid black;
font-size: 14px;
filter: alpha(opacity=30); /*IE*/
opacity: 0.3; /*火狐,chrome*/
} </style>
<script> window.onload = function () {
//Div变高
var oDiv1 = document.getElementById('div1'); oDiv1.onmouseover = function () {
startMove(this, 'height', 400);
};
oDiv1.onmouseout = function () {
startMove(this, 'height', 200);
};
//Div变宽
var oDiv2 = document.getElementById('div2'); oDiv2.onmouseover = function () {
startMove(this, 'width', 400);
};
oDiv2.onmouseout = function () {
startMove(this, 'width', 200);
};
//改变文字大小
var oDiv3 = document.getElementById('div3');
oDiv3.onmouseover = function () {
startMove(this, 'fontSize', 30);
};
oDiv3.onmouseout = function () {
startMove(this, 'fontSize', 14);
};
//修改透明度
var oDiv4 = document.getElementById('div4'); oDiv4.onmouseover = function () {
startMove(this, 'opacity', 100);
};
oDiv4.onmouseout = function () {
startMove(this, 'opacity', 30);
}; }; //属性值的获取函数
function getStyle(obj, name) {
if (obj.currentStyle) {
return obj.currentStyle[name];
}
else {
return getComputedStyle(obj, false)[name];
}
} //运动框架
var timer = null;
function startMove(obj, attr, iTarget) { //obj代表对象,attr代表目标属性,iTarget代表设定的属性目标值
clearInterval(obj.timer); //每次执行函数之前清除定时器,保证每次只有一个定时器在工作
obj.timer = setInterval(function () {
var cur = 0;
if (attr == 'opacity') { //透明度属性的获取
cur = Math.round(parseFloat(getStyle(obj, attr)) * 100); //Math.round针对IE7出现小数的问题
}
else {
cur = parseInt(getStyle(obj, attr)); //非透明度的属性值获取
}
var speed = (iTarget - cur) / 6;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); //向上取整(速度为正值)和向下取整(速度为负值)
if (cur == iTarget) {
clearInterval(obj.timer); //达到目标值时清除定时器
}
else {
if (attr == 'opacity') {
obj.style.filter = 'alpha(opacity=' + (cur + speed) + ')'; //IE浏览器
obj.style.opacity = (cur + speed) / 100; //火狐,chrome
}
else {
obj.style[attr] = cur + speed + 'px'; //非透明度属性值
}
}
}, 30);
} </script>
</head>
<body>
<div id="div1">变高</div>
<div id="div2">变宽</div>
<div id="div3">I Love JavaScript!</div>
<div id="div4">修改透明度</div> </body>
</html>

关于JS运动框架,需要注意的点如下:

1. 透明度和非透明度属性值的获取和赋值需要分开设置;一般属性的单位值为px,透明度没有单位;

2. 透明度有兼容性问题;IE浏览器: filter:alpha(opacity=30); 火狐和chrome: opacity = 0.3; 因为透明度的值为小数,所以获取时需要使用parseFloat方法而非parseInt,后者会将透明度的值取0,从而设置无效;

3. 在IE7下,parseFloat()*100得出的值可能为非整数,需要使用Math.round进行四舍五入做兼容处理;

4. speed = iTarget - cur, 得出的值可能为正或为负的小数,如果为正需要向上取整,为负向下取整,如果不进行此操作,将永远无法达到目标值,计算机关于属性值最小计算单位为1px,当 var speed = (iTarget - cur) / 6 的值小于0.5时会被忽略,具体请参考如下例子,当speed=0.4和0.5时,点击按钮时文本框内数值的变化。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#div1{
width:100px;
height:50px;
background-color: yellow;
}
</style>
<script>
window.onload = function () {
var oDiv = document.getElementById('div1');
var oBtn = document.getElementById('btn1');
oBtn.onclick = function () {
var speed = 0.5;
// var speed = 0.4;
oDiv.style.width = oDiv.offsetWidth + speed + 'px';
document.getElementById('text1').value = oDiv.offsetWidth;
}; }
</script>
</head>
<body>
<div id="div1"></div>
<input type="button" id="btn1" value="按钮">
<input type="text" id="text1">
</body>
</html>

关于小数取整的例子

5. 关于定时器:在每次执行运动框架内的定时器之前,应当清除所有定时器,保证每次只有一个定时器在运作,否则多个定时器同时工作会出bug,运行速度越来越快。

6. 当出现相同冗余代码时,可以适当引入参数,简化代码。

JS运动学习笔记 -- 任意值的运动框架(高/宽度,背景颜色,文本内容,透明度等)的更多相关文章

  1. js再学习笔记

    #js再学习笔记 ##基本 1.js严格区分大小写   2.js末尾的分号可加,也可不加   3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...

  2. JS数组学习笔记

    原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...

  3. 并发编程学习笔记(12)----Fork/Join框架

    1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...

  4. Quartz学习笔记:集群部署&高可用

    Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...

  5. Knockout.js快速学习笔记

    原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...

  6. 两万字Vue.js基础学习笔记

    Vue.js学习笔记 目录 Vue.js学习笔记 ES6语法 1.不一样的变量声明:const和let 2.模板字符串 3.箭头函数(Arrow Functions) 4. 函数的参数默认值 5.Sp ...

  7. 两万字Vue.js基础学习笔记(二)

    Vue.js学习笔记(二) 4.模块化开发 ES6模块化的导入和导出 我们使用export指令导出了模块对外提供的接口,下面我们就可以通过import命令来加载对应的这个模块了 首先,我们需要在HTM ...

  8. 从零开始学习Vue.js,学习笔记

    一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...

  9. handlebars.js基础学习笔记

    最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...

随机推荐

  1. curl命令具体解释

    对于windows用户假设用Cygwin模拟unix环境的话,里面没有带curl命令,要自己装,所以建议用Gow来模拟,它已经自带了curl工具,安装后直接在cmd环境中用curl命令就可,由于路径已 ...

  2. 【UML】具体解释六种关系

    UML中包括六中关系.各自是:关联(Association).聚合(Aggregation).组合(Composition).泛化(Generalization).依赖(Dependency).实现( ...

  3. mysql 数据库性能追踪与分析

    http://bbs.linuxtone.org/thread-20601-1-1.html

  4. 排序命令sort

    Unix和Linux自带的sort命令功能非常强大,其主要功能是对文本内容按不同的方法排序.它不仅可以按一个或多个字段排序,还可以合并文件.使用sort处理一些较大的文件时,可能处理速度会比较慢,但却 ...

  5. char *a 与char a[] 的区别

    原文:http://www.cnblogs.com/kaituorensheng/archive/2012/10/23/2736069.html char *a = "hello" ...

  6. shell 笔记

    shell 笔记 通配符 没有 '.' [Aa] 表示 A 或者 a ? 表示任意字符 * 表示任意字符串 IFS data='name, sex, rollno, location' oldIFS= ...

  7. Linux Shell远程执行命令(命令行与脚本方式)

    需求:经常需要在一台服务器远程到其他节点的服务器上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了.介绍两种shell命令远程执行的方法. 方式一: s ...

  8. 关于Android LayoutInflater的解释

    LayoutInflater的作用就是动态加载xml布局好的界面,类似于findViewById()来获取已经定义好的控件一样.不同点是LayoutInflater是用来找res/layout/下的x ...

  9. 内存映射mmap

    Table of Contents 1. 什么是mmap 2. 使用方法 2.1. mmap构造器的格式 2.2. 例子1 2.3. 例子2 3. 其它 4. 参考资料 什么是mmap 通常在Unix ...

  10. YYCache 设计思路

    iOS 开发中总会用到各种缓存,最初我是用的一些开源的缓存库,但到总觉得缺少某些功能,或某些 API 设计的不够好用.YYCache (https://github.com/ibireme/YYCac ...