基于原生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 相关文章推荐
基于jquery的无刷新分页技术
Jun 11 Javascript
Three.js源码阅读笔记(Object3D类)
Dec 27 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
extjs render 用法介绍
Sep 11 Javascript
javascript简单比较日期大小的方法
Jan 05 Javascript
jQuery操作动态生成的内容的方法
May 28 Javascript
微信小程序图片宽100%显示并且不变形
Jun 21 Javascript
javaScript实现滚动条事件详解
Mar 24 Javascript
AngularJS中scope的绑定策略实例分析
Oct 30 Javascript
如何在基于vue-cli的项目自定义打包环境
Nov 10 Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 Javascript
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
纯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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
mysql 性能的检查和优化方法
2009/06/21 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php时间函数用法分析
2016/05/28 PHP
如何正确配置Nginx + PHP
2016/07/15 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
jquery map方法使用示例
2014/04/23 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
python中文编码问题小结
2014/09/28 Python
Python多进程机制实例详解
2015/07/02 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
Python 修改列表中的元素方法
2018/06/26 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
python初步实现word2vec操作
2020/06/09 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
医药大学生求职简历的自我评价
2013/10/17 职场文书
事务机电主管工作职责
2014/02/25 职场文书
课例研修方案
2014/05/31 职场文书
党支部工作总结2015
2015/04/01 职场文书
2016年春节问候语
2015/11/11 职场文书
初中团支书竞选稿
2015/11/21 职场文书