記錄--滾動視差動畫和解決方法

来源:https://www.cnblogs.com/smileZAZ/archive/2023/02/17/17130927.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最簡單的代碼,最極致的享受,主打的就是一個炫酷~ 滾動視差 滾動視差效果(Parallax Scrolling)是指讓多層背景以不同的速度位移,形成立體的運動效果的視覺體驗,在前端強交互的時代,更應該多考慮這種用戶體驗較好的動效~ 實現方 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

最簡單的代碼,最極致的享受,主打的就是一個炫酷~

滾動視差

滾動視差效果(Parallax Scrolling)是指讓多層背景以不同的速度位移,形成立體的運動效果的視覺體驗,在前端強交互的時代,更應該多考慮這種用戶體驗較好的動效~

實現方案

  1. JS監聽瀏覽器 scroll 事件,不斷改變元素位置
  2. background-attachment屬性,將圖片位置相對於視口固定
  3. translateZ()修改元素的縮小比例,使得滾動速度出現差異

JS實現

// html
<div class="parallax">
  <img src="./images/bc1.png" id="bc1" />
  <img src="./images/bc2.png" id="bc2" />
  <img src="./images/bc3.png" id="bc3" />
  <img src="./images/bc4.png" id="bc4" />
  <img src="./images/bc5.png" id="bc5" />
  <img src="./images/tree.png" id="tree" />
  <h2 id="text">Rolling Parallax</h2>
  <img src="./images/leaf.png" id="leaf" />
  <img src="./images/plant.png" id="plant" />
</div>

<div class="contentBox">
  <h2>Parallax Scrolling</h2>
  <text class="content">
    content...
  </text>
</div>

//css
@import url("https://fonts.googleapis.com/css?family=Luckiest+Guy");

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: "Luckiest Guy", cursive;
}
body {
  background: #f9f9f9;
  min-height: 100vh;
  overflow-x: hidden;
}
.parallax {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}
.parallax img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  pointer-events: none;
}
#text {
  position: absolute;
  font-size: 5em;
  color: #fff;
  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2);
  letter-spacing: 10px;
}
.contentBox {
  position: relative;
  background: #003329;
  padding: 100px;
}
.contentBox h2 {
  font-size: 36px;
  color: #fff;
  margin-bottom: 10px;
  letter-spacing: 2px;
}
.contentBox .content {
  font-size: 20px;
  color: #fff;
  font-weight: 300;
  line-height: 28px;
  letter-spacing: 2px;
}
//js
let text = document.getElementById("text");
let leaf = document.getElementById("leaf");
let bc1 = document.getElementById("bc1");
let bc4 = document.getElementById("bc4");
let bc5 = document.getElementById("bc5");

window.addEventListener("scroll", () => {
  const value = window.scrollY;
  text.style.marginTop = value * 1.5 + "px";
  leaf.style.top = value * -1.5 + "px";
  leaf.style.left = value * 1.5 + "px";
  bc1.style.top = value * 0.5 + "px";
  bc4.style.left = value * -1.5 + "px";
  bc5.style.left = value * 1.5 + "px";
});

預覽效果如下

1.gif

CSS-background-attachment

前置知識

首先 background-attachment 要和 background-image 一起使用才有意義,表示的是背景圖像是否固定或者隨著頁面的其餘部分滾動。
background-attachment 有四個可選值:fixed,scroll,local,inherit
scroll 是該屬性的預設值,表示背景圖相對於元素固定,簡單理解就是兩者綁定住了,所以元素滾動了圖片也會跟著滾動。
local 表示背景圖相對於元素內容固定,而相對於其他滾動條則會滾動。舉例來說,假如元素內部設置了overflow:scroll,則元素內部會出現滾動條,此時滾動元素內部滾動條的時候,背景圖會隨著滾動而滾動。而如果我們設置 background-attachment:scroll ,則背景圖會隨著元素內部滾動而固定住。
fixed 表示背景圖相對於視口固定,無論怎麼滾動,元素都巋然不動,如果多個元素都設置了fixed,他們也只會在自己的元素內顯示,互不影響。
inherit 只是指定 background-attachment 的設置從父元素繼承。

scroll與local的區別

