javascript点击元素实现当前轮换展现效果

快乐打工仔 分类:实例代码

本章节分享一段代码实例,它实现了点击元素实现当前展现效果,并且具有比较人性化的变换效果。

并且详细介绍一下它的实现过程,需要的朋友可以做一下参考。

代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.pipipi.net/" />
<title>前端教程网</title>
<style>
body,ul,li{
  margin:0; 
  padding:0;
  font:18px/1.5 arial; 
  color:#333;
}
#big_pic{
  width:500px; 
  height:400px;
  background:#ccc; 
  text-align:center;
  position:absolute;
}
#s_pic li{
  float:left; 
  width:100px;
  height:80px; 
  display:inline;
  background:#06c; 
  text-align:center;
  position:absolute; 
  top:310px;
}
</style>
<script>
window.onload = function(){
  var s_pic = document.getElementById("s_pic");
  var s_pic_li = s_pic.getElementsByTagName("li");
  var now = s_pic_li[0];
  for(var index=0; index<s_pic_li.length; index++){
    s_pic_li[index].onclick = function(){
      if(this == now) return false;
      var w = now.offsetWidth;
      var h = now.offsetHeight;
      var l = now.offsetLeft;
      var t = now.offsetTop;
      var w1= this.offsetWidth;
      var h1 = this.offsetHeight;
      var l1 = this.offsetLeft;
      var t1 = this.offsetTop;
      startrun(now,{width:w1,height:h1,left:l1,top:t1});
      startrun(this,{width:w,height:h,left:l,top:t});
      now=this;
    }
  }
}
 
function getstyle(obj,name){
  if(obj.currentStyle){
    return obj.currentStyle[name];
  }
  else{
    return getComputedStyle(obj,false)[name];
  }
}
 
function startrun(obj,json,fn){
  clearInterval(obj.timer);
  obj.timer = setInterval(function(){
    var isall = true; 
    for(var attr in json){
      var cur=0;
      if(attr == "opacity"){
        cur = Math.round(parseFloat(getstyle(obj,attr))*100);
      }
      else{
        cur = parseInt(getstyle(obj,attr));
      }
      var speed = (json - cur)/8
      speed = speed>0?Math.ceil(speed):Math.floor(speed);
      if(cur != json){
        isall = false;
      }
      if(attr == "opacity"){
        obj.style.filter = "alpha(opacity="+(cur+speed)+")";
        obj.style.opacity = (cur+speed)/100;
      }
      else{
        obj.style = cur+speed+"px";
      }
    }
    if(isall){
      clearInterval(obj.timer);
      if(fn){
        fn();
      }
    }
  },30);
}
</script>
</head>
<body>
<ul id="s_pic">
 <li style="left:0; top:0; width:400px; height:300px">0</div>
 <li style="left:0;">1</li>
 <li style="left:110px;">2</li>
 <li style="left:220px;">3</li>
 <li style="left:330px;">4</li>
</ul>
</body>
</html>

上面的代码实现了我们的要求,下面介绍一下它的实现过程。

一.代码注释:

(1).window.onload = function(){},当文档内容完全加载完毕再去后自行函数中的代码。

(2).var s_pic = document.getElementById("s_pic"),获取ul元素对象。

(3).var s_pic_li = s_pic.getElementsByTagName("li"),获取ul下面的所有li元素对象集合。

(4).var now = s_pic_li[0],获取集合中的第一个li元素,默认状态先第一个li元素展现。

(5).for(var index=0; index<s_pic_li.length; index++),遍历集合中的每一个元素。

(6).s_pic_li[index].onclick = function(){},为li元素注册click事件处理函数。

(7).if(this == now) return false,如果是点击的当前展现的元素,那么直接跳出函数。

(8).var w = now.offsetWidth,获取当前展现元素的宽度。

(9).var h = now.offsetHeight,获取当前展现元素的高度。

