基于原生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 setTimeout和setInterval的使用方法 说明
Mar 25 Javascript
jQuery学习笔记之jQuery的动画
Dec 22 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
Dec 11 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
Javascript对象字面量的理解
Jun 22 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
Oct 17 Javascript
Vue指令的钩子函数使用方法
Mar 20 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
Feb 07 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
vue2路由基本用法实例分析
Mar 06 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中最容易忘记的一些知识点总结
2013/04/28 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
广告显示判断
2006/08/31 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
js 操作符汇总
2014/11/08 Javascript
jquery移动节点实例
2015/01/14 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
快速掌握Node.js之Window下配置NodeJs环境
2016/03/21 NodeJs
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
Python序列循环移位的3种方法推荐
2018/04/09 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
通过代码实例了解Python sys模块
2020/09/14 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
给水工程专业毕业生自荐信
2014/01/28 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
情人节寄语大全
2014/04/11 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
青年文明号申报材料
2014/12/23 职场文书
家长会主持词开场白
2015/05/29 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL