原生js與jQuery實現(xiàn)簡單的tab切換特效對比
tab頁簽通常適用于空間有限而內(nèi)容較多同時兼顧頁面美觀度不給用戶一種信息過量視覺疲勞的情形。使用面非常廣,下面我們用兩種方法簡單實現(xiàn)之。
首先,構(gòu)建頁面元素。頁簽的可點擊部分我們通常用列表來承載,包括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實現(xiàn)時,我們這里主要對每個li分別綁定點擊事件,通過點擊使當(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);
}
}
}
};
由上可見,其實使用原生js操作dom還是比較麻煩的,不然“write less,do more”的jQuery也不會誕生。下面用jQuery簡單實現(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);
});
}
);
這個例子比較簡單,但卻很實用,當(dāng)然實際工作中我們一般不會這樣去寫,我們通常會把以此為基礎(chǔ)去封裝一個可重用的控件,但基本思想不變。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
- jQuery插件zepto.js簡單實現(xiàn)tab切換
- jQuery實現(xiàn)的tab標(biāo)簽切換效果示例
- jquery實現(xiàn)簡單Tab切換菜單效果
- jquery編寫Tab選項卡滾動導(dǎo)航切換特效
- jQuery+css實現(xiàn)的tab切換標(biāo)簽(兼容各瀏覽器)
- jQuery實現(xiàn)Tab選項卡切換效果簡單演示
- jQuery實現(xiàn)的Tab滑動選項卡及圖片切換(多種效果)小結(jié)
- jquery實現(xiàn)初次打開有動畫效果的網(wǎng)頁TAB切換代碼
- jQuery實現(xiàn)帶延遲的二級tab切換下拉列表效果
- jquery實現(xiàn)的仿天貓側(cè)導(dǎo)航tab切換效果
- jQuery插件實現(xiàn)非常實用的tab欄切換功能【案例】
相關(guān)文章
JavaScript開發(fā)網(wǎng)頁中不常用但很重要的特性用法
JavaScript中的Proxy、WeakMap、WeakSet、Generator函數(shù)、Symbol、CustomEvent、事件委托和Intl對象等特性提供了強(qiáng)大的功能,這些特性在復(fù)雜項目中發(fā)揮著重要作用,本文就給大家介紹了這些特性的用法,需要的朋友可以參考下2024-12-12
bootstrap 下拉多選框進(jìn)行多選傳值問題代碼分析
項目開發(fā)遇到個問題,就是引入bootstrap下拉多選框進(jìn)行多選的時候,用form表單提交到后臺,獲取不到多選的值,只能獲取的選擇的第一個值,怎么回事呢?下面小編給大家分析下bootstrap 下拉多選框進(jìn)行多選傳值問題,一起看看吧2017-02-02
javascript 禁用IE工具欄,導(dǎo)航欄等等實現(xiàn)代碼
在處理問題時候遇到的,就順便記錄與大家一起分享下,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04
JavaScript?邏輯或?||?的妙用及相關(guān)知識普及
本文給大家介紹了JavaScript中的邏輯或運算符||的用法,包括其基本概念、真值和假值、常見應(yīng)用以及與其他邏輯運算符的對比,感興趣的朋友跟隨小編一起看看吧2024-12-12
JSON.parse處理非標(biāo)準(zhǔn)Json數(shù)據(jù)出錯的解決
這篇文章主要介紹了JSON.parse處理非標(biāo)準(zhǔn)Json數(shù)據(jù)出錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
JavaScript函數(shù)apply()和call()用法與異同分析
這篇文章主要介紹了JavaScript函數(shù)apply()和call()用法與異同,結(jié)合實例形式分析了apply()和call()的功能、區(qū)別、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下2018-08-08

