zoukankan      html  css  js  c++  java
  • javascript nonono

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

    javascript实现的点击元素实现当前轮换展现效果:
    本章节分享一段代码实例,它实现了点击元素实现当前展现效果,并且具有比较人性化的变换效果。
    并且详细介绍一下它的实现过程,需要的朋友可以做一下参考。
    代码如下:

    复制代码
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="author" content="http://www.softwhy.com/" />
    <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,{w1,height:h1,left:l1,top:t1});
          startrun(this,{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[attr] - cur)/8
          speed = speed>0?Math.ceil(speed):Math.floor(speed);
          if(cur != json[attr]){
            isall = false;
          }
          if(attr == "opacity"){
            obj.style.filter = "alpha(opacity="+(cur+speed)+")";
            obj.style.opacity = (cur+speed)/100;
          }
          else{
            obj.style[attr] = 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; 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,{w1,height:h1,left:l1,top:t1},将当前展现元素的尺寸和位置设置为当前点击元素的尺寸和位置。
    (17).startrun(this,{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[attr] - cur)/8,json[attr] - cur获取的是目标值和当前值得差,然后再除以8.
    (28).speed = speed>0?Math.ceil(speed):Math.floor(speed),一个数学问题了,这里不用介绍。
    (29).if(cur != json[attr]){
      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[attr] = cur+speed+"px";
    },其他属性不需要其他处理。
    (32).if(isall){
      clearInterval(obj.timer);
      if(fn){
        fn();
      }
    },如果完成展现替换效果,那么就停止定时器函数的执行。
    如果传递第三个参数,那么将执行此回调函数。
    二.相关阅读:
    (1).getElementsByTagName()方法可以参阅document.getElementsByTagName()一章节。
    (2).offsetWidth属性可以参阅js的offsetWidth属性用法详解一章节。
    (3).offsetLeft属性可以参阅js的offsetTop好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()方法一章节。

    原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=17540

    更多内容可以参阅:http://www.softwhy.com/javascript/

  • 相关阅读:
    JS数组定义及详解
    JS中script词法分析
    JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用
    Java面试(1)-- Java逻辑运算符
    Java面试(3)-- Java关系运算符
    让 history 命令显示日期和时间
    mysql 权限管理
    docker基础
    docker 后台运行和进入后台运行的容器
    expect 自动输入密码
  • 原文地址:https://www.cnblogs.com/webph/p/5097221.html
Copyright © 2011-2022 走看看