html如何設置滾動動畫,JavaScript 實現頁面滾動動畫

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

先預覽一下實現的效果:

172259a20341bba60da3f1638c7dafc2.gif

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

創建布局

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

This animation fades in from the top.

添加 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來獲取視窗的高度。

0576d9ae8f17d2ccfd265e965a7125f7.png

我們將使用上述邏輯創建一個 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 是這樣的:

淡入動效
切入頂部動效
從左邊切入動效
從右邊切入動效

這里我們給不同動效的元素分配了不同的 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 = false

const throttle = (callback, time) => {

if (throttleTimer) return

// 這里標記一下,以使函數不會重復執行

throttleTimer = true

setTimeout(() => {

// 到了指定的時間,調用傳入的回調函數

callback()

throttleTimer = false

}, time)

}

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

window.addEventListener('scroll', () => {

throttle(handleScrollAnimation, 250)

})

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

596e1e935fcdfbc50c419ef7706b1086.gif

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257838.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oraclenbsp;一個稍微大點數據庫

公司有個水電收費系統,在包頭試運行, 給了我一個dmp讓熟悉一下業務. dmp是壓縮過的.80多兆好像.解壓下300多兆好像.導入, 有幾個表是50萬行的,幾個30萬左右,200多個表(沒數).很多表是0行,設計居民用戶單位用戶一堆一堆的.用戶有幾萬個. 問題是這樣的: 收費系統每個月要結算一個…

絕非玩笑!人工智能或開創黑客新時代

專家稱&#xff0c;未來的網絡戰爭可能是機器對機器&#xff0c;這可能需要幾年甚至幾十年時間&#xff0c;但黑客并不一定總是人類。人工智能(AI)是可徹底改變網絡安全的技術&#xff0c;而它有一天可能成為最終的攻擊工具。 今年8月由美國國防部先進項目研究局(DARPA)贊助的C…

redis 筆記06 發布與訂閱、事務、慢查詢日志、監視器

發布與訂閱 1. 服務器狀態在pubsub_channels字典保存了所有頻道的訂閱關系&#xff1a;SUBSCRIBE命令負責將客戶端和被訂閱的頻道關聯到這個字典里面&#xff0c;而UNSUBSCRIBE命令則負責 解除客戶端和被退訂頻道之間的關聯。 2. 服務器狀態在pubsub_patterns鏈表保存了所有模式…

html中文段落,HTML 段落-JavaScript中文網-JavaScript教程資源分享門戶

HTML 可以將文檔分割為若干段落。HTML 段落段落是通過 標簽定義的。實例這是一個段落 這是另一個段落嘗試一下 注意&#xff1a;瀏覽器會自動地在段落的前后添加空行。( 是塊級元素)不要忘記結束標簽即使忘了使用結束標簽&#xff0c;大多數瀏覽器也會正確地將 HTML 顯示出來&a…

自學python系列14:映像,集合類型-集合類型

集合類型1.1如何創建集合類型和給集合賦值1.1.1 如何創建集合類型和給集合賦值集合的工廠方法set()和frozenset()>>> sset(abc)>>> sset([a, c, b])>>> tfrozenset(abc)>>> tfrozenset([a, c, b])len()計算的是集合的字母的個數1.1.2如何訪…

觀點:我們為什么需要威脅情報?

最近被談論的異常火熱的一個術語就是威脅情報&#xff0c;那么威脅情報到底是什么意思&#xff0c;它是一種什么概念或者機制呢?本文中我們就來親密接觸一下威脅情報&#xff0c;并了解它所具有的功能&#xff0c;然后給出幾個威脅情報的最佳實踐示例&#xff0c;最后分析威脅…

vijos 1942 [AH 2005] 小島

描述 西伯利亞北部的寒地&#xff0c;坐落著由 N 個小島組成的島嶼群&#xff0c;我們把這些小島依次編號為 1 到 N 。 起初&#xff0c;島嶼之間沒有任何的航線。后來隨著交通的發展&#xff0c;逐漸出現了一些連通兩座小島的航線。例如增加一條在 u 號小島與 v 號小島之間的航…

聊城大學計算機應用基礎函授,聊城大學試題計算機應用基礎試題

