專案介紹: 滾動視窗到定點時動畫滑入圖片的效果。
作品頁面:https://iris1114.github.io/javascript30/13_Slide-in-on-Scroll/
code
1//在一定時間20秒內只能觸發一次。2function debounce(func, wait = 20, immediate = true) {3 var timeout;4 return function() {5 var context = this,6 args = arguments;7 var later = function() {8 timeout = null;9 if (!immediate) func.apply(context, args);10 };11 var callNow = immediate && !timeout;12 clearTimeout(timeout);13 timeout = setTimeout(later, wait);14 if (callNow) func.apply(context, args);15 };16}1718//頁面滾到指定高度時,讓圖片滑入、滑出文章1920function checkSlide() {21 sliderImages.forEach((sliderImage) => {22 //頁面已滾動距離 + 螢幕高度 - 圖片一半的高度 = 圖片滑入文章的高度23 const slideInAt =24 window.scrollY + window.innerHeight - sliderImage.height / 2;2526 //圖片至螢幕頂端的距離 + 圖片的高度 = 圖片底部至螢幕頂端的距離27 const imageBottom = sliderImage.offsetTop + sliderImage.height;2829 //判斷是否已達圖片應滑入高度,即圖片滑入文章的高度 > 圖片至螢幕頂端的距離30 const isHalfShown = slideInAt > sliderImage.offsetTop;3132 //判斷是否未達圖片應滑出高度,即頁面已滾動距離 < 圖片底部至螢幕頂端的距離33 const isNotScrolledPast = window.scrollY < imageBottom;3435 //如果已達圖片應滑入高度,且未達圖片應滑出高度,就加上 `active` 樣式36 if (isHalfShown && isNotScrolledPast) {37 sliderImage.classList.add("active");38 } else {39 sliderImage.classList.remove("active");40 }41 });42}4344const sliderImages = document.querySelectorAll(".slide-in");4546window.addEventListener("scroll", debounce(checkSlide));
補充
Window.scrollY
垂直方向已滚动的像素值。
Window.innerHeight
瀏覽器窗口的視口(viewport)高度(以像素為單位);如果有水平滾動條,也包括滾動條高度。
HTMLElement.offsetTop
HTMLElement.offsetTop 為只讀屬性,它返回當前元素相對於其 offsetParent 元素的頂部內邊距的距離。