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,{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[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; 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[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/

javascript nonono的更多相关文章

  1. JavaScript | 对象详解

    ————————————————————————————————————————————————————————— 对象有哪些(导图) 内建对象 数据封装对象 Object对象 Object.prot ...

  2. JavaScript | 对象与属性

    ———————————————————————————————————————————— 对象:JavaScript是基于原型的语言,没有Class,所以将函数作为类 - - - - - - - - ...

  3. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  4. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  5. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  6. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  7. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  8. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  9. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

随机推荐

  1. 如何理解Robot Framework

    不知不觉公众号已经有很多人关注了,小编先谢谢大家的支持-今天我们就来谈一谈我对RF的理解,因为前段时间换了工作,目前RF知识基本用不上了.其实我在上一份工作中大部分都是在反复的使用前面讲过的知识——其 ...

  2. 【spring源码学习】springMVC之映射,拦截器解析,请求数据注入解析,DispatcherServlet执行过程

    [一]springMVC之url和bean映射原理和源码解析 映射基本过程 (1)springMVC配置映射,需要在xml配置文件中配置<mvc:annotation-driven >  ...

  3. vue指令总结

    new  Vue({          el: "#box",            // element(元素) 当前作用域          data:{ msg:" ...

  4. 系列文章--WCF后传学习文章

    WCF后传系列(10):消息处理功能核心 摘要: WCF是一个通信框架,同时也可以将它看成是一个消息处理或者传递的基础框架,它可以接收消息.对消息做处理,或者根据客户端给定的数据构造消息并将消息发送到 ...

  5. Java开发过程中乱码问题理解

    1.Java编译器(即编译成class文件时) 用的是unicode字符集.2.乱码主要是由于不同的字符集相互转换导致的,理论上各个字符的编码规则是不同的,是不能相互转换的,所以根本解决乱码的方法就是 ...

  6. 为什么 I2C(IIC)需要上拉电阻

    源鑫问: I2C时钟线和数据线为什么要接上拉电阻? 因为 I2C 的 IO 是开漏的,所以需要上拉电阻. 延伸: 之前 hippo曾经说过有人将 IO 设置为 PP,可能会烧 IO. 之前以为 I2C ...

  7. zabbix监控的配置

    ZABBIX监控的操作步骤有两个! 首先登录到zabbix 的主界面在configuration---host---create host在如上的host 创建界面中 主要是输入被监测的server的 ...

  8. 导出csv xls文件数字会自动变科学计数法的解决方式

    将数据导出excel文件变成科学计数法问题:     分析: 用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软件查看csv文件时就会变成科学技术法的表现形式.    其实这个 ...

  9. optimize table tablename

    optimize 优化表OPTIMIZE 命令支持的引擎MyIsam, InnoDB, ARCHVE当对表有大量的增删改操作时,需要用optimize对表进行优化,可以减少空间与提高I/O性能,命令o ...

  10. 蓝桥杯 算法训练 ALGO-93 反置数

    算法训练 反置数   时间限制:1.0s   内存限制:512.0MB 问题描述 一个整数的“反置数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数.如果一个整数的末尾是以0结尾,那么在它 ...