基于原生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 权威指南(第四版) 读书笔记
Aug 11 Javascript
JS打开图片另存为对话框实现代码
Dec 26 Javascript
js实现杯子倒水问题自动求解程序
Mar 25 Javascript
前端开发过程中浏览器版本的两种判定方法
Oct 30 Javascript
javascript事件委托的方式绑定详解
Jun 10 Javascript
Bootstrap按钮下拉菜单组件详解
May 10 Javascript
JavaScript事件用法浅析
Oct 31 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
Canvas 绘制粒子动画背景
Feb 15 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 Javascript
不刷新网页就能链接新的js文件方法总结
Mar 01 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python 正则表达式入门(中级篇)
2016/12/07 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
python移位运算的实现
2019/07/15 Python
详解django中Template语言
2020/02/22 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
大学生职业生涯规划方案
2014/01/03 职场文书
收银员岗位职责
2014/02/07 职场文书
推广普通话标语
2014/06/27 职场文书
2014年度党员自我评议
2014/09/13 职场文书
2014年客房部工作总结
2014/11/22 职场文书
2014年工程师工作总结
2014/11/25 职场文书
拾金不昧表扬信
2015/01/16 职场文书
家长会欢迎词
2015/01/23 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang