基于原生js淡入淡出函数封装(兼容IE)


Posted in Javascript onOctober 20, 2016

在开发的过程中,我们要做淡入淡出效果的话,我们完全可以使用jQuery的fadeTo()方法。但是我们的目的不只是会用,而是理解程序底层的逻辑。这篇文章主要就是利用原生的javascript实现淡入淡出的效果。

构建框架,基本没难度。

<!DOCTYPE html> 
<html> 
 <head> 
  <meta charset="UTF-8"> 
  <title>透明度函数的封装</title> 
  <style type="text/css"> 
   #box{ 
    width: 200px; 
    height: 200px; 
    background: red; 
    margin: 50px auto; 
    opacity: .3; 
    filter: alpha(opacity:30); 
   } 
  </style> 
 </head> 
 <body> 
  <div id="box"></div> 
  <script src="toumingdu.js" type="text/javascript" charset="utf-8"></script> 
 </body> 
</html>

编写javascript部分,主要难点是changeOpacity()函数。

window.onload = function (){ 
 var box = document.getElementById('box'); 
 box.onmouseover = function (){ 
  changeOpacity(this,100); 
 } 
 box.onmouseout = function (){ 
  changeOpacity(this,30); 
   
 } 
} 
/** 
 * 
 * @param {Object} box 要变化透明度的元素 
 * @param {Object} target 透明度的目标值(100为最高) 
 */ 
function changeOpacity(box,target){ 
 var opa; 
 var speed; 
 if(box.currentStyle){ 
  //判断浏览器类型,此类型为IE浏览器,即使IE不支持opacity属性,但是仍然可以获取值 
  opa = box.currentStyle['opacity']*100; 
 } 
 else{//其他浏览器 
  opa = getComputedStyle(box,false)['opacity']*100; 
 } 
 //透明度每次变化的值(步长),根据目标值和当前值的差来决定步长的正负 
 target-opa>=0?speed=1:speed=-1; 
 clearInterval(box.timer); 
 box.timer = setInterval(function (){ 
  //目标值和当前值差值的绝对值大于等于步长的绝对值,设置透明度为当前值加步长 
  if(Math.abs(target-opa)>=Math.abs(speed)){ 
   box.style.opacity=(opa+speed)/100; 
   box.style.filter='alpha(opacity:'+(opa+speed)+')'; 
  } 
  //目标值和当前值差值的绝对值小于步长的绝对值,剩余的距离一步到位, 
  //设置透明度直接为目标值,同时清除定时器 
  else{ 
   box.style.opacity=target/100; 
   box.style.filter='alpha(opacity:'+target+')'; 
   clearInterval(box.timer); 
  } 
  //直接对透明度参数进行加步长的运算,避免每次都要获取当前透明度 
  opa=opa+speed; 
 },30); 
}

这个透明度函数的原理在大体上是跟运动函数相同的。总结为三步:
1、获取当前值,根据目标值和当前值确定步长;
2、变化的过程,每次变化一个值(渐变动画和透明度其步长为不同的值,而匀速动画和透明度步长为定值);
3、判断是否达到目标值,达到则清除定时器,结束。

所以如果原理弄不清楚可以看一下另一篇文章javascript匀速动画和缓冲动画。
而在理解原理的情况下最大的难点应该是当前透明度的获取了(赋值比较简单)。获取透明度的值我们要考虑两种情况:

1、IE,虽然在在IE下不支持opacity属性,但是我们是可以通过box.currentStyle['opacity']获取到它的值的,同时我们在写入的时候也会将给opacity的值写入css中,尽管IE不会因为opacity值的改变而变化透明度。
2、其他浏览器,其他浏览器是支持opacity属性,所以我们操作相对简单了许多,写入和读取都针对opacity即可。

接下来细讲在IE浏览器中的操作:

首先我们的css文件中有两个属性值在我们的操作中是有用的  opacity: .3;   filter: alpha(opacity:30);    显然我们很难获取filter属性中的opacity值(我不会!),但是如果我们使用currentStyle来获取opacity是比较简单的。所以我进行了测试发现,尽管IE不支持这个属性,但是这个属性值的读取和写入时完全没问题的,所以,问题就迎刃而解了!我们通过opacity可以读取当前透明度,然后通过filter改变透明度,同时,我们改变opacity的值(不仅是为了兼容其他浏览器,同时我们写入以后IE浏览器中在下次移入的时候还可以获取当前的透明度,否则的话获取的是初始的opacity值)。那么下面不就和动画那个问题一样了?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript条件判断使用小技巧总结
Sep 08 Javascript
js 判断脚本加载完毕的代码
Jul 13 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
解析jquery获取父窗口的元素
Jun 26 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 Javascript
jQuery中height()方法用法实例
Dec 24 Javascript
JavaScript实现自动变换表格边框颜色
May 08 Javascript
灵活使用数组制作图片切换js实现
Jul 28 Javascript
jquery.tableSort.js表格排序插件使用方法详解
Aug 12 Javascript
vue.js实现插入数值与表达式的方法分析
Jul 06 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 11 Javascript
JS运算符简单用法示例
Jan 19 Javascript
纯JavaScript手写图片轮播代码
Oct 20 #Javascript
Zabbix添加Node.js监控的方法
Oct 20 #Javascript
Javascript实现图片懒加载插件的方法
Oct 20 #Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 #Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 #Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 #Javascript
javascript匀速动画和缓冲动画详解
Oct 20 #Javascript
You might like
用PHP调用Oracle存储过程
2006/10/09 PHP
PHP入门
2006/10/09 PHP
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP中phar包的使用教程
2017/06/14 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
js实现右下角提示框的方法
2015/02/03 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
python中的__slots__使用示例
2015/02/26 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
Python扫描端口的实现
2021/01/25 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
美国网上书店:Barnes & Noble
2018/08/15 全球购物
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
支部书记四风问题自我剖析材料
2014/09/29 职场文书
2015年工商所工作总结
2015/05/21 职场文书
会计主管竞聘书
2015/09/15 职场文书
JavaScript实现优先级队列
2021/12/06 Javascript
Python学习之异常中的finally使用详解
2022/03/16 Python