【動畫進階】有意思的網格下落漸次載入效果

来源:https://www.cnblogs.com/coco1s/archive/2023/07/18/17562087.html
-Advertisement-
Play Games

最近,群友貼了一個非常有意思的動畫效果,整體動畫效果如下: ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9767a38b3ec04e3fb3082daed7ac75a0~tplv-k3u1fbpfcp-watermark.image?) ...


最近,群友貼了一個非常有意思的動畫效果,整體動畫效果如下:

點擊某個按鈕後,觸發一個動畫效果,原本的網格內容,將按順序(又帶點隨機的效果)從高處下落進行載入填充動畫。

當然,我個人認為這個動畫有點華而不實,主要體現在這個動畫一次需要耗費較長時間,有點消磨人的耐心。不過確實一個很好的 CSS 動畫教學案例。

而本文,就將具體去剖析這個動畫,如果使用純 CSS,應該如何實現。

還原佈局結構

首先,我們需要大致還原佈局結構,這個並非整個動畫的核心。

整個動畫的核心在於元素按順序(又帶點隨機的效果)從高處下落漸次進行下落載入填充動畫

當然,還原這個佈局也非常簡單,這裡我們藉助 flex 佈局快速實現,幾個關鍵點:

  1. 每個 flex-item 寬度不固定:這一點可以使用 SASS 函數進行模擬,隨機生成不同寬度的 flex-item
  2. 每個 flex-item 背景色隨機:這一點同樣也可以藉助 SASS 函數 實現
  3. 整體水平居中:這個也簡單,父容器添加 justify-content: center; 即可

這樣,整個佈局的大致代碼如下:

<ul>
  <li></li>
  <li></li>
   // ... 假設一共 50 個 li
  <li></li>
</ul>
$count: 51;
@function randomNum($max, $min: 0, $u: 1) {
    @return ($min + random($max)) * $u;
}
@function randomColor() {
    @return rgb(randomNum(255), randomNum(255), randomNum(255));
}

ul {
    display: flex;
    gap: 4px;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: center;
    width: 640px;
    height: 420px;
}
li {
    flex-shrink: 0;
    height: 30px;
    border-radius: 30px;
}

@for $i from 1 to $count {
    li:nth-child(#{$i}) {
        width: #{randomNum(110, 90)}px;
        background: randomColor();
    }
}

簡單解釋一下:

  1. 利用了 SASS 的迴圈函數簡化代碼量
  2. 實現了兩個 SASS 函數,利用這兩個函數隨機生成不同寬度不同顏色的 li
  • randomNum(): 用於生成範圍內的隨機數
  • randomColor(): 用於生成隨機顏色值

這樣,我們就可以快速得到這樣一個佈局效果:

下落動畫

接下來,我們來實現元素的下落動畫。

首先,我們撇開多元素的按順序又帶點隨機的延遲下落,值聚焦於單個 item 的下落動畫,它其實是這麼個動畫效果:

