基于原生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 相关文章推荐
文本加密解密
Jun 23 Javascript
js过滤HTML标签以及空格的思路及代码
May 24 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
iframe跨域通信封装详解
Aug 11 Javascript
总结javascript中的六种迭代器
Aug 16 Javascript
javascript数组常用方法汇总
Sep 10 Javascript
详解Node.js中的事件机制
Sep 22 Javascript
jQuery延迟执行的实现方法
Dec 21 Javascript
Node做中转服务器转发接口
Oct 18 Javascript
微信小程序 上传头像的实例详解
Oct 27 Javascript
解决Vue+Element ui开发中碰到的IE问题
Sep 03 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
Nov 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的知识
2006/11/17 PHP
php去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
小程序如何支持使用 async/await详解
2019/09/12 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python字符串处理实例详解
2017/05/18 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
python计算两个地址之间的距离方法
2018/06/09 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
AURALog面试题软件测试方面
2013/10/22 面试题
资产经营总监岗位职责范文
2013/12/01 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
个人自荐书怎么写
2015/03/26 职场文书
2019银行竞聘书
2019/06/21 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
SpringBoot生成License的实现示例
2021/06/16 Java/Android
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技