# JS 滑鼠Event ## 相關函式 | 事件名 | 是否冒泡 | |:----- |:-------- | | click | 是 | | dblclick | 是 | | mousedown | 是 | | mouseup | 是 | | mouseover | 是 | | mouseout | 是 | | mousemove | 是 | --- ## 範例 :::spoiler **click event - block** CSS ```CSS! <style> div.parent_block{ background-color: red; padding: 20px; } div.outer_block{ background-color: orange; padding: 20px; } div.inner_block{ background-color: black; color: white; } </style> ``` HTML ```HTML! <div class="parent_block"> 這是紅色區域 <div class="outer_block"> 這是橘色區域 <div class="inner_block"> 這是黑色區域 </div> </div> </div> ``` JS ```javascript! <script> let div_parent_block = document.getElementsByClassName("parent_block")[0]; div_parent_block.addEventListener("click", function(e){ //e.stopPropagation(); alert("點擊紅色區域"); }); let div_outer_block = document.getElementsByClassName("outer_block")[0]; div_outer_block.addEventListener("click", function(e){ e.stopPropagation(); alert("點擊橘色區域"); }); let div_inner_block = document.getElementsByClassName("inner_block")[0]; div_inner_block.addEventListener("click", function(e){ //e.stopPropagation(); alert("點擊黑色區域"); }); </script> ``` ::: * 說明:黑色區域沒有使用 **停止事件冒泡函式** ,所以當點擊完黑色區塊、顯示alert後,會繼續漫延至上層,跳出橘色區塊的alert。 * Demo: ![](https://i.imgur.com/rlLUlbt.gif) --- :::spoiler **click event - lightbox** CSS ```CSS! <style> button{ cursor: pointer; } #lightbox{ background-color: hsla(0, 0%, 0%, .5); width: 100%; height: 100vh; position: fixed; top: 0; left: 0; } .none{ display: none; } #lightbox > article{ background-color: white; width: 90%; max-width: 800px; border-radius: 10px; box-shadow: 0 0 10px #ddd; padding: 10px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style> ``` HTML ```HTML! <button type="button" class="btn_modal">開啟 Modal 彈跳視窗</button> <div id="lightbox" class="none"> <article> <h1>這是 Modal 裡的標題</h1> <p>這是 Modal 段落</p> <button type="button" class="btn_modal_close">關閉</button> </article> </div> ``` JS ```javascript! <script> let lightbox_el = document.getElementById("lightbox"); let btn_modal = document.getElementsByClassName("btn_modal")[0]; btn_modal.addEventListener("click", function(){ lightbox_el.classList.remove("none"); }); let btn_modal_close = document.getElementsByClassName("btn_modal_close")[0]; btn_modal_close.addEventListener("click", function(){ lightbox_el.classList.add("none"); }); lightbox_el.addEventListener("click", function(){ this.classList.add("none"); }); lightbox_el.querySelector("article").addEventListener("click", function(e){ e.stopPropagation(); }); </script> ``` ::: * 說明:在article層加上 **停止事件冒泡函式**,則點擊 lightbox 中的白色區域,就不會關掉 modal。 * Demo: ![](https://i.imgur.com/lXbHrc2.gif) --- :::spoiler **click event - remove element** HTML ```HTML! <ul class="list"> <li> <button type="button" class="del">刪除</button> 這是文字1 </li> <li> <button type="button" class="del">刪除</button> 這是文字2 </li> </ul> ``` JS ```javascript! <script> let all_del = document.getElementsByClassName("del"); for(let i = 0; i < all_del.length; i++) { console.log(i); all_del[i].addEventListener("click", function() { this.disabled = true; let closest_li = this.closest("li"); closest_li.classList.add("-remove"); setTimeout(function() { closest_li.remove(); }, 1000); }); } </script> ``` ::: * 說明: * `this.disabled = true` 用以將del元素禁用,無法被再次點擊 * `closest()` 用以找到最近的 `li` 父元素 * `setTimeout()` 用以設置 `li` 在1000毫秒後移除 * Demo: ![](https://i.imgur.com/Fg3W4zV.gif) --- :::spoiler **mouse event - img after mouse** CSS ```CSS! <style> html { /* cursor: none; */ } #img { position: fixed; width: 20px; } </style> ``` HTML ```HtML! <img src="https://alldata.sgp1.digitaloceanspaces.com/images/icon_animate.gif" id="img"> ``` JS ```javascript! <script> let the_img = document.getElementById("img"); document.addEventListener("mousemove", function(e){ // console.log(e.pageX); // console.log(e.pageY); // console.log(window.scrollY); the_img.style.left = e.pageX + 10 + "px"; the_img.style.top = e.pageY - window.scrollY + 10 + "px"; }); </script> ``` ::: * 說明: * `e.pageX` 代表滑鼠距離頁面最左側的距離 * `e.pageY` 代表滑鼠距離頁面最上方的距離 * `window.scrollY` 代表垂直方向滑動的距離 * Demo: ![](https://i.imgur.com/ejNq5K4.gif) ###### tags: `frontend` `jsnote` [:arrow_right: Back to Front End Homepage :arrow_left:](/S-c0eqQmS16D8tcTx4ae1g)