整個動畫的核心步驟大致是:

  1. 預設是狀態下,元素是在最終的 flex 佈局狀態下,且是可見狀態
  2. 動畫開始時,元素將消失,然後從上方,在一個縮小狀態下,有一個小幅度向上運動
  3. 接著元素向下運動到目標位置(終止狀態)
  4. 元素從縮小狀態,放大為正常狀態
  5. 並且,動畫結束後,需要維持在最後一幀,因此需要使用(animation-fill-mode: forwards

對 CSS 動畫細節和各個屬性還不太瞭解的,建議你看看我的這本小冊 -- CSS 技術揭秘與實戰通關

完成上面的拆解後,單個動畫實現起來就非常輕鬆了:

li {
    opacity: 0;

    &hover {
            animation: falldown 1s forwards;
    }
}

@keyframes falldown {
    0% {
        transform: translateY(-180px) scaleX(.1) scaleY(.3);
        opacity: 1;
    }
    20% {
        transform: translateY(-200px) scaleX(.6) scaleY(.3);
    }
    75% {
        transform: translateY(0) scaleX(.6) scaleY(.3);
    }
    100% {
        transform: translateY(0)  scaleX(1) scaleY(1);
        opacity: 1;
    }
}

這樣,我們就輕鬆的實現了單個的動畫效果:

如果 50 個 item 同時作用這個動畫,就是這樣的效果:

實現延遲隨機下落

當然,到這裡,整個動畫都還是平平無奇的

我們需要最後的點睛之筆,實現按順序又帶點隨機的延遲下落效果,以及讓整體的動畫更加自然。

這裡的核心就在於:

  1. 利用 animation-delay 製造延遲效果,但是不能是順序延遲,需要帶點隨機效果
  2. 利用 animation-timing-function 緩動函數,控制動畫的速度曲線,使動畫變化更為平滑
  3. 控制縮短每一個 item 的動畫時長

方法明確了,剩下的就是調試動畫效果了,最終,經過一番調試,完整的動畫效果的代碼就完成啦。

代碼量真的不多:

$count: 51;
@function randomNum($max, $min: 0, $u: 1) {
    @return ($min + random($max)) * $u;
}
@function randomColor() {
    @return rgb(randomNum(255), randomNum(255), randomNum(255));
}

ul {
    display: flex;
    gap: 4px;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: center;
    width: 660px;
    height: 420px;
}
li {
    flex-shrink: 0;
    height: 30px;
    border-radius: 30px;
}

@for $i from 1 to $count {
    li:nth-child(#{$i}) {
        width: #{randomNum(110, 90)}px;
        background: randomColor();
    }
}

ul:hover {
    li {
        opacity: 0;
    }
    @for $i from 1 to $count {
        li:nth-child(#{$i}) {
            animation: falldown .3s cubic-bezier(.44,.02,.65,1.3) #{50 * ($count - $i) + (random(150) - random(300))}ms forwards;
        }
    }
}
@keyframes falldown {
    0% {
        transform: translateY(-180px) scaleX(.1) scaleY(.3);
        opacity: 1;
    }
    20% {
        transform: translateY(-200px) scaleX(.6) scaleY(.3);
    }
    75% {
        transform: translateY(0) scaleX(.6) scaleY(.3);
    }
    100% {
        transform: translateY(0)  scaleX(1) scaleY(1);
        opacity: 1;
    }
}

核心,就在於這一句,animation: falldown .3s cubic-bezier(.44,.02,.65,1.3) #{50 * ($count - $i) + (random(150) - random(300))}ms forwards,需要好好的消化理解。

這樣,我們就基本完美的復刻了原效果:

Gif 錄製存在掉幀行為,原效果會比 GIF 錄製出來的更好。完整的代碼你可以戳這裡:

CodePen Demo -- Flex Item Fall Down

總結一下

好了,本文到此結束,希望對你有幫助

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

-Advertisement-
Play Games
更多相關文章
  • # 引言 ## 操作系統的目標 + abstract H/W `抽象化硬體` + multiplex `多路復用` + isolation `隔離性` + sharing `共用(進程通信,數據共用)` + security / access control `安全性/許可權控制` + perform ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230717130541155-2006675036.png) # 1. 對於複雜的數值計算而言,SQL 並非首選工具 # 2. 求和 ## 2.1. SUM函數會忽略Null ...
  • 一、介紹 DCL:Data Control Language(數據控制語言),用來管理資料庫用戶,控制資料庫的訪問,許可權。 二、用戶管理 1、查詢用戶 語法: 1、use mysql; 2、select * from user; 預設只有四個賬戶。 2、創建用戶 語法:create user '用戶 ...
  • MySQL8 概述、下載、安裝、使用(Windows2019和centos7.9) 1、MySQL概述 1.1 資料庫相關概念在這一部分,先瞭解三個概念:資料庫、資料庫管理系統、SQL。 名稱 全稱 簡稱 資料庫 存儲數據的倉庫,數據是有組織的進行存儲 DataBase(DB) 資料庫管理系統 操縱 ...
  • 一.介紹 1.什麼是ndk技術? 在學習ndk技術前,我們需要先瞭解一下JNI(Java Native Interface)技術,JNI技術是一種實現Java代碼和C/C++代碼之間交互的技術,它提供了一組編程介面,使得Java程式可以調用C/C++代碼並與其進行通信。通過JNI技術,開發者可以將C ...
  • # Vue引用js文件的多種方式 **1.vue-cli webpack全局引入jquery** (1)首先 npm install jquery --save (--save 的意思是將模塊安裝到項目目錄下,併在package文件的dependencies節點寫入依賴。) (2)在webpack. ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 🤭當我是if-else俠的時候 😶怕出錯 給我一個功能,我總是要寫很多if-else,雖然能跑,但是維護起來確實很難受,每次都要在一個方法裡面增加邏輯,生怕搞錯,要是涉及到支付功能,分分鐘炸鍋 😑難調試 我總是不知道之前寫的邏輯在哪 ...
  • 背景 後臺系統某功能按鈕需要訂單狀態和用戶許可權共同校驗是否顯示,將許可權校驗和v-if共同作用在同一div中,下方為實例代碼 <div v-if="status==0"> <div @click="function1"> 某按鈕功能 </div> </div> <div v-if="status==1 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...