姓名 年級專業層次 教學單位密封線 第1頁 共3頁聊城大學《計算機應用基礎》函授試題一、判斷題(共10題&#xff0c;每題2分&#xff0c;共20分)1、信息按狀態劃分可以劃分為動態信息和靜態信息。( √ )2、操作系統不具有通用性。( )3、在Windows XP環境中&#xff0c;整個顯示…

Struts2中 Path (getContextPath與basePath)

struts2中的路徑問題是根據action的路徑而不是jsp路徑來確定&#xff0c;所以盡量不要使用相對路徑。 雖然可以用redirect方式解決&#xff0c;但redirect方式并非必要。解決辦法非常簡單&#xff0c;統一使用絕對路徑。&#xff08;在jsp中用request.getContextpath方式來拿到…

(七)SpringBoot+SpringCloud —— 集成斷路器

2019獨角獸企業重金招聘Python工程師標準>>> 斷路器簡介 在一個項目中&#xff0c;系統可能被拆分成多個服務&#xff0c;例如用戶、訂單和庫存等。 這里存在這服務調用服務的情況&#xff0c;例如&#xff0c;客戶端調用訂單服務&#xff0c;訂單服務又調用庫存服務…

Java反射機制的使用方法

Java的反射機制同意你在程序執行的過程中獲取類定義的細節。有時候在程序執行的時候才得知要調用哪個方法&#xff0c;這時候反射機制就派上用場了。獲取類 類的獲取方法有下面幾種&#xff1a;forName()。通過Class.forName()獲取與字符串向相應的類。比方\lstinline{Class.fo…

銀行計算機設備日常檢查表,[計算機]201154安全檢查表.doc

[計算機]201154安全檢查表土建基礎框架施工檢查表編號&#xff1a;2011-03-01-11工程名稱鑄造車間檢查時間2011 年 月 日檢查部位基礎施工檢 查 人檢 查結 論百分制折合分數&#xff1a;需要整改共 條。受檢單位河南周口受檢責任人檢 查 內 容檢查項目檢查內容和安全文明施工要…

我為什么要寫FansUnion個人官網-BriefCMS-電子商務malling等系統

不少朋友一直關注我最近幾個月&#xff0c;已經做的和正在做的項目&#xff0c;比如個人官網、BriefCMS、電子上午malling等系統。但是呢&#xff0c;部分朋友比較好奇&#xff0c;為啥要去寫。他們比較疑惑的是&#xff0c;市面上已經有很多類似的系統了&#xff0c;甚至有部分…

Node開發文件上傳系統及向七牛云存儲和亞馬遜AWS S3的文件上傳

背景起&#xff0c;有奏樂&#xff1a; 有偉人曰&#xff1a;學習技能的最好途徑莫過于理論與實踐相結合。 初學Node這貨時&#xff0c;每每讀教程必會Fall asleep。 當真要開發系統時&#xff0c;頓覺精神百倍&#xff0c;即便踩坑無數也不失斗志。 因為同團隊的小伙伴們都在辛…

計算機學業水平考試及格,信息技術學業水平考試表格部分試題(帶答案)

第三章表格信息的加工與表達復習學案【學習目標】1.熟練使用excel加工表格信息&#xff0c;理解用圖表來表現信息的特點與意義&#xff0c;2.能根據表格數據關系選擇合適的圖表類型表達意圖。【考點】1.表格中常用的函數及其求值方法&#xff1b;2.根據數據選擇合適的圖表類型&…

Ok6410掛載NFS

虛擬機&#xff1a; apt-get install portmap apt-get install nfs-kernel-server mkdir /nfs/root/mNFS chmod 777 /nfs chmod 777 /nfs/root vi /etc/exports 添加&#xff1a;/nfs/root *(rw,sync,no_root_squash) 開發板&#xff1a; mount -t nfs 192.168.0.12…

云計算:容器技術變革云計算,SaaS帶動CaaS市場

報告摘要&#xff1a; 1、容器技術增速驚人&#xff0c;市場認可度提高 虛擬化是云計算的重要基礎&#xff0c;Docker定義了一套容器從構建到執行的標準化體系&#xff0c;改變了傳統的虛擬化技術&#xff0c;深度影響了云計算領域。 隨著谷歌、亞馬遜、微軟等云計算廠商紛紛加…

Jan 12 - Delete Node in a Linked List; Data Structure; Linked List; Pointer;

代碼&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val x; }* }*/ public class Solution {public void deleteNode(ListNode node) {if(node null) return;while(node.next ! …

三年級神奇電子計算機教案,人教版小學三年級下冊信息技術教案

人教版小學三年級下冊信息技術教案 人教版小學信息技術教案第一課 神奇的信息世界教學目的&#xff1a;通過學習使學生更充分地了解信息技術在生活中的應用。教學內容&#xff1a;觀看“神奇的信息世界”光碟教學準備&#xff1a;1、調試每臺計算機 2、打開計算機并由教師機控制…

spark 安裝配置

最佳參考鏈接 https://opensourceteam.gitbooks.io/bigdata/content/spark/install/spark-160-bin-hadoop26an_zhuang.html Apache Spark1.1.0部署與開發環境搭建   Spark是Apache公司推出的一種基于Hadoop Distributed File System(HDFS)的并行計算架構。與MapReduce不同&am…