基于原生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 oop开发滑动(slide)菜单控件
Aug 25 Javascript
基于jquery实现的表格分页实现代码
Jun 21 Javascript
基于jquery的web页面日期格式化插件
Nov 15 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
Oct 09 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
Feb 17 Javascript
javascript 广告移动特效的实现代码
Jun 25 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
Dec 01 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
Mar 16 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
May 14 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
使用uni-app开发微信小程序的实现
Dec 13 Javascript
JS highcharts实现动态曲线代码示例
Oct 16 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
解析link_mysql的php版
2013/06/30 PHP
php中的常用魔术方法总结
2013/08/02 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
基于Jquery的简单图片切换效果
2011/01/06 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
js实现抽奖功能
2020/11/24 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
python实现比较两段文本不同之处的方法
2015/05/30 Python
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
Python随机读取文件实现实例
2017/05/25 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
新浪微博实习心得体会
2014/01/27 职场文书
教师节促销活动方案
2014/02/14 职场文书
支部组织生活会方案
2014/06/10 职场文书
学校联谊协议书
2014/09/16 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
教师年度个人总结
2015/02/11 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书