第一种写法

<script type="text/javascript">window.onload=function(){//定义基本操作类    var operrate={        getId:function(name){return document.getElementById(name);},//获取id        setOpacity:function(ev,v){ev.filters ? ev.style.filter='alpha(opacity='+v+')':ev.style.opacity=v/100;//设置透明度        }            }function fadeIn(elem,speed,opacity){//elem指定的元素        //spee动画的速度        //opacityz指定的透明度        speed=speed||20;//默认为20        opacity=opacity||100;//默认为100        elem.style.display="block";//首先将display设为block        operrate.setOpacity(elem,0);//将透明度设为0.,处于不可见状态        var val=0;        (function(){            operrate.setOpacity(elem,val);            val+=5;if(val<opacity){                setTimeout(arguments.callee,speed);

            }        })()    }function fadeOut(elem, speed, opacity){        speed = speed || 20;        opacity = opacity || 0;//初始化透明度变化值为0        var val = 100;//循环将透明值以5递减,即淡出效果        (function(){            iBase.SetOpacity(elem, val);            val -= 5;if (val >= opacity) {                setTimeout(arguments.callee, speed);            }else if (val < 0) {//元素透明度为0后隐藏元素                elem.style.display = 'none';            }        })();    }var elem=document.getElementById("fade");var btn=document.getElementsByTagName("input")[0];    btn.onclick=function(){        fadeIn(elem);        }    }</script>

第二种写法是按照jQuery的方式来写的

对于符合DOM标准的浏览器来说都支持HTMLElemnt类型,DOM问答结构中所有的元素都继承这个类型,只要给HTMLElemnt类型的原型对象添加方法,则在HTML DOM文档所有的元素都会继承该方法,但是对于IE浏览器却不支持HTMLElemnt类型,从兼容性考虑需要为DOM节点绑定自定义方法

View Code

 1 var DOMextend=function(name,fn){ 2     if(!document.all){ 3         eval("HTMLElement.prototype."+name+"=fn"); 4     } 5     else{ 6         var _createElement=document.createElement; 7         document.createElement=function(tag){ 8             var _elem=_createElement(tag); 9             eval("_elem."+name+"=fn");10             return  _elem;11         }12         var _getElementById=document.getElementById;13         document.getElementById=function(id){14             var _elem=_getElementById(id);15             eval("_elem."+name+"=fn");16             return  _elem;17         }18         var _getElementsByTagName=document.getElementsByTagName;19         document.getElementsByTagName=function(id){20             var _arr=_getElementsByTagName(id);21             for(var i=0;i<_arr.length;i++){22                 eval("_arr[i]."+name+"=fn");23             }24             return  _arr;25         }26     }27         28 }

接下来是要获取元素的样式,通过在前面给DOM自定义的方法基础上进行添加getStyle方法

View Code

 1 DOMextend("getStyle",function(n){ 2     var _this=this; 3     if(_this.style[n]){ 4         return _this.style[n]; 5     }else if(_this.currentStyle){ 6         return _this.currentStyle[n]; 7     } 8     else if(document.defaultView &&document.defaultView.getComputedStyle){ 9         n=n.replace(/(A-Z)/g,"-$1");10         n=n.toLowerCase();11         var s=document.defaultView.getComputedStyle(_this,null);12         if(s){13             return s.getPropertyValue(n);14         }15         16     }17     else return null;18 })

然后设置setOpacity方法来设置透明度

View Code

 1 DOMextend("setOpacity",function(n){ 2         //n为要设置的透明度 3         var _this=this; 4         var n=parseFloat(n);//将n转化为浮点数 5         if(n && (n>100) ||!n) n=100; 6         if((n<0) && n) n=0; 7         //_this.filters ? '_this.style.filter=(alpha='+n+')':'_this.style.opacity='+n/100; 8         if(_this.filters){//兼容IE浏览器 9             _this.style.filter='(alpha='+n+')';10         }11         else{//兼容非IE浏览器12             _this.style.opacity=n/100;13         }14         15     })

然后是自定义fadeIn方法

View Code

 1 DOMextend("fadeIn",function(time,fn){//自定义逐渐显示的动画方法 2         var _this=this; 3         var isShow=_this.getStyle("display");//调用getStyle方法,判断当前元素是否隐藏 4         if(!isShow=="none"){ 5             return; 6         } 7         var t=5;//设置定时器步长为5秒 8         var step=t*100/time; 9         var i=0;10         //为当前元素包裹一个克隆元素,以防止元素在演示过程中突然闪现的问题11         var box=_this.cloneNode(true);12         for(var i=0;i<box.length;i++){//清楚所有子节点13             box.removeChild(box.childNodes[i]);14         }15         _this.parentNode.insertBefore(box,_this);//把克隆元素插入到当前元素前面16         _this=_this.parentNode.removeChild(_this);//删除当前元素17         box.appendChild(_this);//把当前元素添加到盒子元素中18         box.style.display="";//显示盒子元素19         box.setOpacity(0);//设置盒子元素不透明度为020         box.style.visibility="hidden";//设置盒子的元素不可见21         _this.style.display="";//显示当前元素,由于盒子元素不显示,故也看不到22         var interval=setInterval(function(){//设置定时器23             box.style.visibility="visible";//设置盒子元素可见24             box.setOpacity(i);//设置盒子元素的不透明度25             i+=step;//增加步长26             if(i>=100){//如果步长大于或等于100,则退出定时器27                 clearTimeout(interval);//清楚定时器28                 _this=_this.parentNode.removeChild(_this);//移出当前元素29                 box.parentNode.insertBefore(_this,box);//把当前元素插入到克隆盒子的前面30                 box.parentNode.removeChild(box);//移出克隆的盒子31                 if(fn) //如果存在回调函数则调用32                     fn();33             }34         },t)35     })

同理fadeOut方法也一样,不过他不需要考虑元素的闪现问题

View Code

 1 DOMextend("fadeOut",function(time,fn){ 2         var _this=this; 3         var isShow=_this.getStyle("display"); 4         if(isShow=="none"){ 5             return; 6         } 7         var t=5; 8         var step=t*100/time; 9         var i=100;10         var interval=setInterval(function(){11             _this.setOpacity(i);12             i-=step;13             if(i<=0){14                 clearTimeout(interval);15                 _this.style.display="none";16             }17             if(fn) fn();18         },t)19     })

感觉在在fadeIn方法中的这段

var box=_this.cloneNode(true);for(var i=0;i<box.length;i++){//清楚所有子节点            box.removeChild(box.childNodes[i]);        }

有点多余只要改为

var box=_this.cloneNode(false);
    if(_this.filters){//兼容IE浏览器            _this.style.filter='(alpha='+n+')';        }else{//兼容非IE浏览器            _this.style.opacity=n/100;        }

这段代码改为第一种方式的那种写法更简洁,不过效果都一样


转载于:https://www.cnblogs.com/liupeng110112/archive/2011/08/25/2152862.html

收集两种fadeIn和fadeOut的js原生写法相关推荐

  1. 批量替换字符串,将其中的数字递增(两种方法)和circlr.js插件的使用

    使用circlr.js插件实现3D效果的时候,不想在JS中写追加,直接写html又太麻烦(使用的是HBuilder X),所以找到了两种批量替换字符串,将其中的数字递增的方法. 想要实现的效果: 1. ...

  2. php 公众号验证回调方法_如何进行公众号文章收集 两种收集方法详解

    大家都知道优质的公众号吸引用户最关键的就是要优质的文章,所以会有专人负责进行公众号文章收集工作,下面我们跟随拓途数据一起来了解一下如何进行公众号文章收集的相关资料吧. 如何进行公众号文章收集方案一:基 ...

  3. 两种方法动态加载外部原生JS文件

    //方法1----------------------------------------document.write("<script src='js/external.js'> ...

  4. 多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...

    在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title ...

  5. html+input改变图标,JS Input里添加小图标的两种方法

    我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 将小图标当做input的背景来插入,直接上代码吧: Box{ height: 50px; backgroun ...

  6. html表单调用js方法,使用js提交form表单的两种方法

    提交form表单的时候瑶族一些简单的验证,验证完后才能提交,避免无效提交. 1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在前端页面写:有两种方法,一种是用sub ...

  7. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)

    注意!!!(修改于2020年7月18日) 在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据 报错截图如下 报错内容: {&quo ...

  8. js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  9. 防止email被抓取的两种方法(js和css)

    现在很多无聊人士都用自己的spider在网上到处抓取email, 如果你的页面上写了自己的email,那么不多久就会收到很多垃圾邮件. 有很多方法可以避免被抓取,现在很多人都把@换成#,不过估计很多蜘 ...

最新文章

  1. hibernate-jpa/hibernate-jpa-2.1-api-1.0.0.final.jar源代码下载地址
  2. IPython快捷键及命令
  3. 在 .NET Core 中的并发编程
  4. 工作77::配置id传值地址
  5. 单目相机提高标定精度的经验(转载)
  6. 百搭电商背景素材,设计师应急PSD分层模板
  7. 前端程序员有前途吗?
  8. 2021烟台市高考成绩查询,烟台2021高考成绩查询系统入口
  9. 这篇文章写给想学计算机视觉还没开始的人
  10. Python实现简易TCP服务器
  11. 【EfficientNet】EfficientNet网络结构及代码详解
  12. 2009年经典语录雷人总汇
  13. MySQL 怎么插入10天前的日期_使用 MySQL 的 SQL_MODE 有哪些坑,你知道么?
  14. FTP服务搭建与配置
  15. Mysql 循环更新
  16. 你想要拥有自己的搜索引擎吗?
  17. 小米4C 刷机 接触授权
  18. 数组的定义、初始化和使用
  19. 关于图片格式转换(png、jpg转tif)
  20. 第三组(geomystory)需求经理:头脑风暴+核心竞争力+功能集+NABCD+用例文档+功能说明书+技术说明书...

热门文章

  1. 【路径规划】基于matlab A_star算法机器人动态避障【含Matlab源码 2571期】
  2. Python爬虫——Selenium 简介和下载
  3. 常见编码方式(ASKII、GBK、UTF-8等)
  4. Typora增加自动页码
  5. VC快速强制退出程序方法
  6. 我的卓越亚马逊和当当购书经历
  7. cisco packet tracket的简单拓扑搭建以及远程登录路由器
  8. 肇庆工贸计算机专业,肇庆市工贸高级职业技术学校
  9. 【论文理解】Spatial Contrastive Learning for Few-Shot Classification
  10. LIRE源代码分析 3:整体结构