【動畫進階】神奇的背景,生化危機4日食 Loading 動畫還原

来源:https://www.cnblogs.com/coco1s/archive/2023/10/10/17753942.html
-Advertisement-
Play Games

最近,在 Steam 玩一款老游戲(生化危機 4 重置版),其中,每當游戲轉場的過程中,都有這麼一個有趣的 Loading 動畫: 整個效果有點類似於日食效果,中間一圈黑色,向外散髮著太陽般的光芒。 本文,我們將嘗試使用 CSS,還原這個效果。 整個效果做出來,類似於如下兩個動畫效果這樣: 實現主體 ...


最近,在 Steam 玩一款老游戲(生化危機 4 重置版),其中,每當游戲轉場的過程中,都有這麼一個有趣的 Loading 動畫:

整個效果有點類似於日食效果,中間一圈黑色,向外散髮著太陽般的光芒。

本文,我們將嘗試使用 CSS,還原這個效果。

整個效果做出來,類似於如下兩個動畫效果這樣:

實現主體效果

其實,整個效果,去掉中間黑色的遮罩,是這個樣子的:

所以,我們的目標就變成了,如何使用 CSS,實現上述這個圖形效果。

角向漸變

到這裡,思考一圈 CSS 中的各種屬性,和這個圖形能掛上鉤的,幾乎就只有角向漸變 conic-gradient 了。

我們可以利用多重角向漸變,試著畫一個類似的圖形 -- 從單個顏色到透明,再多次迴圈鋪滿 360° 的整個圖形

<div></div>
body {
    background: #000;
}
div {
    width: 200vw;
    height: 200vh;
    background: 
        repeating-conic-gradient(
            rgba(0, 136, 204, 0.77), 
            rgba(150, 157, 100, 0.72) 2%, 
            rgba(230, 247, 200, 0.82) 3%, 
            transparent 4%,
            transparent 5%
    );
}

我們隨機設置了 conic-gradient() 中的顏色 A顏色 B顏色 C到透明的變化,可以得到這麼一張圖形:

註意,對於上面的顏色沒有任何要求,隨機設置都可以。

我們可以讓這個圖形旋轉起來,簡單加上一個旋轉動畫:

div {
    animation: rotate 2s ease-in-out infinite;
}
@keyframes rotate { 
    to { 
        transform: rotate(1turn); 
    } 
}

效果如下:

我們仔細觀察一下,我們要的最終效果,其實要求邊緣是毛刺狀,而不是連續的圖像:

這一步要怎麼實現呢?其實也非常簡單,我們只需要在原圖像上,疊加一層從圖像主色到黑色的徑向漸變即可

我們可以藉助偽元素實現這個疊加遮罩:

div::before {
    content: "";
    position: absolute;
    inset: 0;
    background: radial-gradient(rgba(150, 157, 100, 0.32), rgba(0, 0, 0, 1) 45vmin, rgba(0, 0, 0, 1));
}

這裡我們實現了這麼一個漸變:

  • radial-gradient(rgba(150, 157, 100, 0.32), rgba(0, 0, 0, 1) 45vmin, rgba(0, 0, 0, 1)):其核心就是實現了從某一個實體顏色(選取一個上面角向漸變圖形用到的主要顏色)到黑色的一個徑向漸變效果

這樣,我們就將邊緣改造的不那麼突兀了!

效果如下:

設置多層背景

基於上述的原理及技巧,我們重新構思一下整個動畫,上面只有一層角向背景的背景在運動。

那麼,如果我們設置多層背景,並且,設置他們正向、反向一起運動呢?

我們來實現一個 4 層角向漸變背景的動畫效果,並且使用最終我們想要的黃色為主題色,:

<div class="g-container">
    <div class="g-circle g-circle1"></div>
    <div class="g-circle g-circle2"></div>
    <div class="g-circle g-circle3"></div>
    <div class="g-circle g-circle4"></div>
</div>

完整的 CSS 代碼如下:

body{
    width: 100%;
    height: 100%;
    background: #000;
}

