js練習-setTimeout應用

一直覺得js學的不扎實,網上找了項目練手终惑,項目地址在這里绍在。

分析

  1. 首先,子菜單被全部隱藏,將子菜單的樣式設為 display: block;偿渡,發(fā)現子菜單和他所對應的主菜單的左端對其臼寄,后三項子菜單的右端超出導航欄的右端,說明后面需要對子菜單的位置進行設置溜宽;
  2. 子菜單的小箭頭位置也需要移動到他所對應主菜單的中間脯厨;
  3. 最重要的,需要為主菜單添加鼠標事件坑质。

實現

  1. 最簡單的,先為主菜單添加鼠標事件临梗,鼠標懸停涡扼,顯示子菜單,代碼如下盟庞。
let nav = document.querySelector("#nav");
let li = nav.querySelectorAll("li");

li.forEach(function (item) {
  if (item.children.length > 1) { //為有子菜單的主菜單添加鼠標事件
    item.addEventListener("mouseenter", function () {
      let itemSecondChild = item.children[1];
      itemSecondChild.style.display = "block";
      //后續(xù)代碼
    }, false);
  }
})
image1.png
  1. 在鼠標離開主菜單后吃沪,子菜單應消失。
li.forEach(function (item) {
  if (item.children.length > 1) {
    //為有子菜單的主菜單添加鼠標事件
    item.addEventListener("mouseenter", function () {
      //鼠標懸停什猖,顯示子菜單
      let itemSecondChild = item.children[1];
      itemSecondChild.style.display = "block";
      //后續(xù)代碼
    }, false);
    //鼠標離開主菜單票彪,子菜單消失
    item.addEventListener("mouseleave", function () {
      item.children[1].style.display = "none";   
    }, false);
  }
})

注:如果當前節(jié)點有子節(jié)點,鼠標在節(jié)點內部移動時不狮,mouseenter只會被觸發(fā)一次降铸,mouseover移動就會被觸發(fā);mouseleavemouseout同理摇零,當鼠標離開當前節(jié)點內的子節(jié)點推掸,mouseleave不會被觸發(fā),mouseout會被觸發(fā)驻仅。所以為避免多次觸發(fā)谅畅,選擇mouseentermouseover

這樣操作會發(fā)現噪服,子菜單很難被點到(除非手速夠快)毡泻,為了客戶的體驗感,當然要進行優(yōu)化粘优,就把子菜單的顯示時間變得久一點仇味。

  1. 更改「鼠標離開事件」,代碼如下敬飒。

在聲明navli的位置添加

let timer = null;

更改「鼠標離開事件」

item.addEventListener("mouseleave", function () {
  timer = setTimeout(function () {
    item.children[1].style.display = "none";
  }, 300);
}, false);

還是有問題邪铲,雖然子菜單可以被點擊到,但還是有問題无拗,他會憑空消失带到,console.log()測試一下。
在「鼠標懸停事件」添加console.log("1");,在「鼠標離開事件」添加
console.log("2");揽惹,輸出1 2 1 2被饿,第一個 2 是我在從主菜單切換到子菜單輸出的,第二個 2 是哪里來的呢搪搏?第二個 2 是由于 setTimeout 異步執(zhí)行狭握,在0.3秒后,進入主線程疯溺,輸出的結果论颅。該如何解決呢?

  1. 查閱資料囱嫩,這可以通過「阻止冒泡」解決(可以google或百度一下)恃疯。代碼補充在‘后續(xù)代碼’后,見下墨闲。
//后續(xù)代碼
//阻止鼠標離開item瞬間的冒泡行為今妄,如果不阻止,0.3秒后鸳碧,子菜單將不再顯示
//w3c的方法是e.stopPropagation()盾鳞,IE則是使用e.cancelBubble = true
item.addEventListener("mouseover", function (event) {
  event? event.cancelBubble = true : event.stopPropagation();
  clearTimeout(timer);
}, false);
image2.png

運行結果顯示,雖然子菜單可以正常訪問瞻离,可是腾仅,子菜單不會正確消失,需要在「鼠標懸停事件」對子菜單初始化琐脏。

  1. 對子菜單初始化攒砖。代碼補充在‘后續(xù)代碼’后,見下日裙。
//后續(xù)代碼
// 將所有子菜單設為隱藏(如果不將子菜單進行隱藏初始化吹艇,下方的 解決阻止冒泡 會一直將子菜單進行保留“悍鳎可以將此行代碼注釋受神,查看不隱藏初始化的表現)
for (let i = 0; i < subnav.length; i++) subnav[i].style.display = "none";

子菜單正常顯示。

  1. 解決最開始的需求分析:對 超出導航欄右側的 子菜單的位置進行修改格侯,并解決 子菜單的小箭頭 位置的問題鼻听。
    在定義itemSecondChild位置下方添加 em(小箭頭)的定義
let em = itemSecondChild.children[0];

代碼同樣添加到‘后續(xù)代碼’后。

//對主菜單下的箭頭位置進行設置联四,設置為主菜單的中間位置撑碴。
em.style.left = item.offsetWidth / 2 + "px";

//子菜單右側超出主菜單,對子菜單位置進行調整朝墩。箭頭位置也隨之改變醉拓,也進行設置。
if (nav.offsetWidth - item.offsetLeft < itemSecondChild.offsetWidth) {
  itemSecondChild.style.right = "0";
  em.style.left = item.offsetLeft - itemSecondChild.offsetLeft + item.offsetWidth / 2 + "px";
}

完整代碼在這里
如有錯誤,歡迎指正亿卤。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末愤兵,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子排吴,更是在濱河造成了極大的恐慌秆乳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钻哩,死亡現場離奇詭異屹堰,居然都是意外死亡,警方通過查閱死者的電腦和手機街氢,發(fā)現死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門双藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阳仔,你說我怎么就攤上這事】鄄矗” “怎么了近范?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長延蟹。 經常有香客問我评矩,道長,這世上最難降的妖魔是什么阱飘? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任斥杜,我火速辦了婚禮,結果婚禮上沥匈,老公的妹妹穿的比我還像新娘蔗喂。我一直安慰自己,他們只是感情好高帖,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布缰儿。 她就那樣靜靜地躺著,像睡著了一般散址。 火紅的嫁衣襯著肌膚如雪乖阵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天预麸,我揣著相機與錄音瞪浸,去河邊找鬼。 笑死吏祸,一個胖子當著我的面吹牛对蒲,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼齐蔽,長吁一口氣:“原來是場噩夢啊……” “哼两疚!你這毒婦竟也來了?” 一聲冷哼從身側響起含滴,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诱渤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谈况,有當地人在樹林里發(fā)現了一具尸體勺美,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年碑韵,在試婚紗的時候發(fā)現自己被綠了赡茸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祝闻,死狀恐怖占卧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情联喘,我是刑警寧澤华蜒,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站豁遭,受9級特大地震影響叭喜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蓖谢,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一捂蕴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闪幽,春花似錦啥辨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腊嗡,卻和暖如春着倾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燕少。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工卡者, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人客们。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓崇决,卻偏偏與公主長得像材诽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恒傻,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355