日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript 實現頁面滾動動畫

瀏覽:47日期:2023-10-02 16:39:08

在做前端 UI 效果時,讓元素根據滾動位置實現動畫效果是一個非常流行的設計,通常我們會使用第三方插件或庫來實現。在本教程中,我將教大家使用純 JavaScript 和 CSS 來實現。

先預覽一下實現的效果:

JavaScript 實現頁面滾動動畫

我們使用 CSS 來實現動畫,用 JavaScript 來處理觸發所需的樣式。我們先來創建布局。

創建布局

我們先使用 HTML 創建頁面布局,然后為需要實現動畫的元素分配一個通用類名,后面的 JavaScript 通過此類名定位這些元素。這里我們給需要根據滾動實現動畫的元素指定為類名 js-scroll,HTML 代碼如下:

<section class='scroll-container'> <div class='scroll-element js-scroll'></div> <div class='scroll-caption'>This animation fades in from the top.</div></section>添加 CSS 樣式

先來一個簡單的淡入動畫效果:

.js-scroll { opacity: 0; transition: opacity 500ms;}.js-scroll.scrolled { opacity: 1;}

頁面上的所有 js-scroll 元素都會被隱藏,不透明度為 0。當滾動到該元素區域時,給它加上 .scrolled 類名讓它顯現出來。

用 JavaScript 操作元素

有了布局和樣式,現在我們需要編寫一個 JavaScript 函數,當元素滾動到視圖中時,為它們分配類名。

我們來簡單分解一下邏輯:

獲取頁面上所有 js-scroll 元素 使這些元素默認淡出不可見 檢測元素是否在視窗內 如果元素在視窗內則分配 scrolled 類名 獲取目標元素

獲取頁面上所有 js-scroll 元素,使用 document.querySelectorAll() 即可:

const scrollElements = document.querySelectorAll(’.js-scroll’)默認淡出所有目標元素

遍歷這些元素,使其全部淡出不可見:

scrollElements.forEach((el) => { el.style.opacity = 0})檢測元素是否在視窗內

我們可以通過判斷元素距離頁面頂部的間距是否小于頁面可見部分的高度,來檢測元素是否在用戶視窗中。

在 JavaScript 中,我們使用 getBoundingClientRect().top 方法來獲取元素與頁面頂部的距離,使用 window.innerHeight 或 document.documentElement.clientHeight 來獲取視窗的高度。

JavaScript 實現頁面滾動動畫

我們將使用上述邏輯創建一個 elementInView 函數:

const elementInView = (el) => { const elementTop = el.getBoundingClientRect().top return ( elementTop <= (window.innerHeight || document.documentElement.clientHeight) )}

我們可以修改這個函數來檢測元素是否向頁面滾動了 x 個像素,或者檢測頁面滾動的百分比。

const elementInView = (el, scrollOffset = 0) => { const elementTop = el.getBoundingClientRect().top return ( elementTop <= (window.innerHeight || document.documentElement.clientHeight) - scrollOffset )}

在這種情況下,如果元素已經按 scrollOffset 的數量滾動到頁面中,該函數返回 true。我們再稍作修改,把參數 scrollOffset 變成百分比:

const elementInView = (el, percentageScroll = 100) => { const elementTop = el.getBoundingClientRect().top return ( elementTop <= (window.innerHeight || document.documentElement.clientHeight) * (percentageScroll / 100) )}

這部分可以根據自己的特定需求來定義邏輯。

注意:可以使用 Intersection Observer API[2] 來實現同樣的效果,但它不支持 IE。

給元素添加類名

現在我們已經能夠檢測到元素是否已經滾動到頁面中,我們需要定義一個函數來處理該元素的顯示--本例中我們通過分配 scrolled 類名來顯示該元素。

const displayScrollElement = (element) => { element.classList.add(’scrolled’)}

然后,再把我們前面的邏輯與 displayScrollElement 函數結合起來,并使用 forEach 方法在所有 js-scroll 元素上調用該函數。

const handleScrollAnimation = () => { scrollElements.forEach((el) => { if (elementInView(el, 100)) { displayScrollElement(el) } })}

另外,當元素不再在視圖中時,需要將其重置為默認狀態,我們可以通過定義一個 hideScrollElement 來實現:

