今天要做的是捲動畫面到一定位置的時候顯示圖片,當圖片離開畫面時消失
function debounce(func, wait = 20, immediate = true) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
function checkSlide(e) {
console.log(e);
}
window.addEventListener('scroll', debounce(checkSlide));
首先要來介紹一下debounce
這個function,當我們捲動畫面時,事件監聽器就會被觸發,從頭捲到尾可能就會觸發幾十次事件,所以我們加上debounce
,用來限制function觸發的次數
const sliderImages = document.querySelectorAll('.slide-in');
function checkSlide(e) {
sliderImages.forEach(sliderImage => {
//圖片的一半位置
const slideInAt = (window.scrollY + window.innerHeight) - sliderImage.height / 2;
const isHalfShown = slideInAt > sliderImage.offsetTop;
});
}
我們要取得每張圖片的中間位置,來判定畫面是否過了中線,然後顯示
window.scrollY
畫面向下捲動的像素值
window.innerHeight
視窗高度
element.height
圖片高度
所以我們可以算出圖片進入畫面的位置
const slideInAt = (window.scrollY + window.innerHeight) - sliderImage.height / 2;
還有判定的條件
const isHalfShown = slideInAt > sliderImage.offsetTop;
element.offsetTop
元素距離外層容器上方的距離
p.s. 圖片外層只有一層父元素,所以可以直接使用
const sliderImages = document.querySelectorAll('.slide-in');
function checkSlide(e) {
sliderImages.forEach(sliderImage => {
//圖片的一半位置
const slideInAt = (window.scrollY + window.innerHeight) - sliderImage.height / 2;
//圖片的底部
const imageBottom = sliderImage.offsetTop + sliderImage.height;
const isHalfShown = slideInAt > sliderImage.offsetTop;
const isNotScrolledPass = window.scrollY < imageBottom;
if (isHalfShown && isNotScrolledPass){
sliderImage.classList.add('active');
} else {
sliderImage.classList.remove('active');
}
});
}
接下來是圖片消失的位置,當圖片底部高於視窗頂部時,圖片消失
因此得出以下結果
const imageBottom = sliderImage.offsetTop + sliderImage.height;
const isNotScrolledPass = window.scrollY < imageBottom;
最後,當滿足圖片出現的條件時,加上active class