家好! 歡迎來到本教程,我們將深入了解使用 HTML 畫布和 JavaScript 在代碼中創建有趣的氣泡的世界。 最好的部分? 我們將只使用一點 HTML 和所有 JavaScript,而不是 CSS 來實現所有這一切。
今天,我們要掌握以下幾個概念:
使用畫布上下文的 arc 方法創建圓。
利用 requestAnimationFrame 函數實現平滑的圓形動畫。
利用 JavaScript 類的強大功能來創建多個圓圈,而無需重復代碼。
向我們的圓圈添加描邊樣式和填充樣式以獲得 3D 氣泡效果。
你可以跟著我一起看,或者如果你想看源代碼,可以使用最終的codepen
首先,我們需要一個 HTML5 Canvas 元素。 Canvas 是創建形狀、圖像和圖形的強大元素。 這就是氣泡將產生的地方。 讓我們來設置一下 -
<canvas id="canvas"></canvas>
為了使用畫布做任何有意義的事情,我們需要訪問它的上下文。 Context 提供了在畫布上渲染對象和繪制形狀的接口。
讓我們訪問畫布及其上下文。
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
我們將設置畫布以使用整個窗口的高度和寬度 -
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
讓我們通過添加一些 css 為畫布提供一個漂亮的舒緩淺藍色背景。 這是我們要使用的唯一 CSS。 如果您愿意,也可以使用 JavaScript 來完成此操作。
#canvas {
background: #00b4ff;
}
讓我們進入有趣的部分。 我們將通過單擊畫布來創建氣泡。 為了實現這一點,我們首先創建一個點擊事件處理程序:
canvas.addEventListener('click', handleDrawCircle);
由于我們需要知道在畫布上單擊的位置,因此我們將在句柄 DrawCircle 函數中跟蹤它并使用事件的坐標 -
//We are adding x and y here because we will need it later.
let x, y
const handleDrawCircle = (event) => {
x = event.pageX;
y = event.pageY;
// Draw a bubble!
drawCircle(x, y);
};
為了創建圓圈,我們將利用畫布上下文中可用的 arc 方法。 Arc 方法接受 x 和 y - 圓心、半徑、起始角和結束角,對于我們來說,這將是 0 和 2* Math.PI,因為我們正在創建一個完整的圓。
const drawCircle = (x, y) => {
context.beginPath();
context.arc(x, y, 50, 0, 2 * Math.PI);
context.strokeStyle = 'white';
context.stroke();
};
現在我們有了圓圈,讓我們讓它們移動,因為……
GIF
請記住,當我們創建圓時,我們使用了 arc 方法,它接受 x 和 y 坐標 - 圓的中心。 如果我們快速移動圓的 x 和 y 坐標,就會給人一種圓在移動的印象。 讓我們試試吧!
//Define a speed by which to increment to the x and y coordinates
const dx = Math.random() * 3;
const dy = Math.random() * 7;//Increment the center of the circle with this speed
x = x + dx;
y = y - dy;
我們可以將其移至函數內 -
let x, y;
const move = () => {
const dx = Math.random() * 3;
const dy = Math.random() * 7; x = x + dx;
y = y - dy;
};
為了讓我們的圓圈無縫移動,我們將創建一個動畫函數并使用瀏覽器的 requestAnimationFrame 方法來創建一個移動的圓圈。
const animate = () => {
context.clearRect(0, 0, canvas.width, canvas.height);
move();
drawCircle(x,y); requestAnimationFrame(animate);
};//Don't forget to call animate at the bottom
animate();
現在我們已經創建了一個圓圈,是時候創建多個圓圈了!
但在我們創建多個圓圈之前,讓我們準備一下我們的代碼。為了避免重復我們的代碼,我們將使用類并引入 Particle 類。 粒子是我們動態藝術作品和動畫的構建塊。 每個氣泡都是一個粒子,具有自己的位置、大小、運動和顏色屬性。 讓我們定義一個 Particle 類來封裝這些屬性:
class Particle {
constructor(x = 0, y = 0) {}
draw() {
// Drawing the particle as a colored circle
// ...
} move() {
// Implementing particle movement
// ...
}
}
讓我們將一些已設置的常量移至 Particle 類 -
class Particle {
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
this.radius = Math.random() * 50;
this.dx = Math.random() * 3;
this.dy = Math.random() * 7;
}
draw() {
// Drawing the particle as a colored circle
// ...
} move() {
// Implementing particle movement
// ...
}
}
draw 方法將負責在畫布上渲染粒子。 我們已經在drawCircle中實現了這個功能,所以讓我們將它移動到我們的類中并將變量更新為類變量
class Particle {
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
this.radius = Math.random() * 50;
this.dx = Math.random() * 3;
this.dy = Math.random() * 7;
this.color = 'white';
}
draw() {
context.beginPath();
context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
context.strokeStyle = this.color;
context.stroke(); context.fillStyle = this.color;
context.fill();
} move() {}
}
同樣,讓我們在類中移動 move 函數 -
move() {
this.x = this.x + this.dx;
this.y = this.y - this.dy;
}
現在,我們需要確保在事件處理程序中調用 Particle 類。
const handleDrawCircle = (event) => {
const x = event.pageX;
const y = event.pageY;
const particle = new Particle(x, y);
};canvas.addEventListener('click', handleDrawCircle);
由于我們需要在 animate 函數中訪問該粒子,以便調用其 move 方法,因此我們將該粒子存儲在一個名為 molecularArray 的數組中。 當創建大量粒子時,這個數組也會很有幫助。 這是反映這一點的更新代碼 -
const particleArray = [];
const handleDrawCircle = (event) => {
const x = event.pageX;
const y = event.pageY; const particle = new Particle(x, y);
particleArray.push(particle);
};canvas.addEventListener('click', handleDrawCircle);
記得也要更新動畫功能 -
此時,您將在屏幕上看到這個粒子 -
驚人的! 現在,到了有趣的部分! 讓我們創建很多圓圈并設計它們的樣式,使它們看起來像氣泡。
為了創建大量氣泡,我們將使用 for 循環創建粒子并將它們添加到我們在此處創建的粒子數組中。
const handleDrawCircle = (event) => {
const x = event.pageX;
const y = event.pageY;
for (let i = 0; i < 50; i++) {
const particle = new Particle(x, y);
particleArray.push(particle);
}
};canvas.addEventListener('click', handleDrawCircle);
在動畫函數中,我們將通過清除畫布并在新位置重新繪制粒子來不斷更新畫布。 這會給人一種圓圈在移動的錯覺。
const animate = () => {
context.clearRect(0, 0, canvas.width, canvas.height);
particleArray.forEach((particle) => {
particle?.move();
particle?.draw();
}); requestAnimationFrame(animate);
};animate();
現在我們有了移動的氣泡,是時候給它們添加顏色,使它們看起來像氣泡了!
我們將通過向氣泡添加漸變填充來實現此目的。 這可以使用 context.createRadialGradient 方法來完成。
const gradient = context.createRadialGradient(
this.x,
this.y,
1,
this.x + 0.5,
this.y + 0.5,
this.radius
);
gradient.addColorStop(0.3, 'rgba(255, 255, 255, 0.3)');
gradient.addColorStop(0.95, '#e7feff');context.fillStyle = gradient;
恭喜! 您剛剛僅使用 HTML Canvas 和 JavaScript 創建了一些超級有趣的東西。 您已經學習了如何使用 arc 方法、利用 requestAnimationFrame、利用 JavaScript 類的強大功能以及使用漸變設計氣泡以實現 3D 氣泡效果。
請隨意嘗試顏色、速度和大小,使您的動畫真正獨一無二。
請隨意嘗試顏色、速度和大小,使您的動畫真正獨一無二。
我希望您在學習本教程時能像我在創建它時一樣獲得樂趣。 現在,輪到你進行實驗了。 我很想看看你是否嘗試過這個以及你創造了什么。 與我分享您的代碼鏈接,我很樂意查看。
代瀏覽器都內置了專用動畫技術,Martin G?rner為您展現四種最棒的實例。
現代移動操作系統將用戶接口動畫化,并已達到了電腦端交互的標準——精選流暢的動畫,體現出沉浸效果以及支持直觀的交互。我們都想當然的認為,可以設置一個列表,使之帶有運動特性,用手指輕輕一推,它就如同有重量和慣性一樣運動起來,直到遇到邊緣再反彈回來一點。但是,在網絡上,我們還達不到這樣的效果。
接受事實吧,現有網上的動畫經常被視作UI災難,還在使用二十年前陳舊的<blink>標簽技術。加入Flash有點幫助,不過它缺乏HTML DOM集成,都變成了不美觀的800×600分辨率,并且JavaScript DOM操作還有其標志性的5幀/秒(fps)動畫率——真是絕望啊!
改變
2013年,現代瀏覽器內置了專用動畫技術,達到60 fps。是時候去忘掉過去,開始構建美妙的UI動畫體驗了。我將展示四個動畫技術,幫助你決定,哪一個更適合你的項目。
讓我們從最簡單的聲明式技術開始:CSS3。這里不需要JavaScript,存CSS,加上一點現代手段。
CSS通過兩種基本屬性來聲明動畫:過渡和動畫。過渡屬性通知瀏覽器計算兩種狀態(由各自CSS定義)間的中間幀。動畫通過改變元素CSS觸發。比如,當你以編程方式改變它的層,或啟動一個:hover CSS。
當縮略圖層從開始轉變到結束,圖像則從一處平滑的移動到另一處,典型的表現為JavaScript DOM動作的結果。
img { -webkit-transition: 1s; }.begin { left: 0px; }.end { left: 500px; }
動畫屬性最常用于持續運行的動畫特效,它還允許自定義中間步驟的動畫。
創建一個旋轉的圖像:
img {-webkit-animation: myAnim 3s infinite; }@-webkit-keyframes myAnim{ from {-webkit-transform: rotate(0deg) } 50% {/* possible intermediate positions at any % */} to {-webkit-transform: rotate(360deg) }}
利用大量CSS屬性制作動畫具有無限的創造性,你可以根據意圖在邊框寬度內任意創建動畫。 不過,大多數對動畫有用的屬性都是幾何變換和不透明的。CSS3通過易操作的轉換屬性提供了全系列二維幾何變換:平移、旋轉、縮放和歪斜。
用旋轉、縮放和歪斜創建2D轉換:
webkit-transform:旋轉30度
webkit-transform:縮小50%
webkit-transform:歪斜-20度,再20度
接下來變得有趣了。如果你覺得在CSS中添加3D效果,技術上是為了粗體和斜體的設計,這很愚蠢,請接著閱讀。通過擴展幾何轉換到三維圖像將是一個很自然的方式,相同變換屬性還可以做平移X,Y,Z軸以及旋轉X,Y,Z軸。
3D旋轉圖像:
webkit-transform:Y軸旋轉45度
再加上點拋出動畫效果,看上去就像是一個旋轉的三維立方體。
如果確實這般容易的話,就不會有任何趣味性了。設計師留了一點懸念,你可以試一下,只對一個圖像進行旋轉,瀏覽器默認渲染出來的效果是不帶透視性的:
webkit-transform:Y軸旋轉45度
可以添加上透明屬性,默認是無窮大極限值也是不帶有一點透明效果的。就如同靠近鏡頭的對象與很遠距離外的對象看上去大小一樣。
為了確保圖像看上去更真實,你還需要指定一個鏡頭與屏幕之間距離的值。加上-webkitperspective: 1000px就可以了。
要在一塊平面屏幕上呈現一個3D對象,首先畫出一條線連接眼鏡或相機與3D物理上的點。這條線與屏幕的交集就是相應像素所在的位置。為了找到像素在屏幕上的坐標,利用泰勒斯定理,你需要空間中點的3D坐標和相機與屏幕之間的距離(f在光學中也被稱為焦距)。這就是視角屬性提供的距離。如果這個距離是無限遠的,你可以看到所有射線(眼球到3D點線)是水平緊密狀的,而且很遠很遠的對象在屏幕上的大小一樣。
現在我們有設置一個3D立方體的所有基礎了,利用六個圖像以及CSS 3D轉換,接下來就可以實現旋轉了。
這一步很簡單:我們把一個三維旋轉封裝到一個div,將會產生如下效果:
瀏覽器執行你讓它所做的步驟:在div渲染一個三維立方體,然后像一張平面圖片般在自身運用3D旋轉。這是默認效果,雖然不是你想要的。你要告訴瀏覽器運用嵌套div來構成3D轉換,-webkit-transform-style: preserve-3d屬性。通過這個,我們就能得到想要的旋轉立方體了。
很容易在空間失去定位。我的建議是采用一個div,命名為SCENE。這就是透明屬性存放的位置。在內部,放置一個命名為OBJECT的div,它應當擁有transform-style: preserve-3d屬性,并且該div就是你應用轉換移動整個對象的地方。最后,在該div內部,使用3D轉換設置你想要的正面圖像,創建所需對象。在我們的例子中,立方體的六個面:
.SCENE { -webkit-perspective: 1000px; }.OBJECT{ -webkit-transform-style: preserve-3d; -webkit-transform: rotateX(20deg rotateY(120deg) rotateZ(50deg); /* replace this with an animation property if you want movement */}.FACE1 { -webkit-transform:translateX(150px)rotateY(90deg);}...
關于3D CSS轉換很棒的一點是CSS動畫和過渡的完美結合。我們在這留了一個練習,讓旋轉立方體運動起來,當鼠標光標懸停其上時,立方體自動打開來。操作方法是:把立方體的面移動到與中心一定距離的地方。第二組CSS屬性有一個 :hover選擇器,將立方體的面放置在更遠的距離。通過運用第一種轉換屬性,你將看到立方體從中心盤旋打開,同時還保持旋轉(演示)。
HTML與CSS都是強大的動畫技術,但缺乏繪圖基元。SVG能夠彌補這點,并擁有其獨特的動畫標簽。SVG動畫部分被特定稱為同步多媒體集成語言(SMIL)。
首先,SVG是用于矢量基元的,比如矩形、圓形和貝塞爾曲線:
<svg> <rect x="5" y="5" width="140" height="140" stroke="#000000" strokewidth="4"fill="#AAAAFF" opacity="1"/></svg>
同樣可用于:
<line x1 y1 x2 y2><circle cx cy r><path d><image x y width height xlink:href>
其中一個基元,<path>標簽,是SVG中最好用的。它允許你使用直線、弧和貝塞爾曲線定義任意路徑。路徑定義看上去想一個字母,如同Inkscape矢量圖形軟件生成的。對于SVG動畫,你應該理解這一點。
一個二次和三次貝塞爾曲線的例子:
<svg> <path d="M 30,240 Q 170,40 260,230" stroke="#F00" /> <path d="M 30,240 C 70,90 210,150 260,230" stroke="#F00" /></svg>
語法:
M x,y ? ? 新的起點 (標記)
L x,y ? ? ?到哪里的直線
Q cx, cy, x, y ?二次貝塞爾曲線到 (x,y)和一個控制點
C cx,cy, dx,dy, x,y 三次貝塞爾曲線到(x, y)和兩個控制點
A ? ? ? 橢圓弧
z ? ? ? 字符串最后,用于結束路徑
讓我們把這些矢量變得更生動化。你可以查看演示,一個家伙踏著滑板翱翔于白云間。
沖浪板上下擺動,小人的嘴巴在大和更大的笑容間交替變化,眼睛滾動,瞳孔擴張。這是SVG動畫四種可能的類型。
最簡單的一種SVG動畫運用<animate>標簽,改變一種幾何形狀的一個參數,在本例中,就是眼睛的半徑。
要使瞳孔擴張,需要改變屬性列表值中的半徑值。
<circle cx="200" cy="205" r="80" > <animate dur="3s" attributeName="r" values="80; 150; 80" repeatCount="indefinite" /></circle>
方便的是變化的屬性還可以成為<path>標簽。允許你創建一個動畫路徑。 唯一的限制是兩個曲線之間要進行轉換,必須是同一種類型且擁有相同數量的控制點。它們必須由相同位置上的同一個字母定義,唯一不同的只能是參數的改變。當移動小人的嘴巴時,只有“微笑”和“大笑”位置被定義了。SVG動畫將完成插值。
<path fill="#fff"> <animate attributeName="d" dur="2s" repeatCount="indefinite" values="m 0,0 c 1,15 -13,45 -45,45 -32,0 -44,-28 -44,-44 z; m 0,0 c -4,15 -66,106 -98,106 -32,0 3,-89 9,-105 z" /></path>
當然,SVG還能進行幾何變換,也能做成動畫。這里的動畫標簽是<animate Transform>。你必須告訴它想要將哪里的轉變做成動畫,還要提供一個分號分隔的所有關鍵位置的值列表。還可以組成動畫轉換,你告訴瀏覽器使用additive=”sum” 屬性。
幾何轉換的動畫:
<g> ... <!-- SVG primitives group --> <animateTransform dur="3s" repeatCount="indefinite" additive="sum" attributeName="transform" type="translate" values="0,0; 200,-130; -100,200; 0,0" /> <animateTransform dur="3s" repeatCount="indefinite" additive="sum" attributeName="transform" type="rotate" values="0; 20; -20; 0" /></g>
第三個和最后一個SVG動畫標簽也很有用。<animateMotion>用來引導對象沿著特定路徑運動。 它有一個隱藏的技巧稱為rotate=”auto”屬性。它讓對象不僅能夠遵循指定路徑,同時自身保持朝前,如同路上行駛的車輛一樣。
<g> ... <!-- SVG primitives group --> <animateMotion dur=”1s"repeatCount="indefinite" path="m 0,0 a 15,11 0 1 1 -30,0 15,11 0 1 1 30,0 z" /></g>
SMIL有大量控制動畫特征。在它的JavaScript API中揭露pauseAnimations(), unpauseAnimations()和setCurrentTime(t) 函數在全局性開始/停止/暫停一個動畫的功能。還在所有三種動畫標簽(<animate>, <animateTransform>, <animateMotion>)上指定了begin與end屬性。它們可以利用一個事件節點/用戶事件/動畫事件的強大組合。你可以指定,動畫在點擊之后的一秒結束或開始。
例如,下面這個SVG按鈕被點擊后有一個移動的陰影效果:
<g id="buttonID"> <!-- SVG button artwork here --> <animate begin="buttonID.click" dur="1s"\ .../></g>
由聲明性動畫轉換到編程性動畫技術,<canvas>標簽是你的第一選擇。本文所提到的所有技術中,<canvas>標簽最具有跨瀏覽器支持,瀏覽器廠商做了很多努力使之兼容60fps動畫,以下是設置一個畫布的方法:
<canvas width="400" height="400" style = "width: 400px; height: 400px;"></canvas>
第一個尺寸(標簽屬性)設置了畫布的分辨率,這就是你所使用的坐標空間。第二個尺寸(CSS屬性)是畫布出現在屏幕上的形狀大小。為什么不把畫布物理尺寸設置到100%分辨率,內部坐標空間不變,瀏覽器為任意窗口都能正確渲染圖畫?非常遺憾,瀏覽器將畫布內容作為點陣圖來掃描的,任何擴大范圍的結果都將導致模糊混亂的像素。于是,把這兩個值設置成相同的值是唯一可行的選項。
初始化畫布需要JavaScript中<canvas>元素,并在其上調用getContext('2d')函數。獲得的圖畫內容對象被用來調用到畫布API。內容是狀態性的,存儲三種不同的狀態信息:繪畫風格,即時幾何轉換以及累計繪圖路徑。在畫布上進行繪畫的方法是發布繪圖指令,不產生任何可見內容,但在內存中已創建了一個路徑,然后發布一個油墨指令(ctx.stroke(), ctx.fill() 或兩者皆有),就能顯示出路徑了。
畫布動畫需要設置一個動畫循環,你應當基于requestAnimationFrame()函數(帶有正確的前綴)。該函數使瀏覽器能夠管理幀率,在瀏覽器選項卡隱藏時也能停止動畫。
function runAnimation(){ yourWorld.draw() // this is your drawing code webkitRequestAnimationFrame(runAnimation);}
一般來說,畫布被用于動畫的時候,對象的位置必須是在逐幀的基礎上才行,這是因為它們都是物理仿真的結果。觀看box2dweb.js教程。仿真不斷改變仿真世界中對象的位置,動畫循環周期性的在屏幕上展現當前環境狀態。
在畫布動畫中使用SVG精靈是一種很有用的技巧。一個任意復雜性的靜態矢量圖片在畫布上呈現都是繁瑣的,這樣做實際上可行,雖然不如發送一個.svg到 ctx.drawImage()簡單。出于模糊安全的原因,只有內聯SVG支持,你必須在Blob API中使用它(代碼)。
SVG精靈能夠以任意比例展示其矢量美態,但遺憾的是,只支持Chrome瀏覽器。
WebGL暴露瀏覽器運行的JavaScript應用程序OpenGL API,而不需要任何插件。理論上講,你只需要在<canvas> 元素上調用getContext(‘webgl’)(而不是之前的2d)就可以了。然而,WebGL非常大,并且API等級低。最重要的是,web版本沒有默認的渲染路徑,這意味著你無法給它一個形狀,讓它使用適合的默認值展示出來。所以你必須編寫著色器,使用GLSL語言編寫屏幕上出現的任何內容。
幸運的是我們有Three.js幫助。Three最初是由Mr.doob開發的庫,用于一些Chrome演示(www.ro.me/www.chaostoperfection.com),但它是相對獨立的。它擁有所有的基礎,以及內置獨特的著色器,你就可以專注于其他有用的方面:相機、燈光、行動。
首先要做的是編寫Three粘合代碼(很簡單):
var renderer = new THREE.WebGLRenderer({antialias: true});renderer.setSize(width, height);renderer.setClearColorHex(0x000000, 0); // color,transparency// the renderer creates a canvas elementfor youdocument.whereeveryouwant.appendChild(renderer.domElement);
在lights和action之前,需創建camera和位置:
// arguments: FOV,viewAspectRatio, zNear, zFarvar camera = new THREE.PerspectiveCamera(35,width/height, 1, 10000);camera.position.z = 300;
然后是light:
var light = new THREE.DirectionalLight(0xffffff, 1);//color, intensitylight.position.set(1, 1, 0.3); // direction
我們試著呈現一個立方體吧,3D對象在Three中被稱為網絡,都由一個幾何體和一個材料構成。
我們使用一個簡單的結構:
var texture = THREE.ImageUtils.loadTexture(‘Fernando Togni.jpg’);var cube = new THREE.Mesh( new THREE.CubeGeometry(100, 100, 100), new THREE.MeshLambertMaterial({map: texture}) );
最后添加內容,稱為渲染函數。
var scene = new THREE.Scene();scene.add(cube);scene.add(light);renderer.render(scene, camera);
這將為我們的立方體產生一個靜態圖像,為了讓它動起來,我們包裹渲染召集一個動畫循環,改變立方體在每一幀的位置。
function runAnimation(t){ // animate your objects depending on time cube.rotation.y = t/1000; cube.position.x = ... renderer.render(scene, camera); // display requestAnimationFrame(runAnimation); // and loop}
推薦使用三維建模軟件例如Sketchup。Three識別幾類3D模型結構,包括COLLADA(.dae)具有廣泛行業支撐。下面是如何在Three中加載一個模型:
var loader = new THREE.ColladaLoader();loader.load("Android.dae", function(collada){ var model = collada.scene; model.position = ...; // x, y, z model.rotation = ...; // x, y, z scene.add(model);} );
再做一些努力,更換機器人外觀花式,Three提供蘭伯特和馮氏照明風格,法線貼圖,凹凸貼圖,環境映射以及更多。
還可以使機器人運動起來,具體步驟參考教程。
原文鏈接:http://www.gbtags.com/gb/share/2124.htm
tml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE-edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>玻璃效果網站</title>
<link href="../css/20240302.css" rel="stylesheet">
</head>
<body>
<main>
<section class="glass">
<div class="dashboard">
<div class="user">
<img src="./image/20240302/photo1.png" alt="">
<h3>
Demo
</h3>
<p>Pro Member</p>
</div>
<div class="links">
<div class="link">
<img src="./image/20240302/Streams.png" alt="" />
<h2>Streams</h2>
</div>
<div class="link">
<img src="./image/20240302/Games.png" alt="" />
<h2>Games</h2>
</div>
<div class="link">
<img src="./image/20240302/news.png" alt="" />
<h2>New</h2>
</div>
<div class="link">
<img src="./image/20240302/Library.png" alt="" />
<h2>Library</h2>
</div>
</div>
<div class="pro">
<h2>Join pro for free games.</h2>
<img src="./image/20240302/show_128.png" alt="" />
</div>
</div>
<div class="games">
<div class="status">
<h1>Active Games</h1>
<input type="text" />
</div>
<div class="cards">
<div class="card">
<img src="./image/20240302/20240302_1.png" alt="" />
<div class="card-info">
<h2>惡 魔 之 魂</h2>
<p>PS5 Version</p>
<div class="progress"></div>
</div>
<h2 class="percentage">60%</h2>
</div>
<div class="card">
<img src="./image/20240302/20240302_2.png" alt="" />
<div class="card-info">
<h2>無 路 之 旅</h2>
<p>PS5 Version</p>
<div class="progress"></div>
</div>
<h2 class="percentage">60%</h2>
</div>
<div class="card">
<img src="./image/20240302/20240302_3.png" alt="" />
<div class="card-info">
<h2>麻布仔大冒險</h2>
<p>PS5 Version</p>
<div class="progress"></div>
</div>
<h2 class="percentage">60%</h2>
</div>
</div>
</div>
</section>
</main>
<div class="circle1"></div>
<div class="circle2"></div>
</body>
</html>
Css:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
h1{
color: #426696;
font-weight: 600;
font-size: 3rem;
opacity: 0.8;
}
h2,
p{
color: #658ec6;
font-weight: 500;
opacity: 0.8;
}
h3{
color: #426696;
font-weight: 600;
opacity: 0.8;
}
main {
font-family: "Poppins", sans-serif;
min-height: 100vh;
background: linear-gradient(to right top, #ffcb06, #ec9c07);
display: flex;
align-items: center;
justify-content: center;
}
.glass{
background: white;
min-height: 80vh;
width: 60%;
background: linear-gradient(
to right bottom,
rgba(255, 255, 255, 0.7),
rgba(255, 255, 255, 0.3)
);
border-radius: 2rem;
z-index: 2;
backdrop-filter: blur(2rem);
display: flex;
}
.circle1,.circle2{
background: white;
background: linear-gradient(
to right bottom,
rgba(255, 255, 255, 0.8),
rgba(255, 255, 255, 0.3)
);
height: 20rem;
width: 20rem;
position: absolute;
border-radius: 50%;
}
.circle1{
top: 5%;
right: 15%;
}
.circle2{
bottom: 5%;
left: 10%;
}
.dashboard{
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-evenly;
text-align: center;
background: linear-gradient(
to right bottom,
rgba(255, 255, 255, 0.7),
rgba(255, 255, 255, 0.3)
);
border-radius: 2rem;
}
.link{
display: flex;
margin: 2rem 0rem;
padding: 1rem 5rem;
align-items: center;
}
.link h2{
padding: 0rem 1rem;
}
.games{
flex: 2;
}
.pro{
background: linear-gradient(to right top, #ffcb06, #ec9c07);
border-radius: 2rem;
color: white;
padding: 1rem;
position: relative;
}
.pro img{
position: absolute;
top: 5%;
right: 8%;
}
.pro h2{
width: 40%;
color: white;
font-weight: 600;
}
.status{
margin-bottom: 3rem;
}
.status input{
background: linear-gradient(
to right bottom,
rgba(255, 255, 255, 0.7),
rgba(255, 255, 255, 0.3)
);
border: none;
width: 50%;
padding: 0.5rem;
border-radius: 2rem;
}
.games{
margin: 5rem;
display: flex;
flex-direction: column;
justify-content: space-evenly;
}
.card{
display: flex;
background: linear-gradient(
to left top,
rgba(255, 255, 255, 0.8),
rgba(255, 255, 255, 0.5)
);
border-radius: 1rem;
margin: 2rem 0rem;
padding: 2rem;
box-shadow: 6px 6px 20px rgba(122, 122, 122, 0.212);
justify-content: space-between;
}
.card-info{
display: flex;
flex-direction: column;
justify-content: space-between;
}
.progress{
background: linear-gradient(to right top, #ffcb06, #ec9c07);
width: 100%;
height: 25%;
border-radius: 1rem;
position: relative;
overflow: hidden;
}
.progress::after {
content: "";
width: 100%;
height: 100%;
background: rgba(236, 236, 236);
position: absolute;
left: 60%;
}
.percentage{
font-weight: bold;
background: linear-gradient(to right top, #ffcb06, #ec9c07);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
效果
*請認真填寫需求信息,我們會在24小時內與您取得聯系。