(10).var l = now.offsetLeft,获取当前展现元素距离左侧的尺寸。

(11).var t = now.offsetTop,获取当前展现元素距离上侧的尺寸。

(12).var w1= this.offsetWidth,获取当前点击元素的宽度。

(13).var h1 = this.offsetHeight,获取当前点击元素的高度。

(14).var l1 = this.offsetLeft,获取当前点击元素距离左侧的尺寸。

(15).var t1 = this.offsetTop,获取当前点击元素距离上侧的尺寸。

(16).startrun(now,{width:w1,height:h1,left:l1,top:t1},将当前展现元素的尺寸和位置设置为当前点击元素的尺寸和位置。

(17).startrun(this,{width:w,height:h,left:l,top:t}),将当前点击元素的尺寸和位置设置为当前展现元素的尺寸和位置。

(18).now=this,将当前点击的元素的引用赋值给now。

(19).function getstyle(obj,name){},获取指定元素指定样式属性的值,obj是元素对象,name样式属性名称。

(20).if(obj.currentStyle){

  return obj.currentStyle[name];

},如果支持currentStyle,则使用currentStyle对象获取。

(21).else{

  return getComputedStyle(obj,false)[name];

},使用getComputedStyle()方法获取属性值。

(22).function startrun(obj,json,fn){},此方法实现了相关数据的设置功能,第一个参数为元素对象,第二个参数是一个对象直接量,用来存储一些数据,第三个参数为回调函数。

(23).clearInterval(obj.timer),停止上一个定时器函数的执行,否则可能造成多个定时器函数同事执行的情况。

(21).obj.timer = setInterval(function(){},30),每隔30毫秒执行一次回调函数。

(22).var isall = true,声明一个变量并赋初值为true,用来作为是否已经完整展现替换效果。

(23).for(var attr in json),遍历json对象中的每一个属性。

(24).var cur=0,声明一个变量并赋初值0,用来存储当前元素的指定样式值。(25).if(attr == "opacity"){

   cur = Math.round(parseFloat(getstyle(obj,attr))*100);

},如果是透明度属性,那么就获取元素的当前透明度并且乘以100,转换为0-100之间的数值。

(26).else{

  cur = parseInt(getstyle(obj,attr));

},如果不是透明度属性的话,直接获取值。

(27).var speed = (json - cur)/8,json - cur获取的是目标值和当前值得差,然后再除以8.

(28).speed = speed>0?Math.ceil(speed):Math.floor(speed),一个数学问题了,这里不用介绍。

(29).if(cur != json){

  isall = false;

},判断当前值是否达到目标值,如果没有达到,那么就将isall的变量值修改为false。

(30).if(attr == "opacity"){

  obj.style.filter = "alpha(opacity="+(cur+speed)+")";

  obj.style.opacity = (cur+speed)/100;

},低版本IE浏览器和标准浏览器两种动态设置透明度的方式。

(31).else{

  obj.style = cur+speed+"px";

},其他属性不需要其他处理。

(32).if(isall){

  clearInterval(obj.timer);

  if(fn){

    fn();

  }

},如果完成展现替换效果,那么就停止定时器函数的执行。

如果传递第三个参数,那么将执行此回调函数。

二.相关阅读:

(1).getElementsByTagName()方法可以参阅document.getElementsByTagName()一章节。

(2).offsetWidth属性可以参阅js offsetWidth一章节。

(3).offsetLeft属性可以参阅js offsetLeft一章节。

(4).获取样式值可以参阅getComputedStyle()和currentStyle属性一章节。

(5).setInterval()方法可以参阅setInterval()一章节。

(6).Math.round()方法可参阅Math.round()一章节。

(7).parseFloat()方法可以参阅javascript parseFloat()一章节。

(8).Math.ceil()方法可以参阅javascript Math.ceil()一章节。

(9).Math.floor()方法可以参阅javascript Math.floor()一章节。

回复

我来回复
  • 暂无回复内容