實作一個當畫面滾動到圖片區域時圖片以動畫方式跑出
學習 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
只是傳參數不限定筆數