scroll效果如下 2023-02-15 17.43.56.gif local效果如下 2023-02-15 17.48.44.gif

//html
<div class="image_1">
  <div class="word">Bye bye, Lucia</div>
</div>
<div class="bg">The best hard are always the bravest</div>
<div class="image_2">
  <div class="word">All children, except one, grow up</div>
</div>
<div class="bg">It's better to burn out than to fade away</div>
<div class="image_3">
  <div class="word">Fading is true while flowering is past</div>
</div>
<div class="bg">There was no possibility of taking a walk</div>
<div class="image_4">
  <div class="word">All this happened, more or less</div>
</div>

//css
* {
  padding: 0;
  margin: 0;
}
.image_1 {
  background-image: url(./images/1.webp);
  background-position: 0 0;
  background-attachment: fixed;
  background-size: cover;
  height: 680px;
  width: 100%;
}
.image_2 {
  background-image: url(./images/2.jpg);
  background-position: 0 0;
  background-attachment: fixed;
  background-size: cover;
  height: 680px;
  width: 100%;
}
.image_3 {
  background-image: url(./images/3.jpg);
  background-position: 0 0;
  background-attachment: fixed;
  background-size: cover;
  height: 680px;
  width: 100%;
}
.image_4 {
  background-image: url(./images/4.jpeg);
  background-position: 0 0;
  background-attachment: fixed;
  background-size: cover;
  height: 680px;
  width: 100%;
}
.word {
  position: relative;
  top: 480px;
  font-size: 55px;
  color: white;
  text-align: center;
  font-weight: bolder;
}
.bg {
  text-align: center;
  font-size: 46px;
  font-weight: bolder;
  height: 220px;
  line-height: 220px;
  background-color: rgb(131, 134, 204);
  color: white;
}

預覽效果如下

2.gif

CSS-translateZ

前置知識

transform-style: preserve-3d表示讓子元素保留3D轉換。

1.jpg

好吧,直接上代碼~

//html
<div class="wrapper">
  <div class="demo"></div>
</div>

//css
body {
  perspective: 800px;
  perspective-origin: 250px 300px;
}
.wrapper {
  position: relative;
  left: 200px;
  top: 100px;
  height: 480px;
  width: 60%;
  background-color: #0ff;
  transform: rotateY(45deg);
  /* transform-style: preserve-3d; */
}
.demo {
  height: 100%;
  background-image: url(./images/3.jpg);
  background-size: cover;
  transform: translateZ(100px);
}

 

不加preserve-3d效果

1.jpg

加上preserve-3d效果

1.jpg

看出差異了吧,有層次了,立體感高高的~
需要註意的是 transform-style: preserve-3d 這個屬性加在誰身上,誰的子元素才會有3D效果,比如上面的代碼中把屬性加在 body 上是沒有效果的。

perspective 定義3D元素距視圖的距離。

簡單來理解,如果我設置了 perspective:500px,則表示我在離屏幕500px遠的地方觀看這個元素。註意一下官方講解的 當為元素定義 perspective 屬性時,其子元素會獲得透視效果,所以我們需要將這個屬性設置在父元素上。

加上perspective效果

3.gif

不加perspective效果

4.gif

視距 = 距離產生美~

translateZ: 向Z軸平移。

我們現在和屏幕的距離就是Z軸,所以Z軸是朝向我們的,如果translateZ裡面的值越大,說明屏幕離我們越近,translateZ裡面的值越小,屏幕離我們就越遠。

perspective和translateZ的化學反應

這兩者有什麼區別呢,簡單的說就是translateZ是移動圖片,perspective是移動人和屏幕的距離。但是當這兩者結合起來的時候神奇的事情就會發生~

//html
<div class="wrapper">
  <div class="demo"></div>
</div>

//css
.wrapper {
  position: relative;
  left: 200px;
  top: 100px;
  height: 480px;
  width: 60%;
  perspective: 800px;
}
.demo {
  height: 100%;
  background-image: url(./images/3.jpg);
  background-size: cover;
  transform: translateZ(-100px);
}

perspective: 800px的情況

1.jpg

perspective: 100px的情況

1.jpg

