JS运动学习笔记 -- 任意值的运动框架(高/宽度,背景颜色,文本内容,透明度等)
<!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运动学习笔记 -- 任意值的运动框架(高/宽度,背景颜色,文本内容,透明度等)的更多相关文章
- js再学习笔记
#js再学习笔记 ##基本 1.js严格区分大小写 2.js末尾的分号可加,也可不加 3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...
- JS数组学习笔记
原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...
- 并发编程学习笔记(12)----Fork/Join框架
1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...
- Quartz学习笔记:集群部署&高可用
Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...
- Knockout.js快速学习笔记
原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...
- 两万字Vue.js基础学习笔记
Vue.js学习笔记 目录 Vue.js学习笔记 ES6语法 1.不一样的变量声明:const和let 2.模板字符串 3.箭头函数(Arrow Functions) 4. 函数的参数默认值 5.Sp ...
- 两万字Vue.js基础学习笔记(二)
Vue.js学习笔记(二) 4.模块化开发 ES6模块化的导入和导出 我们使用export指令导出了模块对外提供的接口,下面我们就可以通过import命令来加载对应的这个模块了 首先,我们需要在HTM ...
- 从零开始学习Vue.js,学习笔记
一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...
- handlebars.js基础学习笔记
最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...
随机推荐
- 【JavsScript】一个元素绑定多个事件
<script> document.getElementById("a").addEventListener("click", function() ...
- HTML WEB 和HTML Agility Pack结合
现在,在不少应用场合中都希望做到数据抓取,特别是基于网页部分的抓取.其实网页抓取的过程实际上是通过编程的方法,去抓取不同网站网页后,再进行分析筛选的过程.比如,有的比较购物网站,会同时去抓取不同购物网 ...
- [CodeEdit--Sublime]一些好用的Plugins
Sublime Text 3 Plugins (**)packet control:plugin包管理器 (**)netuts-fetch: (**)markdown editing:Markdown ...
- angularJs项目实战!02:前端的页面分解与组装
自从上一篇文章到现在已经有将近一个月的时间,我将精力放在了前端页面分解与组装,和angularjs如何与jquery.bootstrap.D3等一系列其他类库结合使用的经验总结上.由于公司新招了一些员 ...
- mfc extention dll 與 normal dll 的區別
extention dll 1.指從MFC中繼承過來的DLL,一般要求使用共享MFC DLL進行連接,也要求調用者也使用MFC且使用共享MFC,如此可保證DLL與調用者有相同的MFC庫. 2.在使用資 ...
- 基于jQuery上下切换的焦点图—带缩略图悬浮
分享一款基于jQuery上下切换的焦点图,这款焦点图带有缩略图悬浮,它的切换效果比较简单,仅仅是作图片的上下切换,但是效果还是比较流畅的.这款jQuery焦点图插件的另外一个特点是在播放器上面可以悬浮 ...
- 如何在Fedora或CentOS上使用Samba共享
如今,无论在家里或者是办公场所,不同的电脑之间共享文件夹已不是什么新鲜事了.在这种趋势下,现代操作系统通过网络文件系统的方式使得电脑间数据的交换变得简单而透明.如果您工作的环境中既有微软的Window ...
- IOS NS 字符串 数组 字典 文件 动态 静态 操作
ios 常用字符串的操作 //将NSData转化为NSString NSString* str = [[NSString alloc] initWithData:response e ...
- C#之结构化异常处理
1.异常处理4要素 一个表示异常详细信息的类类型: 一个向调用者引发异常类实例的成员: 调用者的一段调用异常成员的代码块: 调用者的一段处理将要发生异常的代码块:
- [WinForm] VS2010的程序打包封装
因为学习的要求,我需要把自己的程序进行打包封装,开始也是苦恼,没有找到很好的办法,但并没有放弃,终于发现了一个差不多的文章,于是摸索着进行,可喜的是是成功了,下面和大家分享一下. 第一步:前提是你已经 ...