javascript點選元素實現當前輪換展現效果
本章節分享一段程式碼例項,它實現了點選元素實現當前展現效果,並且具有比較人性化的變換效果。
並且詳細介紹一下它的實現過程,需要的朋友可以做一下參考。
程式碼如下:
[HTML] 純文字檢視 複製程式碼<!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 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()一章節。
相關文章
- JavaScript實現選項卡效果JavaScript
- vue點選當前路由,如何實現重新整理當前頁Vue路由
- Vue實現內部元件輪播切換效果Vue元件
- Axure實現輪播效果
- jQuery實現輪播效果jQuery
- CSS 實現元素在當前視窗水平垂直居中CSS
- JavaScript當前tr行高亮效果JavaScript
- ABP後臺管理頁面AdminLTE框架,實現選單項點選後,選單展開當前選單項高亮框架
- android短影片開發,點選兩次實現不同點選效果的實現方式Android
- div等元素如何阻止點選穿透和實現點選穿透?穿透
- jquery中點選切換的實現jQuery
- 實現元素的淡入淡出效果
- SVG點選實現動態放大的圓效果SVG
- 使用CSS實現逼真的水波紋點選效果CSS
- JavaScript滑鼠懸浮出現下拉選單效果JavaScript
- iOS 抽獎輪盤效果實現思路iOS
- 原生JS實現輪播圖的效果JS
- JavaScript 點選表格行實現背景變色JavaScript
- JavaScript實現文字豎排效果JavaScript
- 請問各位大佬,vue如何實現點選按鈕切換圖片的效果?Vue
- 區塊鏈當前的發展現狀區塊鏈
- JavaScript焦點圖輪播效果詳解JavaScript
- 教你如何實現 Android TextView 文字輪播效果AndroidTextView
- 網頁佈局------輪播圖效果實現網頁
- JavaScript實現隨機抽獎效果JavaScript隨機
- 封裝js獲取當前元素的弟弟元素節點封裝JS
- 獲取當前元素在兄弟元素節點中的索引索引
- JavaScript實用的表格行滑鼠點選高亮效果JavaScript
- 原生JavaScript實現造日曆輪子JavaScript
- Cocos Creator實戰-使用粒子資源實現螢幕點選效果
- 如何快速實現一個無縫輪播效果
- JavaScript、CSS實現滑鼠跟隨繁花效果JavaScriptCSS
- 報表展現時如何實現固定表頭效果
- JavaScript元素抖動效果JavaScript
- 用CSS實現Tab頁切換效果CSS
- 報表如何實現行列互換效果?
- JavaScript 實現全部選中與全不選JavaScript
- 點選Enter鍵表切換焦點效果
- 使用JavaScript實現獲取當前日期JavaScript