我們把視距調小,圖片竟然變小了,按照道理視距越小說明屏幕離我越近,圖片應該變大才對。其實,這裡我們看到的圖片,並不是圖片本體,而是圖片在屏幕上的投影。

1.jpg

同理,我們去理解translateZ的值變大,圖片變大也比較容易了。

translateZ(-100px)的情況

1.jpg

translateZ(-20px)的情況

1.jpg

1.jpg

那麼只要我們將不同的元素的translateZ設置成不同的負值,那麼越大值的元素,它的投影就會越大,滾動速度就會越快,當然這些元素的滾動速度也只有translateZ(0)的幾分之一~

//html
<div class="g-container">
  <div class="section-one">translateZ(-1)</div>
  <div class="section-two">translateZ(-2)</div>
  <div class="section-three">translateZ(-3)</div>
</div>

//css
html {
  height: 100%;
  overflow: hidden;
}
body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow-y: scroll;
  overflow-x: hidden;
  perspective: 2px;
}
.g-container {
  position: relative;
  transform-style: preserve-3d;
  transform-origin: center center;
  height: 150%;
}
.g-container div {
  font-size: 5vw;
  position: absolute;
  top: 20%;
}
.section-one {
  left: 0%;
  background: rgba(10, 10, 10, 0.2);
  transform: translateZ(-1px);
}
.section-two {
  left: 40%;
  background: rgba(30, 130, 30, 0.2);
  transform: translateZ(-2px);
}
.section-three {
  left: 90%;
  background: rgba(200, 100, 130, 0.2);
  transform: translateZ(-3px);
}

預覽效果如下

6.gif

本文轉載於:

https://juejin.cn/post/7200653122637103164

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • docker 最近迷戀使用doker容器,在docker容器進行部署MySQL,以前針對容器的安全性一直存在懷疑的態度,不過如果能夠通過容器也能資料庫備份問題,就這樣開始docker容器備份 備份和恢復: 第一種方式 #全部備份 [root@localhost home]# docker exec ...
  • 【講故事】 近端時間一直在做一些資料庫查詢的工作,主要是根據表中的“日期”與“產品名”兩個欄位為條件在對錶進行相關查詢。 但當表數據量達到3000萬以上時,發現查詢速度呈幾何級下降,變得超慢不說,而且每查詢一次,伺服器記憶體的使用量就一點點上升直至占用100%,我就不得不重啟伺服器... :( 這時, ...
  • 新的一年我們加緊了更新迭代的速度,增加了數據湖平臺EasyLake和大數據基礎平臺EasyMR,超40項功能升級優化。我們將繼續保持產品升級節奏,滿足不同行業用戶的更多需求,為用戶帶來極致的產品使用體驗。 以下為袋鼠雲產品功能更新報告第四期內容,更多探索,請繼續閱讀。 數據湖平臺 1.【元數據管理】 ...
  • 1.首先我們需要兩台伺服器,安裝好mysql(版本為8) 2.修改主伺服器mysql資料庫配置文件 vim /etc/my.cnf [mysql] log-bin=mysql-bin //啟動二進位日誌 server-id=100 //伺服器唯一ID 退出保存以後重啟mysql服務:systemct ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:飛魚過天 文章來源:GreatSQL社區原創 問題 原因 故障解決方案 復現步驟 參考文獻 一、問題: MySQL5.7.38主從架構,主節點唯一 ...
  • ETL 系統核心特征 數據重跑及其優化 重跑的場景 | 場景 | 導致原因 | 影響 | | | | | | kafka consumer poll消息失敗 | 1. 網路問題;2. kafka broker 磁碟壞道,拉取消息一直失敗或其他 kafka 原因 | 導致一個或多個topic&part ...
  • 需求:安卓和IOS開發的混合app。前端使用vue,vant2,安卓使用java,ios使用的object-c。實現效果:點擊按鈕,下載PDF附件,app跳轉到手機外部瀏覽器,下載附件...... 1,安卓端代碼: public static void openPDFInBrowser(Contex ...
  • 一、日期和時間的格式化 1、原生方法 1.1、使用 toLocaleString 方法 Date 對象有一個 toLocaleString 方法,該方法可以根據本地時間和地區設置格式化日期時間。例如: const date = new Date(); console.log(date.toLocal ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...