html/css 滾動到元素位置,顯示加載動畫
- 2020 年 6 月 19 日
- 筆記
- HTML/CSS/JS
每次滾動到元素時,都顯示加載動畫,如何添加?
元素添加初始參數
以上圖中的動畫為例,添加倆個左右容器,將內容放置在容器內部。
添加初始數據,默認透明度0、左右分別移動100px。
1 //左側容器 2 .item-leftContainer { 3 opacity: 0; 4 transform: translateX(-100px); 5 } 6 //右側容器 7 .item-rightContainer { 8 opacity: 0; 9 transform: translateX(100px); 10 }
添加動畫數據
在less中添加動畫數據。這裡只設置了to,也可以省略第1步中的初始參數設置而在動畫里設置from。
執行後,透明度由0到1,倆個容器向中間移動100px回到原處。
1 //動畫 2 @keyframes showLeft { 3 to { 4 opacity: 1; 5 transform: translateX(0px); 6 } 7 } 8 @keyframes showRight { 9 to { 10 opacity: 1; 11 transform: translateX(0px); 12 } 13 } 14 @keyframes hideLeft { 15 to { 16 opacity: 0; 17 transform: translateX(-100px); 18 } 19 } 20 @keyframes hideRight { 21 to { 22 opacity: 0; 23 transform: translateX(100px); 24 } 25 }
觸發動畫
頁面加載/刷新觸發 – 在componentDidMount中執行
頁面滾動時觸發 – 在componentDidMount、componentWillUnmount添加監聽/註銷頁面滾動的事件
校驗當前滾動高度與元素的位置差異:
window.pageYOffset(滾動距離) + windowHeight(窗口高度) > leftElement.offsetTop (元素的相對位置)+ parentOffsetTop(父元素的相對位置) + 200
- 真正的滾動視覺位置 – window.pageYOffset(滾動距離) + windowHeight(窗口高度)
- 元素距離頂部的高度 – 這裡使用了leftElement.offsetTop + parentOffsetTop,原因是父容器使用了absolute絕對定位。如果是正常布局的話,使用元素當前的位置leftElement.offsetTop即可
- 額外添加200高度,是為了優化視覺體驗。當超出200高度時才觸發動畫
當頁面滾動到下方,觸發顯示動畫;當頁面重新滾動到上方,觸發隱藏動畫。
1 componentDidMount() { 2 this.checkScrollHeightAndLoadAnimation(); 3 window.addEventListener('scroll', this.bindHandleScroll); 4 } 5 componentWillUnmount() { 6 window.removeEventListener('scroll', this.bindHandleScroll); 7 } 8 bindHandleScroll = (event) => { 9 this.checkScrollHeightAndLoadAnimation(); 10 } 11 checkScrollHeightAndLoadAnimation() { 12 const windowHeight = window.innerHeight; 13 let parentEelement = document.getElementById("softwareUsingWays-container") as HTMLElement; 14 const parentOffsetTop = parentEelement.offsetTop; 15 let leftElement = (parentEelement.getElementsByClassName("item-leftContainer") as HTMLCollectionOf<HTMLElement>)[0]; 16 if (window.pageYOffset + windowHeight > leftElement.offsetTop + parentOffsetTop + 200) { 17 leftElement.style.animation = "showLeft .6s forwards" //添加動畫 18 } else { 19 leftElement.style.animation = "hideLeft 0s forwards" //隱藏動畫 20 } 21 let rightElement = (parentEelement.getElementsByClassName(".item-rightContainer") as HTMLCollectionOf<HTMLElement>)[0]; 22 if (window.pageYOffset + windowHeight > rightElement.offsetTop + parentOffsetTop + 200) { 23 rightElement.style.animation = "showRight .6s forwards" //添加動畫 24 } else { 25 rightElement.style.animation = "hideRight 0s forwards" //隱藏動畫 26 } 27 }
關鍵字:React 滾動、加載/出現動畫