const hideScrollElement = (element) => { element.classList.remove('scrolled');};const handleScrollAnimation = () => { scrollElements.forEach((el) => { if (elementInView(el, 100)) { displayScrollElement(el); } else { hideScrollElement(el); } }

最后,我們將把上面的方法傳遞到窗口的滾動事件監聽中,這樣每當用戶滾動時它就會運行。

window.addEventListener(’scroll’, () => { handleScrollAnimation()})

我們已經實現了滾動動畫的所有功能。

完善示例

請大家回到文章開頭看看效果圖??吹?,這些元素以不同的動畫出現。這是通過給類名分配不同的 CSS 動畫來實現的。這個示例的 HTML 是這樣的:

<section class='scroll-container'> <div class='scroll-element js-scroll fade-in'></div> <div class='scroll-caption'>淡入動效</div></section><section class='scroll-container'> <div class='scroll-element js-scroll fade-in-bottom'></div> <div class='scroll-caption'>切入頂部動效</div></section><section class='scroll-container'> <div class='scroll-element js-scroll slide-left'></div> <div class='scroll-caption'>從左邊切入動效</div></section><section class='scroll-container'> <div class='scroll-element js-scroll slide-right'></div> <div class='scroll-caption'>從右邊切入動效</div></section>

這里我們給不同動效的元素分配了不同的 CSS 類名,下面是這些類對應的 CSS 代碼:

.scrolled.fade-in { animation: fade-in 1s ease-in-out both;}.scrolled.fade-in-bottom { animation: fade-in-bottom 1s ease-in-out both;}.scrolled.slide-left { animation: slide-in-left 1s ease-in-out both;}.scrolled.slide-right { animation: slide-in-right 1s ease-in-out both;}@keyframes slide-in-left { 0% { transform: translateX(-100px); opacity: 0; } 100% { transform: translateX(0); opacity: 1; }}@keyframes slide-in-right { 0% { transform: translateX(100px); opacity: 0; } 100% { transform: translateX(0); opacity: 1; }}@keyframes fade-in-bottom { 0% { transform: translateY(50px); opacity: 0; } 100% { transform: translateY(0); opacity: 1; }}@keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; }}

雖然加了不同動畫元素,但我們不需要修改 JavaScript 代碼,因為邏輯保持不變。這意味著我們可以在頁面添加任何數量的不同動畫,而無需編寫新的函數。

利用節流閥提高性能

每當我們在滾動監聽器中綁定一個函數時,每次用戶滾動頁面,該函數都會被調用。滾動一個 500px 的頁面會導致一個函數被調用至少 50 次。如果我們試圖在頁面上包含很多元素,這會導致我們的頁面速度明顯變慢。

我們可以通過使用“節流函數(Throttle Function)”來減少函數的調用次數。節流函數是一個高階函數,它在指定的時間間隔內只調用傳入的函數一次。

它對于滾動事件特別有用,因為我們不需要檢測用戶滾動的每個像素。例如,如果我們有一個定時器為 100ms 的節流函數,那么用戶每滾動 100ms,該函數將只被調用一次。

節流函數在 JavaScript 中可以這樣實現:

