前言
本文為「JavaScript 30」教學影片的學習筆記。
目標
使滑鼠在滑進和滑出導覽列的列表元素時,產生背景的動畫效果。
筆記
選取所有導覽列的列表元素。
1
| const triggers = document.querySelectorAll('.cool > li');
|
選取導覽列列表的背景元素。
1
| const background = document.querySelector('.dropdownBackground');
|
選取整個導覽列元素。
1
| const nav = document.querySelector('.top');
|
建立一個 handleEnter()
方法,以出現背景。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| function handleEnter() { this.classList.add('trigger-enter'); setTimeout(() => this.classList.contains('trigger-enter') && this.classList.add('trigger-enter-active'), 150); background.classList.add('open');
const dropdown = this.querySelector('.dropdown'); const dropdownCoords = dropdown.getBoundingClientRect(); const navCoords = nav.getBoundingClientRect();
const coords = { height: dropdownCoords.height, width: dropdownCoords.width, top: dropdownCoords.top - navCoords.top, left: dropdownCoords.left - navCoords.left };
background.style.setProperty('width', `${coords.width}px`); background.style.setProperty('height', `${coords.height}px`); background.style.setProperty('transform', `translate(${coords.left}px, ${coords.top}px)`); }
|
getBoundingClientRect()
方法會返回元素的大小及其相對於螢幕的位置。
建立一個 handleLeave()
方法,以移除背景。
1 2 3 4 5 6
| function handleLeave() { this.classList.remove('trigger-enter', 'trigger-enter-active'); background.classList.remove('open'); }
|
監聽所有導覽列的列表元素,當發生 mouseenter
事件時,觸發 handleEnter()
方法。
1
| triggers.forEach(trigger => trigger.addEventListener('mouseenter', handleEnter));
|
監聽所有導覽列的列表元素,當發生 mouseleave
事件時,觸發 handleLeave()
方法。
1
| triggers.forEach(trigger => trigger.addEventListener('mouseleave', handleLeave));
|