簡介
在本篇技術文章中,將介紹如何使用HTML、CSS和JavaScript創建一個獨特而引人注目的"文字(字母&數字)"雨🌧?動畫效果。通過該動畫,展現出的是一系列隨機字符將從云朵中下落像是將文字變成雨滴從天而降,營造出與眾不同的視覺效果。
文字雨
HTML
創建一個基本的HTML結構,這段HTML代碼定義了一個容器,其中包含了"云朵"和"雨滴"(即文字元素)。基本結構如下:
- 首先是類名為
container
的容器,表示整個動畫的容器; - 其次是類名為
cloud
的容器,表示云朵的容器; - 接著是
cloud
容器中的文字元素,表示雨滴(即文字元素);
然后引入外部創建的css和js文件,可以先定義幾個text
容器,用于調整樣式;
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Text Rain Animation</title><link rel="stylesheet" href="./css/style.css">
</head>
<body><div class="container"><div class="cloud"><!-- <div class="text">a</div> --><!-- <div class="text">b</div> --><!-- <div class="text">c</div> --><!-- 雨滴將會在這里出現 --></div></div><script src="./js/main.js"></script>
</body>
</html>
CSS
CSS是為文字雨效果增色添彩的關鍵,使動畫效果更加豐富,關于一些 CSS 樣式:
- 使用了自定義的顏色變量來為背景色和文本顏色提供值,有助于使代碼易于維護和修改;
- 利用CSS的陰影效果和動畫功能,創造逼真的"云朵"和流暢的"雨滴"動畫;
* {margin: 0;padding: 0;box-sizing: border-box; }:root {--body-color: #181c1f;--primary-color: #ffffff; }body {display: flex;justify-content: center;align-items: center;min-height: 100vh;background-color: var(--body-color); }.container {width: 100%;height: 400px;display: flex;justify-content: center;border-bottom: 1px solid rgba(255, 255, 255, .1);/* 添加一個從下往上線性漸變的鏡像效果,增加視覺層次感 */-webkit-box-reflect: below 1px linear-gradient(transparent, transparent, transparent, transparent, #0005); }.cloud {position: relative;top: 50px;z-index: 100;/* 橫向云朵 */width: 320px;height: 100px;background-color: var(--primary-color);border-radius: 100px;/* drop-shadow函數將陰影效果應用于投影圖像 */filter: drop-shadow(0 0 30px var(--primary-color)); } .cloud::before {content: "";/* 左側小云朵 */width: 110px;height: 110px;background-color: var(--primary-color);border-radius: 50%;position: absolute;top: -50px;left: 40px;/* 右側大云朵 */box-shadow: 90px 0 0 30px var(--primary-color); }.cloud .text {position: absolute;top: 40px;height: 20px;line-height: 20px;text-transform: uppercase;color: var(--primary-color);/* 為文字添加陰影,看上去發光,增加視覺效果 */text-shadow: 0 0 5px var(--primary-color), 0 0 15px var(--primary-color), 0 0 30px var(--primary-color);transform-origin: bottom;animation: animate 2s linear forwards; }@keyframes animate {0% {transform: translateX(0);}70% {transform: translateY(290px);}100% {transform: translateY(290px);} }
通過關鍵幀動畫
@keyframes animate
定義文字運動的過程,在這里是垂直移動290px,也就是向下移動,模擬下雨的狀態。當然為了讓文字雨效果更加好看,還可以引入一下字體庫;Warning
-webkit-box-reflect
:可將元素內容在特定方向上進行軸對稱反射;但是該特性是非標準的,請盡量不要在生產環境中使用它!
目前只有
webkit
內核的瀏覽器支持,如:谷歌瀏覽器、Safari瀏覽器。在火狐瀏覽器中是不支持的;JavaScript
最后,使用JavaScript來實現文字雨的效果。通過動態生成并隨機選擇字符,可以實現讓這些字符(雨滴)從.cloud(云朵)中降落的效果。JavaScript 腳本邏輯:
- 首先,定義函數
generateText()
并創建字符集,定義函數randomText()
通過從給定的字符集中隨機選擇一個字符返回; - 接下來,編寫
rainEffect()
函數,在函數內部,首先選取 .cloud 元素同時創建一個新的<div>
元素作為字符節點,設置元素文本內容為函數返回的字符,并添加類名; - 然后,利用 Math.random() 方法生成一些隨機值,將這些隨機值應用到創建的
<div>
元素上,包括:- 字符距離左側位置,在 .cloud 容器的寬度區間;
- 字體大小,最大不超過32px;
- 動畫周期所需的時間(動畫持續時間),2s內;
- 最后,將其
<div>
添加到 .cloud 元素中,使用setTimeout() 函數在2秒
后將文字節點從 .cloud 元素中移除,模擬雨滴落地消失效果;
定時器: 為了讓字符(雨滴)持續下落,使用 setInterval
函數和一個時間間隔值來調用 rainEffect()
函數。這樣就是每20毫秒就會生成一個新的字符(雨滴)節點并添加到云朵中。
// 生成字母和數字數組
function generateText() {const letters = [];const numbers = [];const a = "a".charCodeAt(0);for (let i = 0; i < 26; i++) {letters.push(String.fromCharCode(a + i));if (i < 9) {numbers.push(i + 1);}};return [...letters, ...numbers];
};// 從生成的數組中隨機取出一個字符
function randomText() {const texts = generateText();const text = texts[Math.floor(Math.random() * texts.length)];return text;
};function rainEffect() {const cloudEle = document.querySelector(".cloud");const textEle = document.createElement("div");textEle.innerText = randomText();textEle.classList.add("text");const left = Math.floor(Math.random() * 310);const size = Math.random() * 1.5;const duration = Math.random();const styleSheets = {left: `${left}px`,fontSize: `${0.5 + size}em`,animationDuration: `${1 + duration}s`,};Object.assign(textEle.style, styleSheets);cloudEle.appendChild(textEle);setTimeout(() => {cloudEle.removeChild(textEle);}, 2000);
};// 每隔20ms創建一個雨滴元素
setInterval(() => rainEffect(), 20);
關于
String
方法:
charCodeAt() fromCharCode()
相關動畫效果
文章:
- 3D視覺畫廊展示旋轉播放
- CSS簡單實現3D香煙動畫
結論
通過HTML、CSS和JavaScript的緊密配合,成功但不是很完美的創建了一個炫酷的"文字雨"動畫效果,這個動畫可以漸增加網頁的 吸引力! 不要猶豫🖐?,動手嘗試一下,或者甚至你也可以根據自己的需求對文字、樣式和動畫參數進行調整,進一步改善和擴展這個效果;
希望這篇文章對你在開發類似動畫效果時有所幫助!另外如果你對這個案例還有任何問題,歡迎在評論區留言或聯系(私信)我。謝謝閱讀🎉!?
👉原文鏈接