let throttleTimer = falseconst throttle = (callback, time) => { if (throttleTimer) return // 這里標記一下,以使函數不會重復執行 throttleTimer = true setTimeout(() => { // 到了指定的時間,調用傳入的回調函數 callback() throttleTimer = false }, time)}

然后我們可以修改 window 對象上的 scroll 事件監聽:

window.addEventListener(’scroll’, () => { throttle(handleScrollAnimation, 250)})

現在我們的 handleScrollAnimation 函數在用戶滾動時每隔 250ms 就會被調用一次:

JavaScript 實現頁面滾動動畫

以上就是JavaScript 實現頁面滾動動畫的詳細內容,更多關于JavaScript 頁面滾動的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美特黄a级高清免费大片a级| 国产麻豆精品| 久久丁香四色| 国产精品美女午夜爽爽| 国产精品红桃| 国产aⅴ精品一区二区三区久久| 精品高清久久| 欧美丰满日韩| 欧美午夜精彩| av亚洲在线观看| 激情综合在线| 久热综合在线亚洲精品| 国产精品日本| 91精品日本| 98精品久久久久久久| 国产综合色产| 香蕉久久久久久| 国产日韩三级| 五月激情久久| 99riav1国产精品视频| 亚洲一区欧美| 麻豆精品蜜桃视频网站| 欧洲av不卡| 亚洲中午字幕| 麻豆极品一区二区三区| 国产精品久久观看| 婷婷综合在线| 久久精品资源| av不卡在线| 国产黄大片在线观看| 天堂网av成人| 国产亚洲高清在线观看| 欧美va亚洲va日韩∨a综合色| 亚洲精品麻豆| 精品三级久久| 欧美激情aⅴ一区二区三区 | 日韩av电影一区| 日韩国产激情| 欧美另类中文字幕| 性欧美videohd高精| 欧美一区不卡| 国产精品视频3p| 亚洲主播在线| 国产精一区二区| 日韩一区精品视频| 久久视频国产| 91亚洲国产成人久久精品| 视频一区欧美精品| 激情欧美国产欧美| 日韩不卡在线| 国产美女高潮在线观看| 日韩黄色在线观看| 伊人国产精品| 蜜桃av一区二区三区电影| av免费不卡国产观看| 久久国产欧美日韩精品| 日韩中出av| 日韩中文字幕| 青青草国产成人99久久| 日韩三区四区| 国产精品香蕉| 久久字幕精品一区| 精品久久久久久久| 国内精品美女在线观看| 久久精品国产99| 久久av影院| 加勒比视频一区| 日韩免费一区| 亚洲精品99| 久久国产小视频| 日韩视频中文| 日本高清久久| 免费一级欧美片在线观看网站 | 青青久久av| 黄色av日韩| 日韩高清在线不卡| 国产精品亚洲二区| 日本午夜大片a在线观看| 久久三级视频| 亚洲在线久久| 国内自拍视频一区二区三区| 日韩中文在线播放| 伊人久久婷婷| 国产图片一区| 欧美日韩色图| 欧美亚洲三级| 久久精品主播| 欧美日韩亚洲三区| 成人精品亚洲| 日韩三级久久| 日韩在线免费| 欧美亚洲tv| 狠狠爱www人成狠狠爱综合网| 日韩av电影一区| 欧美日韩水蜜桃| 国产精品mm| 色综合视频一区二区三区日韩 | 电影天堂国产精品| 日韩在线观看一区二区| 国产精品66| 999在线观看精品免费不卡网站| 欧美日韩伊人| 99在线观看免费视频精品观看| 国产精品久久久久久久久免费高清 | 黄色免费成人| 日韩欧美在线精品| 欧美sm一区| 国产精品免费不| 国产精品日本| 中文另类视频| 国产成人调教视频在线观看| 亚洲精品国模| 午夜久久福利| 欧美日韩亚洲在线观看| 久久精品欧洲| 欧美另类中文字幕 | 国产九九精品| 石原莉奈一区二区三区在线观看| 精品资源在线| 国产一级成人av| 亚洲精品系列| 综合在线一区| 亚洲午夜免费| 亚洲bt欧美bt精品777| 午夜国产精品视频| 国产精品婷婷| 综合国产视频| 日韩精品福利一区二区三区| 亚洲影视一区| 先锋亚洲精品| 日本成人在线一区| 国产精品任我爽爆在线播放 | 国产v综合v| 亚洲不卡系列| 欧美另类综合| 亚洲精品一级二级三级| 日韩精品久久理论片| 国产日韩欧美高清免费| 国产精品xvideos88| 国产粉嫩在线观看| 免费视频亚洲| 亚洲综合专区| 亚洲日本免费电影| 国产福利一区二区三区在线播放| 欧美激情综合| 亚洲成人av观看| av成人国产| 老牛国内精品亚洲成av人片| 亚洲精品福利电影| 中文欧美日韩| 精品国产亚洲一区二区三区| 999久久久91| 91欧美极品| 久久婷婷亚洲| 亚洲精品自拍| 日韩欧美一区二区三区在线观看 | 亚洲精品动态| 国产福利片在线观看| 欧美在线综合| 精品一区二区三区的国产在线观看| 久久久久久黄| 欧美亚洲网站| 午夜精品免费| 久久精品日韩欧美| 天使萌一区二区三区免费观看| 91成人在线| 国产一级一区二区| 红杏一区二区三区| 日本在线不卡视频| 日韩欧美一区二区三区在线视频 | 黄色亚洲免费| 国产成年精品| 日本在线一区二区三区| 欧美中文字幕一区二区| 久久亚洲人体| 日本亚州欧洲精品不卡| 欧美日韩一二三四| 精品国产乱码久久久久久樱花| 蜜芽一区二区三区| 精品99在线| 国产精品久久久久9999高清| 日本欧美在线看| 国产综合激情| 一级成人国产| 免费观看在线综合| 美女网站一区| 欧美aa一级| 老牛影视精品| 国产第一亚洲| 中文av在线全新| 国产 日韩 欧美 综合 一区| 欧美国产专区| 精品国产99| 久久久久国产一区二区| 麻豆精品蜜桃视频网站| 欧美激情精品| av在线最新| 成人免费网站www网站高清| 色88888久久久久久影院| 电影亚洲精品噜噜在线观看 |