
實作一個當畫面滾動到圖片區域時圖片以動畫方式跑出
學習 window 事件
先了解 window 事件(MDN)windowTop :畫面最上面 = window.scrollY 、windowBottom:畫面最底部 = windowTop + window.innerHeight
圖片樣式:圖片中加上 .active 時就會彈出
取得所有圖片
const sliderImages = document.querySelectorAll('.slide-in');
使用 window 事件的 scroll 觸發 function ,可以 console 確認。
window.addEventListener('scroll', scrollHandler);
建立 callbackscrollHandler
function scrollHandler() {}
計算照片彈入彈出時間點:
計算圖片的一半位置
const imgMiddle = sliderImage.offsetTop + sliderImage.height / 2;
當圖片的一半小於畫面底部 和 圖片的一半大於畫面頂部時 就彈出圖片
if (imgMiddle < windowBottom && imgMiddle > windowTop) {
sliderImage.classList.add("active");
} else {
sliderImage.classList.remove("active");
}
加入debounce : 加入以後圖片會比較慢彈入(20毫秒不做事就彈入)。
function debounce(func, wait = 20, immediate = true) {
var timeout;
return function () {
var context = this,
args = arguments;
var later = function () {
timeout = null;
func.apply(context, args);
};
if (timeout) return;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (immediate) func.apply(context, args);
};
}
window.addEventListener('scroll', debounce(scrollHandler));
window.scroll
window.scrollTo() :移動至,畫面上(x, y)軸的距離。window scroll 是一個連續觸發的事件,相對比較耗效能。debounce 防抖動
debounce 是針對連續觸發事件,希望過濾它把次數降低,大部分會有幾個參數 func :要觸發的function 、 wait : 等待多久時間、immediate 立即觸發。debounce 是一種閉包的寫法:封閉的包裝,內層函式可以取得外層函式作用域內的變數。debounce function 裡 apply
apply :傳參數限定 2 筆,第二筆之後用陣列包起來,可以對應 argument 。call 有點像apply只是傳參數不限定筆數