每次滾動到元素時,都顯示載入動畫,如何新增?
元素新增初始引數
以上圖中的動畫為例,新增倆個左右容器,將內容放置在容器內部。
新增初始資料,預設透明度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 滾動、載入/出現動畫