浅析Javascript透明特效的可控式实现

可控式Javascript透明特效也就是透明度可以自行设置,但是这种方法在IE7下极有可能失效,不过这些东西对大家了解Javascript透明特效还是有所帮助的。

创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、网站设计、新干网络推广、微信小程序、新干网络营销、新干企业策划、新干品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供新干建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

Javascript透明特效是script.aculo.us提到的特效中最简单的特效之一。既然是特效,必须涉及时间与空间的概念。时间我们可以用setTimeout与setInterval,个人比较喜欢setTimeout,虽然它每次调用都重复注册,但可控性比较好。空间就全凭CSS的绝对定位实现位移了。在开始之前,我们练习一下setTimeout的递归用法(用来模拟setInterval)。

01.
function text(el){
02.
  var node  = (typeof el == "string")? document.getElementById(el) : el;
03.
  var i = 0;
04.
  var repeat = function(){
05.    setTimeout(function(){
06.      node.innerHTML = "

"+i+"

";
07.      i++;
08.      if(i <= 100){
09.        setTimeout(arguments.callee, 100);
10.      }
11.    },100)
12.  }
13.  repeat();
14.}

我们来试一下最简单的淡入特效,就是把node.innerHTML那一行改成透明度的设置。

01.
function fadeIn(el){
02.
  var node  = (typeof el == "string")? document.getElementById(el) : el;
03.
  var i = 0;
04.
  var fade = function(){
05.    setTimeout(function(){     
06.        !+"\v1"? (node.style.filter="alpha(opacity="+i+")"): (node.style.opacity = i / 100);
07.      i++;
08.      if(i <= 100){
09.        setTimeout(arguments.callee, 100);
10.      }
11.    },100)
12.  }
13.  fade();
14.}

但是这样并不完美,因为IE的滤镜可能会在IE7中失效,我们必须要用zoom=1来激活hasLayout。我们再添加一些可制定参数扩充它。注释已经非常详细,不明白在留言里再问我吧。

01.
function opacity(el){
02.  //必选参数
03.
  var node  = (typeof el == "string")? document.getElementById(el) : el,
04.  //可选参数
05.  options = arguments[1] || {},
06.  //变化的持续时间
07.  duration = options.duration || 1.0,
08.  //开始时透明度
09.  from = options.from || 0.0 ,
10.  //结束时透明度
11.  to = options.to || 0.5,
12.  operation = 1,
13.  init = 0;
14.  if(to - from < 0){
15.    operation = -1,
16.    init = 1;
17.  }
18.  //内部参数
19.  //setTimeout执行的间隔时间,单位毫秒
20.
  var frequency = 100,
21.  //设算重复调用的次数
22.  count = duration * 1000 / frequency,
23.  // 设算每次透明度的递增量
24.  detal = Math.abs(to - from)  /count,
25.  // 正在进行的次数
26.  i = 0;
27.
  var main = function(){
28.    setTimeout(function(){
29.      if(!+"\v1"){
30.        if(node.currentStyle.hasLayout)  node.style.zoom = 1;//防止滤镜失效
31.        node.style.filter="alpha(opacity="+ (init * 100 + operation * detal * i * 100).toFixed(1) +")"
32.      }else{
33.        node.style.opacity =  (init + operation * detal * i).toFixed(3)
34.      }
35.      node.innerHTML =  (init + operation * detal * i).toFixed(3)
36.      i++;
37.      if(i <= count){
38.        setTimeout(arguments.callee, frequency);
39.      }
40.    },frequency)
41.  }
42.  main();
43.} 100.0 50.0
1.
<div class="text" onclick="opacity(this,{duration:4.0,from:0.0,to:1})">div>
2.
<div class="text" onclick="opacity(this,{duration:4.0,from:1.0,to:0})">div>

但上面并不尽善尽美,有一个Bug。我们是通过短路运算符来决定是否使用默认参数还是我们传入的参数,但在Javascript中,数字0甚至0.0都会自动转换为false。因此在第个例子,如果我们在to中传入0,它永远不会用到这个0,而是默认的0.5。解决方法让它变成字符串“0”。另,参数i也不是必须的,我们可以省去它,用count负责所有的循环,但这样一来,我们的思维就要逆过来想了。原来是加的,我们要变成减的。

01.
function opacity(el){
02.  //必选参数
03.
  var node  = (typeof el == "string")? document.getElementById(el) : el,
04.  //可选参数
05.  options = arguments[1] || {},
06.  //变化的持续时间
07.  duration = options.duration || 1.0,
08.  //开始时透明度
09.  from = options.from || 0.0 ,
10.  //结束时透明度
11.  to = (options.to && options.to + "") || 0.5,
12.  operation = -1,
13.  init = 1;
14.  if(to - from < 0){
15.    operation = 1,
16.    init = 0;
17.  }
18.  //内部参数
19.  //setTimeout执行的时间,单位
20.
  var frequency = 100,
21.  //设算重复调用的次数
22.  count = duration * 1000 / frequency,
23.  // 设算每次透明度的递增量
24.  detal = operation * Math.abs(to - from) /count;
25.
  var main = function(){
26.    setTimeout(function(){
27.      if(!+"\v1"){
28.        if(node.currentStyle.hasLayout)  node.style.zoom = 1;//防止滤镜失效
29.        node.style.filter="alpha(opacity="+ (init * 100 +  detal * count * 100).toFixed(1) +")"
30.      }else{
31.        node.style.opacity =  (init +  detal * count).toFixed(3)
32.      }
33.      count--;
34.      if(count + 1){
35.        setTimeout(arguments.callee, frequency);
36.      }
37.    },frequency)
38.  }
39.  main();
40.}

进一步优化,利用原型共享方法。

01.
function Opacity(el){
02.
  var node  = (typeof el == "string")? document.getElementById(el) : el,
03.  options = arguments[1] || {},
04.  duration = options.duration || 1.0,
05.  from = options.from || 0.0 ,
06.  to = (options.to && options.to + "") || 0.5,
07.  operation = -1,
08.  init = 1;
09.  if(to - from < 0){
10.    operation = 1,
11.    init = 0;
12.  }
13.
  var frequency = 100,
14.  count = duration * 1000 / frequency,
15.  detal = operation * Math.abs(to - from) /count;
16.  this.main(node,init,detal,count,frequency);
17.}
18.Opacity.prototype = {
19.  main : function(node,init,detal,count,frequency){
20.    setTimeout(function(){
21.      if(!+"\v1"){
22.        if(node.currentStyle.hasLayout)  node.style.zoom = 1;//防止滤镜失效
23.        node.style.filter="alpha(opacity="+ (init * 100 +  detal * count * 100).toFixed(1) +")"
24.      }else{
25.        node.style.opacity =  (init +  detal * count).toFixed(3)
26.      }
27.      node.innerHTML =  (init +  detal * count).toFixed(3)
28.      count--;
29.      if(count + 1){
30.        setTimeout(arguments.callee, frequency);
31.      }
32.    },frequency)
33.  }
34.} 1.000 0.000
1.
<div class="text" onclick="new Opacity(this,{duration:4.0,from:0.0,to:1})">div>
2.
<div class="text" onclick="new Opacity(this,{duration:4.0,from:1.0,to:0})">div>

名称栏目:浅析Javascript透明特效的可控式实现
网页URL:http://www.36103.cn/qtweb/news23/18773.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联