原生js與jQuery實(shí)現(xiàn)簡單的tab切換特效對比
tab頁簽通常適用于空間有限而內(nèi)容較多同時兼顧頁面美觀度不給用戶一種信息過量視覺疲勞的情形。使用面非常廣,下面我們用兩種方法簡單實(shí)現(xiàn)之。
首先,構(gòu)建頁面元素。頁簽的可點(diǎn)擊部分我們通常用列表來承載,包括ul和ol,我們這里讓頁簽呈橫向分布,所以需要使之向左浮動。而頁簽內(nèi)容部分使用div承載即可。另外,我們需要對具有共性的元素統(tǒng)一控制樣式和行為,所以就有了下面的dom結(jié)構(gòu):
<div id="main"> <ul id="tabbar" class="cl"> <li class="t1">t1</li> <li class="def">t2</li> <li class="def">t3</li> <li class="def">t4</li> <li class="def">t5</li> </ul> <div id="content"> <div class="cont t1">Hi !</div> <div class="cont t2">I Like You!</div> <div class="cont t3">Hello World!</div> <div class="cont t4">How Are You?</div> <div class="cont t5">I'm fine ,and you?</div> </div> </div>
ul左浮動以后,為了清除浮動對后續(xù)元素的影響,所以通過after偽類設(shè)置clear屬性,同時兼顧ie低版本加入zoom觸發(fā)ie haslayout。所以就有了下面的樣式:
html,body,div,ul,li{margin:0; padding:0; } .cl{zoom:1;} .cl:after{display:block; height:0; clear:both; visibility:hidden; overflow:hidden; content:'.';} ul{list-style:none;} body{padding-top:100px; background:#eee; font-family:Microsoft YaHei, Arial, Helvetica, sans-serif;} #main{margin:0 auto; width:800px;} #main #tabbar{} #main #tabbar li,#main #content .cont{text-align:center; color:#fff;} #main #tabbar li{padding:0 20px; height:35px; line-height:35px; font-size:14px; cursor:pointer; float:left;} #main #content{height:350px; overflow:hidden; position:relative;} #main #content .cont{width:100%; height:350px; line-height:350px; font-size:48px; z-index:0; position:absolute;} #main #tabbar li.def{color:#333; background:#fff;} #main #tabbar li.t1,#main #content .cont.t1{color:#fff; background:#4e6b9c;} #main #tabbar li.t2,#main #content .cont.t2{color:#fff; background:#c52946;} #main #tabbar li.t3,#main #content .cont.t3{color:#fff; background:#33a6ff;} #main #tabbar li.t4,#main #content .cont.t4{color:#fff; background:#ffab4e;} #main #tabbar li.t5,#main #content .cont.t5{color:#fff; background:#64bccc;}
html部分大致如此。
采用原生js實(shí)現(xiàn)時,我們這里主要對每個li分別綁定點(diǎn)擊事件,通過點(diǎn)擊使當(dāng)前內(nèi)容頁顯示,其他內(nèi)容頁隱藏,顯隱的過程通過定時器不斷增減內(nèi)容的透明度直至完全隱藏或顯示。
window.onload = function(){ var tabs = document.getElementById("tabbar").getElementsByTagName("li"); var cont = document.getElementById("content").getElementsByTagName("div"); var len = cont.length; var flag = true; var fade = function(elem, callback, type){ type || (type = "in"); var px, timer; if(type == "in") { px = 0; timer = setInterval(function(){ px += 3; if(px <= 100) { elem.style.opacity ? (elem.style.opacity = (px / 100)) : (elem.style["filter"] = "alpha(opacity=" + px + ")"); } else { clearInterval(timer); elem.style.opacity ? (elem.style.opacity = 1) : (elem.style["filter"] = "alpha(opacity=100)"); callback && callback(elem); } },10); } else { px = 100; timer = setInterval(function(){ px -= 3; if(px >= 0) { document.addEventListener ? (elem.style.opacity = (px / 100)) : (elem.style["filter"] = "alpha(opacity=" + px + ")"); } else { clearInterval(timer); elem.style.opacity ? (elem.style.opacity = 0) : (elem.style["filter"] = "alpha(opacity=0)"); callback && callback(elem); } },10); } } for(var i = 0; i < len; i++) { cont[i].style.zIndex = len - i; tabs[i].index = cont[i].index = i; tabs[i].onclick = function(){ if(flag) { flag = false; cont[this.index].style.display = "block"; fade(cont[this.index]); for(var i = 0; i < len; i++) { tabs[i].className = "def"; if(tabs[i].index != this.index) { fade ( cont[i], function(elem) { elem.style.display = "none"; elem.className = "cont t" + (elem.index + 1); flag = true; }, "out" ); } } this.className = "t" + (this.index + 1); } } } };
由上可見,其實(shí)使用原生js操作dom還是比較麻煩的,不然“write less,do more”的jQuery也不會誕生。下面用jQuery簡單實(shí)現(xiàn):
$(function(){ var tabs = $("#tabbar li"); var cont = $("#content .cont"); var len = cont.length; cont.each(function(inx, elem){$(elem).css("z-index", len - inx);}).andSelf().hide().andSelf().eq(1).show(); tabs.click(function(){ var inx = tabs.index(this); tabs.removeAttr("class").addClass("def").andSelf().eq(inx + 1).addClass("t" + (inx + 1)); cont.fadeOut(300).not(this).andSelf().eq(inx).fadeIn(300); }); } );
這個例子比較簡單,但卻很實(shí)用,當(dāng)然實(shí)際工作中我們一般不會這樣去寫,我們通常會把以此為基礎(chǔ)去封裝一個可重用的控件,但基本思想不變。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
- jQuery插件zepto.js簡單實(shí)現(xiàn)tab切換
- jQuery實(shí)現(xiàn)的tab標(biāo)簽切換效果示例
- jquery實(shí)現(xiàn)簡單Tab切換菜單效果
- jquery編寫Tab選項(xiàng)卡滾動導(dǎo)航切換特效
- jQuery+css實(shí)現(xiàn)的tab切換標(biāo)簽(兼容各瀏覽器)
- jQuery實(shí)現(xiàn)Tab選項(xiàng)卡切換效果簡單演示
- jQuery實(shí)現(xiàn)的Tab滑動選項(xiàng)卡及圖片切換(多種效果)小結(jié)
- jquery實(shí)現(xiàn)初次打開有動畫效果的網(wǎng)頁TAB切換代碼
- jQuery實(shí)現(xiàn)帶延遲的二級tab切換下拉列表效果
- jquery實(shí)現(xiàn)的仿天貓側(cè)導(dǎo)航tab切換效果
- jQuery插件實(shí)現(xiàn)非常實(shí)用的tab欄切換功能【案例】
相關(guān)文章
input 標(biāo)簽實(shí)現(xiàn)輸入框帶提示文字效果(兩種方法)
這篇文章主要介紹了input 標(biāo)簽實(shí)現(xiàn)輸入框帶提示文字效果(兩種方法),需要的朋友可以參考下2017-10-10微信小程序canvas實(shí)現(xiàn)環(huán)形漸變
這篇文章主要為大家詳細(xì)介紹了微信小程序canvas實(shí)現(xiàn)環(huán)形漸變,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08談?wù)勎覍avaScript中typeof和instanceof的深入理解
這次主要說說javascript的類型判斷函數(shù)typeof和判斷構(gòu)造函數(shù)原型instanceof的用法和注意的地方,對本文感興趣的朋友一起看看吧2015-12-12如何使用原生Js實(shí)現(xiàn)隨機(jī)點(diǎn)名詳解
這篇文章主要給大家介紹了關(guān)于如何使用原生Js實(shí)現(xiàn)隨機(jī)點(diǎn)名的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01JavaScript sort數(shù)組排序方法和自我實(shí)現(xiàn)排序方法小結(jié)
這篇文章主要介紹了JavaScript sort數(shù)組排序方法和自我實(shí)現(xiàn)排序方法小結(jié)的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06原生JavaScript實(shí)現(xiàn)瀑布流布局
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)瀑布流布局的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-12-12JavaScript實(shí)現(xiàn)自動生成網(wǎng)頁元素功能(按鈕、文本等)
這篇文章主要介紹了JavaScript實(shí)現(xiàn)自動生成網(wǎng)頁元素功能,文章列出了三種可以進(jìn)行增刪改克隆按鈕、文本等元素的方法,感興趣的小伙伴們可以參考一下2015-11-11推薦三款不錯的圖片壓縮上傳插件(webuploader、localResizeIMG4、LUploader)
這篇文章主要為大家詳細(xì)介紹了三款不錯的圖片壓縮上傳插件,webuploader、移動端上傳插件localResizeIMG4以及LUploader)2017-04-04