成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript 實(shí)現(xiàn)頁面滾動(dòng)動(dòng)畫

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

在做前端 UI 效果時(shí),讓元素根據(jù)滾動(dòng)位置實(shí)現(xiàn)動(dòng)畫效果是一個(gè)非常流行的設(shè)計(jì),通常我們會(huì)使用第三方插件或庫來實(shí)現(xiàn)。在本教程中,我將教大家使用純 JavaScript 和 CSS 來實(shí)現(xiàn)。

先預(yù)覽一下實(shí)現(xiàn)的效果:

JavaScript 實(shí)現(xiàn)頁面滾動(dòng)動(dòng)畫

我們使用 CSS 來實(shí)現(xiàn)動(dòng)畫,用 JavaScript 來處理觸發(fā)所需的樣式。我們先來創(chuàng)建布局。

創(chuàng)建布局

我們先使用 HTML 創(chuàng)建頁面布局,然后為需要實(shí)現(xiàn)動(dòng)畫的元素分配一個(gè)通用類名,后面的 JavaScript 通過此類名定位這些元素。這里我們給需要根據(jù)滾動(dòng)實(shí)現(xiàn)動(dòng)畫的元素指定為類名 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 樣式

先來一個(gè)簡單的淡入動(dòng)畫效果:

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

頁面上的所有 js-scroll 元素都會(huì)被隱藏,不透明度為 0。當(dāng)滾動(dòng)到該元素區(qū)域時(shí),給它加上 .scrolled 類名讓它顯現(xiàn)出來。

用 JavaScript 操作元素

有了布局和樣式,現(xiàn)在我們需要編寫一個(gè) JavaScript 函數(shù),當(dāng)元素滾動(dòng)到視圖中時(shí),為它們分配類名。

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

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

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

const scrollElements = document.querySelectorAll(’.js-scroll’)默認(rèn)淡出所有目標(biāo)元素

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

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

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

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

JavaScript 實(shí)現(xiàn)頁面滾動(dòng)動(dòng)畫

我們將使用上述邏輯創(chuàng)建一個(gè) elementInView 函數(shù):

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

我們可以修改這個(gè)函數(shù)來檢測元素是否向頁面滾動(dòng)了 x 個(gè)像素,或者檢測頁面滾動(dòng)的百分比。

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

在這種情況下,如果元素已經(jīng)按 scrollOffset 的數(shù)量滾動(dòng)到頁面中,該函數(shù)返回 true。我們?cè)偕宰餍薷模褏?shù) scrollOffset 變成百分比:

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

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

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

給元素添加類名

現(xiàn)在我們已經(jīng)能夠檢測到元素是否已經(jīng)滾動(dòng)到頁面中,我們需要定義一個(gè)函數(shù)來處理該元素的顯示--本例中我們通過分配 scrolled 類名來顯示該元素。

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

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

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

另外,當(dāng)元素不再在視圖中時(shí),需要將其重置為默認(rèn)狀態(tài),我們可以通過定義一個(gè) hideScrollElement 來實(shí)現(xiàn):

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

最后,我們將把上面的方法傳遞到窗口的滾動(dòng)事件監(jiān)聽中,這樣每當(dāng)用戶滾動(dòng)時(shí)它就會(huì)運(yùn)行。

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

我們已經(jīng)實(shí)現(xiàn)了滾動(dòng)動(dòng)畫的所有功能。

完善示例

請(qǐng)大家回到文章開頭看看效果圖。看到,這些元素以不同的動(dòng)畫出現(xiàn)。這是通過給類名分配不同的 CSS 動(dòng)畫來實(shí)現(xiàn)的。這個(gè)示例的 HTML 是這樣的:

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

這里我們給不同動(dòng)效的元素分配了不同的 CSS 類名,下面是這些類對(duì)應(yīng)的 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; }}

雖然加了不同動(dòng)畫元素,但我們不需要修改 JavaScript 代碼,因?yàn)檫壿嫳3植蛔儭_@意味著我們可以在頁面添加任何數(shù)量的不同動(dòng)畫,而無需編寫新的函數(shù)。

利用節(jié)流閥提高性能

