純js實現(xiàn)手風琴效果代碼
我知道現(xiàn)在大多數(shù)前端開發(fā)人員都在使用jQuery等第三方的庫來進行開發(fā),這不僅節(jié)約了時間,也讓效率大大的提高,并讓公司的效益增加,何樂而不為呢?
但是,這也會有一定的缺點,比如jQ比js慢,尤其在大型項目中就會顯現(xiàn)出來,下面我用原生js實現(xiàn)一個簡單的手風琴效果效果。
HTML代碼如下
結(jié)構非常簡單就5個li盒子,js代碼會渲染圖片上去
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <div id="box"> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </div> </body> </html>
CSS代碼如下:
寬高請自行設置,我之前做的這個項目圖片是1226*446的圖片,所以寬度和高度是按照當時做項目的時候設置的,如果你想放置其他尺寸的圖片請按照實際情況設施...
ul {
list-style: none
}
* {
margin: 0;
padding: 0;
}
div {
width: 1150px;
height: 400px;
margin: 50px auto;
border: 1px solid red;
overflow: hidden;
}
div li {
width: 240px;
height: 400px;
float: left;
/*background-image: url(images/1.jpg);*/
}
div ul {
width: 1300px;
}
下面是重頭戲啦,請欣賞原生js(相信很多人都快忘了原生js吧)
//找人
var box = document.getElementById("box");
var ul = box.children[0];
var lis = ul.children;
//循環(huán)遍歷 lis 綁定背景圖
for (var i = 0; i < lis.length; i++) {
lis[i].style.backgroundImage = "url(images/" + (i + 1) + ".jpg)";
//給每一個li注冊鼠標經(jīng)過事件 鼠標經(jīng)過后要排他
lis[i].onmouseover = function () {
//干掉所有人 讓所有人的寬度 漸漸地 變?yōu)?00
for (var j = 0; j < lis.length; j++) {
animate(lis[j], {"width": 100});
}
//留下我自己 讓我的寬度 漸漸地 變?yōu)?00
animate(this, {"width": 800});
};
}
//鼠標離開box 所有的li寬度 漸漸地 變?yōu)?40
box.onmouseout = function () {
for (var i = 0; i < lis.length; i++) {
animate(lis[i], {"width": 240});
}
};
//jQuery中有animate動畫函數(shù),下面是實現(xiàn)的原理,雖然沒有jQ的強大,但是基本的效果實現(xiàn)還是沒有問題的
function animate(obj, json) {
clearInterval(obj.timer);
obj.timer = setInterval(function () {
//先假設 這一次執(zhí)行完 所有的屬性都到達目標了
var flag = true;
for (var k in json) {
var leader = parseInt(getStyle(obj, k)) || 0;
var target = json[k];
var step = (target - leader) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
leader = leader + step;
obj.style[k] = leader + "px";
//if (leader === target) {
// clearInterval(obj.timer);
//}
console.log("代碼還在運行");
if (leader != target) {
flag = false;//告訴標記 當前這個屬性還沒到達
}
}
//如果此時仍然為true 就說明真的都到達了
if (flag) {
clearInterval(obj.timer);
}
}, 15);
}
//全部屬性都到達目標值才能清空
function getStyle(obj, attr) {
if (window.getComputedStyle) {
return window.getComputedStyle(obj, null)[attr];
} else {
return obj.currentStyle[attr];
}
}
上面就是所有的代碼,你可以找五張圖片試一試。
實際開發(fā)中效率還是最重要的,因為現(xiàn)在瀏覽器的性能已經(jīng)非常好了,所以jQ的有些缺點完全可以忽略不計啦,并且jQ的兼容性真的是不錯的,能節(jié)省開發(fā)人員很多的時間和精力,我也很支持在工作項目中用jQ來開發(fā),可是作為一個真正的前端技術人員,你要時刻了解底層代碼的實現(xiàn),這樣隨著科技的發(fā)展,你也不會落于人后。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
JS request函數(shù) 用來獲取url參數(shù)
項目中經(jīng)常會遇到這種問題 下面代碼解決問題!2010-05-05
js判斷請求的url是否可訪問,支持跨域判斷的實現(xiàn)方法
下面小編就為大家?guī)硪黄猨s判斷請求的url是否可訪問,支持跨域判斷的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
通過實例理解javascript中沒有函數(shù)重載的概念
這篇文章主要介紹了通過實例理解javascript中沒有函數(shù)重載的概念,十分的簡單易懂,需要的朋友可以參考下2015-06-06
JS遍歷JSON數(shù)組及獲取JSON數(shù)組長度操作示例【測試可用】
這篇文章主要介紹了JS遍歷JSON數(shù)組及獲取JSON數(shù)組長度操作,涉及javascript簡單json數(shù)組遍歷與運算相關操作技巧,需要的朋友可以參考下2018-12-12

