前言
本文為「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));
  |