每當(dāng)我們?cè)跐L動(dòng)監(jiān)聽器中綁定一個(gè)函數(shù)時(shí),每次用戶滾動(dòng)頁面,該函數(shù)都會(huì)被調(diào)用。滾動(dòng)一個(gè) 500px 的頁面會(huì)導(dǎo)致一個(gè)函數(shù)被調(diào)用至少 50 次。如果我們?cè)噲D在頁面上包含很多元素,這會(huì)導(dǎo)致我們的頁面速度明顯變慢。

我們可以通過使用“節(jié)流函數(shù)(Throttle Function)”來減少函數(shù)的調(diào)用次數(shù)。節(jié)流函數(shù)是一個(gè)高階函數(shù),它在指定的時(shí)間間隔內(nèi)只調(diào)用傳入的函數(shù)一次。

它對(duì)于滾動(dòng)事件特別有用,因?yàn)槲覀儾恍枰獧z測用戶滾動(dòng)的每個(gè)像素。例如,如果我們有一個(gè)定時(shí)器為 100ms 的節(jié)流函數(shù),那么用戶每滾動(dòng) 100ms,該函數(shù)將只被調(diào)用一次。

節(jié)流函數(shù)在 JavaScript 中可以這樣實(shí)現(xiàn):

let throttleTimer = falseconst throttle = (callback, time) => { if (throttleTimer) return // 這里標(biāo)記一下,以使函數(shù)不會(huì)重復(fù)執(zhí)行 throttleTimer = true setTimeout(() => { // 到了指定的時(shí)間,調(diào)用傳入的回調(diào)函數(shù) callback() throttleTimer = false }, time)}

然后我們可以修改 window 對(duì)象上的 scroll 事件監(jiān)聽:

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

現(xiàn)在我們的 handleScrollAnimation 函數(shù)在用戶滾動(dòng)時(shí)每隔 250ms 就會(huì)被調(diào)用一次:

JavaScript 實(shí)現(xiàn)頁面滾動(dòng)動(dòng)畫

以上就是JavaScript 實(shí)現(xiàn)頁面滾動(dòng)動(dòng)畫的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 頁面滾動(dòng)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲国内精品| 亚洲一级特黄| 久久国产88| 久久国产麻豆精品| 欧美精品乱人伦久久久久久| 丰满亚洲少妇av| 亚洲免费大片在线观看| 91成人在线精品| 99国内精品久久| 亚洲已满18点击进入久久| 欧美性猛片aaaaaaa做受| 成人av动漫网站| 亚洲一区二区三区中文字幕| 欧美精品 国产精品| 黄色精品网站| 国产一区啦啦啦在线观看| 国产精品系列在线| 91福利在线导航| 在线观看日韩av电影| 亚洲成a人片在线观看中文| 日韩欧美一级片| 亚洲中字黄色| 91免费在线播放| 日韩综合一区二区| 久久亚洲一级片| 欧美色图12p| 99热这里只有精品8| 成人免费视频一区| 日韩成人伦理电影在线观看| 国产夜色精品一区二区av| 在线观看免费亚洲| 日韩午夜黄色| 色综合天天综合网天天看片| 成人自拍视频在线| 欧美日韩aaaaaa| 欧美丰满一区二区免费视频| 老鸭窝毛片一区二区三区| 欧美三级日韩三级| 欧美一区二区性放荡片| 欧美唯美清纯偷拍| 欧美日韩精品欧美日韩精品一| 一级做a爱片久久| 99久久国产综合精品女不卡| 国产乱人伦精品一区二区 | 制服丝袜中文字幕亚洲| 欧美区日韩区| 成人av影院在线| 国产一区二区在线电影| 日本中文字幕一区二区视频| 亚洲男人电影天堂| 老司机精品福利视频| 欧美视频观看一区| 亚洲同性同志一二三专区| 久久久国际精品| 国产网站一区二区三区| 国产人成亚洲第一网站在线播放| 亚洲精品一区二区三区四区高清| 日韩美女视频在线| 日韩视频免费观看高清完整版在线观看 | 欧美日韩和欧美的一区二区| 欧美三级电影精品| 欧美福利视频导航| 欧美成人福利视频| 精品1区2区在线观看| 久久亚洲精精品中文字幕早川悠里| 精品久久久久久久一区二区蜜臀| 精品国产亚洲在线| 欧美激情艳妇裸体舞| 综合久久久久综合| ...xxx性欧美| 婷婷夜色潮精品综合在线| 天天亚洲美女在线视频| 蜜桃视频一区二区三区在线观看| 一区二区三区四区中文字幕| 亚洲成a人v欧美综合天堂下载| 91麻豆精品国产91久久久久| 一片黄亚洲嫩模| 国产精品久久久久影院| 亚洲精品高清视频在线观看| 性高湖久久久久久久久| 久久精品二区| 欧美日韩国产高清一区二区 | 久久久久高清精品| 国产精品电影院| 亚洲精品1234| 狠狠色狠狠色综合| 亚洲黄色高清| 亚洲天天做日日做天天谢日日欢| 一本色道久久综合亚洲精品婷婷| 国产精品久久久99| 影音欧美亚洲| 欧美草草影院在线视频| 国产综合激情| 日本va欧美va精品| 欧美日韩免费电影| 国产老女人精品毛片久久| 日韩综合在线视频| 国产精品一区在线观看乱码| 91日韩一区二区三区| 黄色精品免费| 色婷婷亚洲综合| 91麻豆精品国产自产在线观看一区 | 成人av资源站| 亚洲一区观看| 欧美性猛交一区二区三区精品| 精品噜噜噜噜久久久久久久久试看| 一区二区久久久久| 婷婷久久综合九色国产成人| 国产成人一区二区精品非洲| 夜夜精品视频一区二区| 久久精品国产一区二区| 欧美淫片网站| www.亚洲人| 亚洲欧美日韩久久| aaa国产一区| 日本精品一区二区三区高清| 精品福利在线导航| 另类的小说在线视频另类成人小视频在线 | 一本色道久久综合精品竹菊 | 欧美精品二区| 欧美日韩一级大片网址| 精品裸体舞一区二区三区| 精品综合免费视频观看| 久久久久久黄| 亚洲少妇30p| 国产精品99一区二区| 欧美性大战久久| 欧美va亚洲va在线观看蝴蝶网| 国产精品女主播在线观看| 国产成人av一区二区三区在线| 羞羞答答国产精品www一本| 久久精品人人做| 极品销魂美女一区二区三区| 一本色道久久综合亚洲精品高清 | 欧美一区二区三区色| 国产激情一区二区三区四区 | 成人午夜精品在线| 精品国产乱码久久久久久浪潮 | 久久综合久久99| 亚洲激情一区二区| 男女性色大片免费观看一区二区| 欧美国产激情二区三区| 欧美午夜精品久久久久久超碰| 激情自拍一区| 色综合天天性综合| 欧美性生活影院| 精品久久久久久综合日本欧美| 欧美激情综合在线| 久久爱www久久做| 久久综合狠狠| 久久电影网站中文字幕| 成人黄色片在线观看| 欧美三区在线| 678五月天丁香亚洲综合网| 国产日本一区二区| 亚洲九九爱视频| 麻豆精品一区二区综合av| 欧美在线亚洲综合一区| 欧美一二三四区在线| 日韩一级精品视频在线观看| 国产精品麻豆欧美日韩ww| 视频一区在线播放| 成人网男人的天堂| 欧美日韩国产免费| 成人免费一区二区三区视频| 轻轻草成人在线| 欧美日本精品一区二区三区| 中文av一区二区| 懂色av一区二区三区蜜臀| 麻豆国产精品一区二区三区| 久久草av在线| 欧美巨乳波霸| 欧美精品1区2区3区| 麻豆成人久久精品二区三区小说| 国产主播一区| 精品国产一区a| 亚洲高清免费观看高清完整版在线观看| 欧美承认网站| 欧美性色综合网| 婷婷六月综合网| 最新国产乱人伦偷精品免费网站| 欧美在线一二三四区| 国产喷白浆一区二区三区| caoporn国产精品| 亚洲精品久久嫩草网站秘色| 国产精品综合一区二区三区| 欧美日韩亚洲综合一区 | 精品伊人久久久久7777人| 成人av网址在线观看| 欧美在线视频日韩| 日韩高清不卡一区| 欧美理论片在线| 国产精品大片免费观看| √…a在线天堂一区| 99在线视频精品| 久久精品视频在线免费观看| 亚洲美女啪啪| 免费成人深夜小野草| 欧美手机在线视频| 久久国产三级精品|