Day 22 JavaScript 乱薍覼釠亂碼效果

日期
2023.10.06
分類
網頁開發
閱讀時間
16 min
字數
4.8k
最後更新
2023.10.06
課程 2023.10.06 Day 22 JavaScript 乱薍覼釠亂碼效果

今天我們要來做一些乱薍覼釠亂碼效果。

成果
成果

效過在手,氣氛要有。

基本版面

HTML

一個標題,一個 <div> 放亂碼,一個 <span> 拿來測長寬,稍後用到。

HTML
<h1>ITHOME</h1><div>LDHELDMEW...</div><span>a</span>

CSS

抓個 Google Font 來用,我用的是 Space Mono

CSS
@import url("https://fonts.googleapis.com/css2?family=Space+Mono:wght@700&display=swap");body {	background: #000;	height: 100svh;	overflow: hidden;	color: #fff;}h1 {	font-size: 4em;	font-family: "Space Mono", monospace;	position: absolute;	top: 50%;	left: 50%;	transform: translate(-50%, -100%);}div {	width: 100%;	word-wrap: break-word;}

word-wrap: break-word; 這個屬性是讓文字超出邊界時,自動換行。

有趣的 JavaScript

一步一步來

亂碼

來做個亂碼函式,輸入一個數字,就會回傳那麼多個亂碼。

一個變數 box 放著所有可能的字元,

JS
const box = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

Math.random() 會回傳一個 0 到 1 之間的數字

JS
Math.random();// 0.946621565811897

Math.random()*5 會回傳一個 0 到 4 之間的數字

JS
Math.random() * 5;//4.603685644684928

Math.floor() 會無條件捨去小數點

JS
Math.floor(4.603685644684928);//4

這樣就有隨機取數了😯

我們把它乘上 box.length,就會得到一個 0 到 box.length 之間的數字,再用 Math.floor() 取整數,就會得到一個 0 到 box.length - 1 之間的數字,這個數字就是 box 的索引,我們就可以從 box 裡面隨機取出一個字元。

JS
box[Math.floor(Math.random() * box.length)];//A

寫一個函式,輸入一個數字,就會用迴圈回傳那麼多個亂碼。

JS
const box = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";const randomText = amount => {	var a = "";	for (var i = 0; i < amount; i++) a += box[Math.floor(Math.random() * box.length)];	return a;};

測試一下

JS
randomText(10);//"XVDBHCCQ39"

喔~😯

需要幾個

螢幕有大有小,字體大小又都不一樣。沒關係,量一下就好了。

<span> 裡面有一個字母 a。量螢幕大小除以字母大小就是大約需要多少個字母

JS
const singleText = document.querySelector("span");const total = (window.innerWidth * window.innerHeight) / singleText.offsetWidth / singleText.offsetHeight;//2736

喔~😯

解碼效果

settimeout可以讓函式延遲執行

JS
console.log("never gonna give you up");window.setTimeout(function () {	console.log("never gonna let you down");}, 2000);//never gonna give you up//(過了兩秒)//never gonna let you down

一個雙層迴圈,每 6 次洗牌多顯示一個字。直到最後 6 個字都顯示完畢。

JS
for (let j = 0; j <= titleText.length; j++) {	window.setTimeout(function () {		var current = j;		for (let k = 0; k <= 5; k++) {			window.setTimeout(function () {				var correct = titleText.slice(0, current);				correct += randomText(titleText.length - current);				title.innerText = correct;			}, 50 * k);		}	}, 300 * j);}

迴圈的延遲邏輯大概是這樣。

延遲邏輯
延遲邏輯

喔~😯

滑鼠位置

偵測滑鼠移動

JS
document.onmousemove = e => console.log(e);// mousemove { target: html, buttons: 0, clientX: 1004, clientY: 242, layerX: 1004, layerY: 242 }

改成執行我們的函式

JS
document.onmousemove = e => bluh(e);

我們把讀到的滑鼠位置,放進 CSS 屬性 --x--y 裡面。讓遮罩來定位。

JS
bg.style.setProperty("--x", `${e.clientX}px`);bg.style.setProperty("--y", `${e.clientY}px`);

完整函式

JS
const bluh = e => {	const bg = document.querySelector("div");	const singleText = document.querySelector("span");	const total = (window.innerWidth * window.innerHeight) / singleText.offsetWidth / singleText.offsetHeight;	bg.innerText = randomText(total);	bg.style.setProperty("--x", `${e.clientX}px`);	bg.style.setProperty("--y", `${e.clientY}px`);};document.onmousemove = e => bluh(e);bluh();

喔~😯

遮罩 CSS 了解一下

CSS
div {	--x: -100vw;	--y: -100vh;	width: 100%;	word-wrap: break-word;	-webkit-mask-image: radial-gradient(circle at var(--x) var(--y), #fff, #ffffff44 15em);}

遮罩設定成一個圓形漸層,並定位到 --x--y 的位置。

成果

開啟 Day 22 CodePen 範例

成果
成果
HTML
<h1>ITHOME</h1><div></div><span>a</span>
CSS
@import url("https://fonts.googleapis.com/css2?family=Space+Mono:wght@700&display=swap");body {	background: #000;	height: 100svh;	overflow: hidden;	color: #fff;}h1 {	font-size: 4em;	color: #fff;	font-family: "Space Mono", monospace;	position: absolute;	top: 50%;	left: 50%;	transform: translate(-50%, -100%);}div {	--x: -100vw;	--y: -100vh;	width: 100%;	word-wrap: break-word;	-webkit-mask-image: radial-gradient(circle at var(--x) var(--y), #fff, #ffffff44 15em);}
JS
const title = document.querySelector("h1");const titleText = "ITHOME";setInterval(function () {	for (let j = 0; j <= titleText.length; j++) {		window.setTimeout(function () {			var current = j;			for (let k = 0; k <= 5; k++) {				window.setTimeout(function () {					var correct = titleText.slice(0, current);					correct += randomText(titleText.length - current);					title.innerText = correct;				}, 50 * k);			}		}, 300 * j);	}}, 5000);const box = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";const randomText = amount => {	var a = "";	for (var i = 0; i < amount; i++) a += box[Math.floor(Math.random() * box.length)];	return a;};const bluh = e => {	const bg = document.querySelector("div");	const singleText = document.querySelector("span");	const total = (window.innerWidth * window.innerHeight) / singleText.offsetWidth / singleText.offsetHeight;	bg.innerText = randomText(total);	bg.style.setProperty("--x", `${e.clientX}px`);	bg.style.setProperty("--y", `${e.clientY}px`);};document.onmousemove = e => bluh(e);bluh();

以上就是我今天的分享,歡迎在 InstagramGoogle 新聞追蹤毛哥EM資訊密技,也歡迎訂閱我新開的YouTube 頻道:網棧

我是毛哥EM,讓我們明天再見。

關於我

毛哥EM

這裡是毛哥EM,一隻全端開發龍還有英文辯士。
熱愛開源、音樂、設計、獸迷文化,專研人機互動與人工智慧。

本部落格皆屬原創文章,採 CC BY-SA 4.0 新分頁開啟 授權,
轉載請註明來自毛哥EM資訊密技。
這篇文章對你有幫助嗎? 考慮幫我買瓶 Red Bull? 新分頁開啟

毛哥EM 角色插圖

留言

留言區

安全驗證