js+css在交互上的應(yīng)用
以下用一個(gè)簡(jiǎn)單的例子來(lái)闡述我想說(shuō)的。
CSS代碼:
#nav li ul {
display:none;
}
HTML代碼:
<div id="nav">
<ul class="">
<li>
<h3>菜單1</h3>
<ul>
<li>子菜單1</li>
<li>子菜單2</li>
<li>子菜單3</li>
<li>子菜單4</li>
</ul>
</li>
<li>
<h3>菜單2</h3>
<ul>
<li>子菜單1</li>
<li>子菜單2</li>
<li>子菜單3</li>
<li>子菜單4</li>
<li>子菜單4</li>
</ul>
</li>
</ul>
</div>
效果如下:

需要的效果是:
1、初始時(shí),所有的子菜單都是隱藏的。
2、點(diǎn)擊菜單項(xiàng),相應(yīng)的子菜單列表顯示。
3、再點(diǎn)擊, 子菜單隱藏。
半年前的我的做法會(huì)是這樣:取得#nav中的h3元素,循環(huán)在其上添加事件。事件判斷其下一個(gè)兄弟節(jié)點(diǎn)是否隱藏,根據(jù)狀態(tài)修改子菜單ul元素的display屬性。
代碼大致如下:(以下所有代碼僅用于表達(dá)邏輯,請(qǐng)不要糾結(jié)于是否可執(zhí)行。)
var els = [...]; //代碼取得h3元素?cái)?shù)組。
for(var i=0; i < els.length; i++) {
els[i].addEventListener("click",function() {
var target = this.nextSibling;
if(target.style.display == "none")
target.style.display = "block";
else
target.style.display = "none"
}, false);
}
一個(gè)月前的話,做法大概是這樣:在#nav > ul上直接添加事件,在事件中判斷目標(biāo)對(duì)象是否h3對(duì)象。如果是則取得下一個(gè)兄弟節(jié)點(diǎn),并根據(jù)其顯示狀態(tài)來(lái)修改display屬性。
代碼大致如下:
var container = document.getElementById("nav");
container.addEventListener("click", function(e) {
var target = e.target, list;
if(target.tagName == "H3") {
list = target.nextSibling;
if(list.style.display === "none")
list.style.display = "block";
else
list.style.display = "none";
}
}, false);
兩種做法,孰優(yōu)孰劣請(qǐng)自行判斷。
前段時(shí)間做了一個(gè)需求,在代碼中看到另外的一種思路——這才是我在這里要說(shuō)的——利用CSS來(lái)完成交互。
依然是代碼:
CSS代碼:
#nav li.menu ul {
display:block;
}
JS代碼大致如下:
var el = document.getElementById("nav");
el.addEventListener("click", function(e) {
var target = e.target.parentNode;
if(target.tagName == "LI") {
if(target.className == "")
target.className = "menu";
}else {
target.className = "";
}
}
}, false);
看看代碼,貌似第三種方法跟第二種差不多嘛。
恩~~,如果點(diǎn)擊h3元素不止是修改下一個(gè)ul元素的顯示狀態(tài),比如還要修改h3的背景圖案呢?
這時(shí)候第二個(gè)方法需要在根據(jù)h3的background屬性來(lái)修改值,而第三種只需要添加一條樣式:#nav li.menu h3{background:url(...)}即可了。
其他的就沒(méi)什么好說(shuō)了。大家都有自己的判斷,孰優(yōu)孰劣心里自有評(píng)斷。
PS:
如果一個(gè)頁(yè)面存在別的樣式表影響了你的樣式,就會(huì)有個(gè)優(yōu)先權(quán)的問(wèn)題。我們都知道id,class和tag的優(yōu)先級(jí)別,但是對(duì)一個(gè)表達(dá)式,它的優(yōu)先權(quán)是怎么計(jì)算的呢?
請(qǐng)google一下,或者先看看《老調(diào)重彈的CSS優(yōu)先級(jí)》。
相關(guān)文章
JS隨機(jī)洗牌算法之?dāng)?shù)組隨機(jī)排序
這篇文章主要介紹了JS隨機(jī)洗牌算法之給數(shù)組隨機(jī)排序的相關(guān)資料,需要的朋友可以參考下2016-03-03JavaScript?算法實(shí)現(xiàn)復(fù)寫0雙指針解法
這篇文章主要為大家介紹了JavaScript?算法?復(fù)寫0雙指針解法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Javascript實(shí)現(xiàn)登錄框拖拽效果
這篇文章主要為大家詳細(xì)介紹了Javascript實(shí)現(xiàn)登錄框拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10js es6系列教程 - 新的類語(yǔ)法實(shí)戰(zhàn)選項(xiàng)卡(詳解)
下面小編就為大家?guī)?lái)一篇js es6系列教程 - 新的類語(yǔ)法實(shí)戰(zhàn)選項(xiàng)卡(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09js實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組兩種簡(jiǎn)單方法
在日常開發(fā)中我們可能會(huì)遇到返回的數(shù)據(jù)不能直接使用,而數(shù)據(jù)提供者只給你傳遞二維數(shù)據(jù)格式的數(shù)據(jù),這個(gè)時(shí)候就需要我們做轉(zhuǎn)換,這篇文章主要給大家介紹了關(guān)于js實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組的兩種簡(jiǎn)單方法,需要的朋友可以參考下2023-12-12JS實(shí)現(xiàn)的倒計(jì)時(shí)恢復(fù)按鈕點(diǎn)擊功能【可用于協(xié)議閱讀倒計(jì)時(shí)】
這篇文章主要介紹了JS實(shí)現(xiàn)的倒計(jì)時(shí)恢復(fù)按鈕點(diǎn)擊功能,可用于協(xié)議閱讀倒計(jì)時(shí),涉及javascript基于setInterval的時(shí)間定時(shí)觸發(fā)相關(guān)操作技巧,需要的朋友可以參考下2018-04-04符合W3C網(wǎng)頁(yè)標(biāo)準(zhǔn)的iframe標(biāo)簽的使用方法
符合W3C網(wǎng)頁(yè)標(biāo)準(zhǔn)的iframe標(biāo)簽的使用方法...2007-07-07JS+HTML實(shí)現(xiàn)經(jīng)典游戲吃豆人
吃豆游戲可以說(shuō)是我們80,90后共同的回憶錄,小時(shí)候常常在學(xué)習(xí)機(jī)上玩,所以也就有了強(qiáng)烈的欲望去寫。所以本文將利用JS+HTML實(shí)現(xiàn)這一經(jīng)典游戲,需要的可以參考一下2022-04-04javascript getElementsByClassName 和js取地址欄參數(shù)
為了從一大堆HTML代碼中找出我們的樹狀菜單(也許有多個(gè)),我們先來(lái)實(shí)現(xiàn)一個(gè)通過(guò)className找DOM節(jié)點(diǎn)的方法:getElementsByClassName。這是對(duì)瀏覽器自有DOM方法的一個(gè)簡(jiǎn)單但實(shí)用的擴(kuò)充。2010-01-01