.g-container {
    position: absolute;
    width: 80vmax;
    height: 80vmax;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);

    .g-circle {
        position: absolute;
        inset: 0;
        border-radius: 50%;
    }
    
    .g-circle1 {
        background: 
            repeating-conic-gradient(
                from 0deg at 50% 50%,
                transparent 0%,
                rgba(255, 230, 8, 0.69) 1%,
                transparent 6%
        );
        animation: 13s linear rotate infinite reverse;
    }
    
    .g-circle2 {
        background: 
            repeating-conic-gradient(
                from 19deg at 50% 50%,
                transparent 0%,
                rgba(250, 240, 20, 0.78) 1.2%,
                rgba(250, 240, 20, 0.78),
                transparent 4.8%,
                transparent 7.6%
        );
        animation: 9s linear -2s rotate infinite;
    }
    
    .g-circle3 {
        background: 
            repeating-conic-gradient(
                from 37deg at 50% 50%,
                transparent 0%,
                rgba(250, 240, 20, 0.78) 4%,
                transparent 7.9%,
                transparent 12%
        );
        animation: 17s linear rotate infinite reverse;
    }
    
    .g-circle4 {
        background: 
            repeating-conic-gradient(
                from 103deg at 50% 50%,
                transparent 0%,
                rgba(250, 240, 20, 0.5) 5%,
                rgba(250, 240, 20, 0.27) 7%,
                transparent 12%
        );
        animation: 7s linear rotate infinite;
    }
}

@keyframes rotate {
    from {
        transform: rotate(0deg);
    }

    to {
        transform: rotate(359deg);
    }
}

上面的代碼,做了幾件核心事情:

  1. 4 層背景重疊在一起
  2. 4 層背景設置不同的重覆角向漸變圖案 repeating-conic-gradient()
  3. 4 層背景兩個順時針旋轉、兩個逆時針旋轉
  4. 動畫的參數各不相同

這樣,我們能得到這麼一個效果:

此時,我們再在上述圖形的基礎上,疊加上一層遮罩 mask,將圖案的邊緣黑化:

<div class="g-container">
    <div class="g-circle g-circle1"></div>
    <div class="g-circle g-circle2"></div>
    <div class="g-circle g-circle3"></div>
    <div class="g-circle g-circle4"></div>
 +  <div class="g-circle g-mask"></div>
</div>
.g-container .g-mask {
    position: absolute;
    inset: -200px;
    background: 
        radial-gradient(
            rgba(250, 240, 20, 0.2) 0,
            rgba(0, 0, 0, .8) calc(40vmax - 15vmax),
            #000 calc(40vmax - 5vmax),
            #000 100%
        );
}

這裡是一個比原容器稍微大的新容器(註意 inset: 200px),再設置從中心想外的徑向漸變,最外層顏色為黑色。

這樣,我們就能得到我們想要的效果了:

到這裡,完整的代碼,你可以戳這裡:CodePen Demo -- Conic-gradient Pic

使用混合模式

當然,上述其實只是一種實現該圖形動畫的方式。

我們還可以藉助混合模式,得到類似的效果。

這一次,我們將藉助 SASS 的隨機函數,隨機生成不同的角向漸變背景,大致的代碼如下:

<div></div>
@function randomNum($max, $min: 0, $u: 1) {
	@return ($min + random($max)) * $u;
}

@function randomConicGradient() {
	$n: 16 + random(16);
	$list: ();
	
	@for $i from 0 to $n {
		$list: $list, rgba(hsl(100, randomNum(250, 5, 10%), randomNum(1, 1, 1%)), randomNum(100, 0, .01));
	}
		
	@return conic-gradient($list, nth($list, 1));
}

body {
    overflow: hidden;
}

div {
    width: 100vw;
    height: 100vh;
	margin: 0;
	background: 
		radial-gradient(hsl(9, randomNum(100, 75, 1%), randomNum(100, 75%, 1%)), black);
	
	&:before, &:after {
		position: absolute;
		top: 50%; left: 50%;
		margin: -100vmax; 
		width: 200vmax; 
                height: 200vmax;
		opacity: .5;
		animation: rotate randomNum(100, 25, .1s) ease-in-out infinite;
		content: '';
	}
	
	&:before { background: randomConicGradient(); }
	&:after {
		background: randomConicGradient();
		animation-duration: randomNum(100, 25, .1s);
		animation-direction: reverse;
	}
}

@keyframes rotate { 
    to { 
        transform: rotate(1turn); 
    } 
}

上述的代碼核心做了 3 件事:

  1. 元素本身設置了一個簡單的從隨機顏色到黑色的徑向漸變
  2. 元素的兩個偽元素藉助 SASS 隨機生成不同的角向漸變背景
  3. 兩個偽元素做反向的旋轉動畫

這樣,我們可以得到這麼一種隨機效果:

這裡可能大家光看代碼還是會有些費勁,我給大家再拆解一下,上面的圖形,大致是由下述方式疊加而來(由於顏色都是隨機生成的,所以更多的看每個結構實現了什麼樣的圖形):

