參考資料:https://www.youtube.com/watch?v=w-SpaTBf-j0

在製作https://codepen.io/arvjungs-the-animator/pen/zxORxvo?editors=1010的切版練習時

左上角的手機選單原想製作一個自動收合的功能

// 當滑鼠滑出collapseMenu區塊,觸發事件-為collapse-menu取消active class
collapseMenu.addEventListener("mouseleave", () => {
collapseMenu.classList.remove("active");
});

下意識寫了mouseleave的事件監聽器

然而才發現手機並沒有所謂mouseleave的事件

(ps 假設妳有文字hover會變色 觸控裝置會變成點這個文字之後會一直變色 直到妳點其他地方)

這時改採用focus

https://zh.javascript.info/focus-blur

//當focus ham-btn,觸發事件-為collapse-menu加上active class
const hamBtn = document.querySelector(".ham-btn");
const collapseMenu = document.querySelector(".collapse-menu");
hamBtn.addEventListener("focus", () => {
collapseMenu.classList.toggle("active");
});
hamBtn.addEventListener("blur", () => {
collapseMenu.classList.remove("active");
});

發現在電腦上運作正常 :點擊btn打開選單,點擊其他關閉選單

然而手機毫無反應LOL手機沒focus事件謝謝

邏輯是這樣的:當不在menu上點擊 且 用戶所點擊的元素不是btn本身時,為collapseMenu移除active的class

//當不在menu上點擊 且 用戶所點擊的元素不是btn本身,移除active class
document.addEventListener("click", (e) => {
if (!collapseMenu.contains(e.target) && e.target !== collapseBtn) {
collapseMenu.classList.remove("active");
}
console.log(e.target!== collapseBtn);
});

然而卻沒有用,原因是發現當滑鼠在漢堡按鈕上點擊時,console.log(e.target!== collapseBtn);會瘋狂的印出true:

image.png

於是改印出console.log(e.target)看看到底點擊了什麼,發現原來滑鼠在點擊漢堡按鈕時,有以下兩種可能:

<i class="fa-solid fa-bars"></i> -當你很準確按在三條線上時