嘿,有點意思,不過別急,此時,我們再給兩個偽元素,添加上一個混合模式 mix-blend-mode: overlay

div {
    // ...
	
    &:before, &:after {
        mix-blend-mode: overlay;
    }
}

這樣,整個效果就變成了:

由於,顏色是隨機的,刷新頁面或者簡單改變一些顏色參數,得到的效果就會很不一樣,也有可能是這樣的:

或者這樣的:

藉助混合模式,我們實現了更為酷炫的效果,上述的 DEMO,完整的代碼在這裡:CodePen Demo -- Animation conic-gradient

還原題圖效果

好,到這裡,我們再回歸最開始我們希望實現的效果:

有了上面的鋪墊,再看這個效果就沒那麼複雜了,本質就是在我們上述實現的圖形中間,鏤空一個黑色區域。

首先,我們藉助上述鋪墊的內容,實現這麼一個圖形:

接著,我們在內部,通過 mask,進行一個徑向漸變的鏤空即可,加上這麼一句簡單的代碼:

div {
    mask: radial-gradient(transparent, transparent 55%, #000 56%, #000);
}

需要結合實現 background 的參數進行調試。

這樣,我們就成功的實現一個類似的 Loading 圖形:

完整的代碼,你可以戳這裡:CodePen Demo -- Animation conic-gradient & Mask

我們再看一個由 CodePen 上由 Yoav Kadosh 實現的另外一個原理類似的有意思的效果:

經由本文介紹的技巧,我們還可以演化出許多有意思的效果,讀者朋友可以自行探索!

當然,我們不難看出,CSS 還是非常有意思的。

最後

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

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

-Advertisement-
Play Games
更多相關文章
  • 更改電腦上的遠程桌面的偵聽埠 轉載:https://learn.microsoft.com/zh-CN/windows-server/remote/remote-desktop-services/clients/change-listening-port 適用範圍:Windows Server ...
  • 本文基於內核 5.4 版本源碼討論 通過上篇文章 《從內核世界透視 mmap 記憶體映射的本質(原理篇)》的介紹,我們現在已經非常清楚了 mmap 背後的映射原理以及它的使用方法,其核心就是在進程虛擬記憶體空間中分配一段虛擬記憶體出來,然後將這段虛擬記憶體與磁碟文件映射起來,整個 mmap 系統調用就結束了 ...
  • 2023_10_10_MYSQL_DAY_02_筆記 #在 FROM 子句中使用子查詢 SELECT a.ename, a.sal, a.deptno, b.salavg FROM emp a, (SELECT deptno, AVG(sal) salavg FROM emp GROUP BY de ...
  • 如今,大規模、高時效、智能化數據處理已是“剛需”,企業需要更強大的數據平臺,來應對數據查詢、數據處理、數據挖掘、數據展示以及多種計算模型並行的挑戰,湖倉一體方案應運而生。 《實時湖倉實踐五講》是袋鼠雲打造的系列直播活動,將圍繞實時湖倉的建設趨勢和通用問題,邀請奮戰於企業數字化一線的核心產品&技術專家 ...
  • PostgreSQL 教程 ​ — — — — —— 參考: 菜鳥教程 ORDBMS 術語 在我們開始學習 PostgreSQL 資料庫前,讓我們先瞭解下 ORDBMS 的一些術語: 資料庫: 資料庫是一些關聯表的集合。 數據表: 表是數據的矩陣。在一個資料庫中的表看起來像一個簡單的電子錶格。 列: ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在ElementUI的世界中,不僅有基礎的組件和功能,還有一些讓你眼前一亮、*得不能再*的高級技巧和竅門。本文將揭示這些技巧,讓你在前端開發的舞臺上獨領風騷。無論你是一個勇敢的創新者還是一個喜歡調皮搗蛋的開發者,這些技巧都將讓你的Elem ...
  • 之前在開發一個管理頁面,功能有,編輯時只有一行可以編輯,刪除時彈出警告視窗,確認後才執行刪除。 ​ 代碼為Element-plus中的示例。 但是ElMessageBox一直被遮擋 代碼如下,均為Element-plus的示例,此外還有兩層router-view嵌套: <template> <el- ...
  • 在我們日常的網頁中,尤其是新聞類的網頁會遇到許多類似於這樣的樣式 多行甚至單行的文本隱藏+上省略號標題。 解決這一辦法,需要利用css的樣式進行改變 如下代碼的演示: 單行文本隱藏: 多行文本隱藏: 主要知識點: 1、單行文本隱藏省略:文本不能換行、超出部分隱藏、超出部分省略 2、多行文本隱藏省略: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...