跳至主要内容

25 篇文章 含有標籤「CSS」

檢視所有標籤

CSS transition 入門教學筆記 | 學習筆記

· 閱讀時間約 3 分鐘
kdchang

前言

CSS transition 屬性允許元素在狀態變化時產生平滑的動畫效果,使 UI 更加流暢和自然。這項技術通常應用於按鈕、圖片、卡片等 UI 元素的互動效果,如懸停、點擊或狀態變更。

1. transition 基礎概念

CSS transition 屬性用於定義當元素的某些 CSS 屬性發生變化時,該變化應如何逐漸呈現,而非立即改變。基本語法如下:

transition: property duration timing-function delay;
  • property:指定要應用過渡效果的 CSS 屬性。
  • duration:設定過渡動畫的時間(如 0.5s200ms)。
  • timing-function:定義動畫的速度曲線(如 easelinear)。
  • delay:動畫開始前的延遲時間(可選,默認為 0s)。

2. transition 常見應用

2.1 過渡單一屬性

.button {
background-color: blue;
color: white;
padding: 10px 20px;
border-radius: 5px;
transition: background-color 0.3s ease;
}

.button:hover {
background-color: darkblue;
}

當滑鼠懸停在 .button 上時,背景顏色將在 0.3s 內從 blue 變為 darkblue

2.2 過渡多個屬性

.card {
width: 200px;
height: 300px;
background-color: lightgray;
transform: scale(1);
transition: background-color 0.3s ease, transform 0.5s ease-in-out;
}

.card:hover {
background-color: gray;
transform: scale(1.1);
}

當滑鼠懸停時,.card 的背景顏色會變深,並且整個卡片會放大 1.1 倍。

3. transition 進階應用

3.1 transition-timing-function(動畫速度曲線)

timing-function 用於定義動畫的速度變化方式,常見的值如下:

  • linear:等速變化。
  • ease(預設值):開始與結束較慢,中間較快。
  • ease-in:開始較慢,之後加速。
  • ease-out:開始較快,最後減速。
  • ease-in-out:開始和結束都較慢。

範例:

.box {
width: 100px;
height: 100px;
background-color: red;
transition: transform 1s ease-in-out;
}

.box:hover {
transform: translateX(200px);
}

當滑鼠懸停時,.box 會平滑地向右移動 200px,並且動畫在開始和結束時較慢。

3.2 transition-delay(延遲時間)

可以設定 transition-delay 來延遲動畫的開始時間。

.box {
width: 100px;
height: 100px;
background-color: green;
transition: background-color 0.5s ease-in 1s;
}

.box:hover {
background-color: darkgreen;
}

當滑鼠懸停時,background-color 會延遲 1s 後才開始變化。

4. transition 實際應用範例

4.1 按鈕的點擊效果

.button {
padding: 12px 24px;
background-color: #ff5733;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
transition: transform 0.2s ease-out;
}

.button:active {
transform: scale(0.95);
}

當按下 .button 時,按鈕會稍微縮小,產生按壓感。

4.2 漸變顯示效果

.fade-box {
width: 100px;
height: 100px;
background-color: blue;
opacity: 0;
transition: opacity 1s ease-in-out;
}

.fade-box.show {
opacity: 1;
}

.show 類別被添加時,.fade-box 會在 1s 內逐漸顯示。

4.3 圖片放大效果

.image-container img {
width: 100px;
transition: width 0.3s ease-in-out;
}

.image-container:hover img {
width: 150px;
}

當滑鼠懸停時,圖片會平滑地放大。

5. transition vs animation

雖然 transitionanimation 都能用來製作動畫,但它們的用途不同:

  • transition:適合用於元素的狀態變更(如 hoverfocus)。
  • animation:適用於更複雜的動畫,如連續循環的動畫。

如果需要更高級的動畫,例如無限重複、按時間順序變化的動畫,則應使用 @keyframesanimation

6. 總結

CSS transition 是製作動畫效果最簡單且高效的方法之一。透過 transition,可以讓 UI 更加生動,使使用者體驗更流暢。掌握 transition 的基本語法與進階應用後,可以靈活運用於各種互動效果,如按鈕動畫、圖片過渡、淡入淡出等,讓網頁更加吸引人。

CSS 權重(Specificity)入門教學筆記 | 學習筆記

· 閱讀時間約 3 分鐘
kdchang

1. 什麼是 CSS 權重?

CSS 權重(Specificity)是指當多個選擇器同時作用於同一個元素時,瀏覽器決定應用哪條 CSS 規則的優先級機制。不同選擇器具有不同的權重,權重高的樣式會覆蓋權重低的樣式。


2. CSS 權重的計算方式

CSS 權重由四個部分組成,從高到低分別是:

  1. 行內樣式(Inline Styles)
  2. ID 選擇器(ID Selectors)
  3. 類別、偽類與屬性選擇器(Class, Pseudo-classes, Attribute Selectors)
  4. 元素與偽元素選擇器(Element, Pseudo-elements)

每種類型的選擇器都有固定的權重值,計算時以「數值」方式比較:

選擇器類型權重值
行內樣式(style=""1000
ID 選擇器(#id100
類別選擇器(.class)、偽類(:hover)、屬性選擇器([type="text"]10
元素選擇器(divp)、偽元素(::before::after1

3. 權重計算範例

3.1 元素選擇器 vs. 類別選擇器
p {
color: blue; /* 權重 1 */
}

.text {
color: red; /* 權重 10 */
}
<p class="text">這段文字應該是紅色</p>

結果: .text 的權重為 10,比 p 的權重 1 高,因此文字顯示為紅色。


3.2 類別 vs. ID 選擇器
.text {
color: red; /* 權重 10 */
}

#main {
color: green; /* 權重 100 */
}
<p id="main" class="text">這段文字應該是綠色</p>

結果: #main 的權重 100 高於 .text 的 10,因此文字顯示為綠色。


3.3 屬性選擇器與偽類
p {
color: black; /* 權重 1 */
}

p:hover {
color: blue; /* 權重 10 */
}

p[title] {
color: red; /* 權重 10 */
}
<p title="Example">這段文字會是紅色,滑鼠懸停時變藍色</p>

結果: p[title]p:hover 權重相同(10),但 p:hover 只在滑鼠懸停時生效,因此預設為紅色,懸停時變藍色。


4. 多個選擇器組合計算

當一個 CSS 規則包含多種選擇器時,其權重會累加計算。

4.1 複合選擇器
div p {
color: blue; /* 權重 2 (div=1 + p=1) */
}

div .text {
color: red; /* 權重 11 (div=1 + .text=10) */
}

#container .text {
color: green; /* 權重 110 (#container=100 + .text=10) */
}
<div id="container">
<p class="text">這段文字應該是綠色</p>
</div>

結果: #container .text 的權重 110 高於 div .text(11)和 div p(2),所以文字顯示為綠色。


4.2 !important 覆蓋權重
.text {
color: red !important;
}

#main {
color: green;
}
<p id="main" class="text">這段文字應該是紅色</p>

結果: 即使 #main 的權重較高,!important 仍然強制覆蓋樣式,使文字變紅。


5. 權重衝突的解決策略

  1. 避免使用 !important,除非是必要的
  2. 使用更具體的選擇器
  3. 組織 CSS 層級結構
  4. 使用適當的 CSS 預處理器(如 SCSS、LESS)

6. 總結

理解 CSS 權重是撰寫高效、可維護樣式表的關鍵。透過計算選擇器的權重,可以精確控制樣式的優先級,避免不必要的覆蓋問題,提升開發效率。

CSS 入門教學筆記 | 學習筆記

· 閱讀時間約 4 分鐘
kdchang

1. 什麼是 CSS?

CSS(Cascading Style Sheets,層疊樣式表)是一種用來美化 HTML 頁面的樣式語言。透過 CSS,可以設定字體、顏色、間距、佈局等,讓網頁更具吸引力和可讀性。

CSS 透過選擇器(Selectors)來指定 HTML 元素,並套用樣式規則(Rules)。


2. CSS 的使用方式

有三種方式可以在 HTML 文件中使用 CSS:

2.1 內部 CSS(Internal CSS)

將 CSS 直接寫在 HTML 的 <style> 標籤內:

<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>內部 CSS 範例</title>
<style>
body {
background-color: #f0f0f0;
font-family: Arial, sans-serif;
}
h1 {
color: #007bff;
text-align: center;
}
</style>
</head>
<body>
<h1>這是標題</h1>
<p>這是一段文字。</p>
</body>
</html>
2.2 外部 CSS(External CSS)

將 CSS 放入獨立的 .css 檔案,並透過 <link> 引入:

styles.css

body {
background-color: #f0f0f0;
font-family: Arial, sans-serif;
}

h1 {
color: #007bff;
text-align: center;
}

HTML 文件:

<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>外部 CSS 範例</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>這是標題</h1>
<p>這是一段文字。</p>
</body>
</html>
2.3 行內 CSS(Inline CSS)

直接在 HTML 標籤內使用 style 屬性:

<h1 style="color: red; text-align: center;">這是紅色標題</h1>

行內 CSS 只能用於單一元素,不利於維護,因此不建議大量使用。


3. CSS 選擇器(Selectors)

選擇器用於選取 HTML 元素並套用樣式,常見的選擇器有:

3.1 元素選擇器(Element Selector)

直接指定 HTML 標籤:

p {
color: blue;
font-size: 16px;
}
3.2 類別選擇器(Class Selector)

使用 . 選擇類別,適用於多個元素:

.important-text {
color: red;
font-weight: bold;
}

對應的 HTML:

<p class="important-text">這是一段重要的文字。</p>
3.3 ID 選擇器(ID Selector)

使用 # 選擇 ID,適用於單一元素:

#main-title {
font-size: 24px;
color: green;
}

對應的 HTML:

<h1 id="main-title">這是主標題</h1>
3.4 群組選擇器(Group Selector)

同時選取多個元素:

h1, h2, p {
font-family: Arial, sans-serif;
}
3.5 後代選擇器(Descendant Selector)

選取某個元素內的特定元素:

div p {
color: gray;
}

對應的 HTML:

<div>
<p>這段文字會變成灰色。</p>
</div>

4. 盒模型(Box Model)

CSS 中的所有元素都遵循盒模型(Box Model),包含以下部分:

  • Content(內容):元素內部的內容,如文字或圖片。
  • Padding(內邊距):內容與邊框之間的距離。
  • Border(邊框):元素的邊界。
  • Margin(外邊距):元素與其他元素之間的距離。

範例:

.box {
width: 200px;
height: 100px;
padding: 10px;
border: 2px solid black;
margin: 20px;
background-color: lightblue;
}

對應的 HTML:

<div class="box">這是一個盒子</div>

注意:box-sizing 屬性: content-box(預設)、border-box(寬高合計包含 padding 和 border)


5. 常見的 CSS 屬性

5.1 文字樣式
p {
font-size: 18px;
color: #333;
text-align: center;
line-height: 1.5;
}
5.2 背景樣式
body {
background-color: #f8f9fa;
background-image: url("background.jpg");
background-size: cover;
}
5.3 邊框與圓角
.box {
border: 2px solid #000;
border-radius: 10px;
}
5.4 Flexbox 佈局
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}

對應的 HTML:

<div class="container">
<div class="box">置中內容</div>
</div>

6. 響應式設計(Responsive Design)

使用 @media 來適應不同裝置:

@media (max-width: 600px) {
body {
background-color: lightgray;
}
}

當螢幕寬度小於 600px 時,背景變為淺灰色。


7. 總結

本篇筆記介紹了 CSS 的基本概念,包括選擇器、樣式屬性、盒模型與佈局技巧。熟練 CSS 之後,可以進一步學習 Flexbox、Grid、動畫(Animation)等進階技術,並與 JavaScript 結合,打造互動性更高的網頁。實際練習與製作小型專案是學習 CSS 的最佳方式。

CSS Stacking Context 入門教學筆記 | 學習筆記

· 閱讀時間約 4 分鐘
kdchang

前言

在網頁開發中,當多個 HTML 元素重疊時,決定它們顯示順序的機制稱為 Stacking Context(堆疊上下文)。這是一個重要概念,影響 z-index 的行為,並決定元素在畫面上的排列順序。


1. 什麼是 Stacking Context

Stacking Context 是一個獨立的層級空間,內部的元素會依照特定規則進行排序,但不會影響外部的層級。當一個元素建立了 Stacking Context,裡面的元素只會與其內部其他元素比較 z-index,而不會與外部的 z-index 直接互動。


2. Stacking Context 的建立方式

某些 CSS 屬性和條件會觸發 Stacking Context 的建立,以下是常見的觸發方式:

2.1 根元素 (<html>)

HTML 的根元素 (<html>) 本身是一個 Stacking Context,所有的元素都在這個上下文中運作。

2.2 z-indexauto 並且 positionrelativeabsolutefixed

positionrelativeabsolutefixed,且 z-index 設定為非 auto 時,該元素會創建新的 Stacking Context。

.parent {
position: relative;
z-index: 10; /* 創建 Stacking Context */
}

2.3 opacity 小於 1

任何 opacity 設定小於 1(但大於 0)的元素都會建立新的 Stacking Context。

.transparent-box {
opacity: 0.9; /* 創建 Stacking Context */
}

2.4 transformfilterclip-pathperspective 不為 none

只要元素應用了 transform(例如 scalerotate)、filterclip-path,它就會建立新的 Stacking Context。

.transformed-box {
transform: translateX(50px); /* 創建 Stacking Context */
}

2.5 will-change 設定特定值

如果 will-change 被設定為 transformopacityfilter 這類的屬性,該元素會創建新的 Stacking Context。

.optimized-box {
will-change: transform; /* 創建 Stacking Context */
}

3. Stacking Context 的影響

3.1 z-index 影響範圍

如果某個元素在新的 Stacking Context 中,即使它的 z-index 設定得很高,也不會超過它所在的 Stacking Context。這意味著:

  • 內部 z-index 的值 只在該 Stacking Context 內比較
  • 外部的元素如果 z-index 更高,仍然可能覆蓋內部 Stacking Context 內的元素。

範例:z-index 失效的情境

<div class="parent">
<div class="child"></div>
</div>
<div class="outside"></div>
.parent {
position: relative;
z-index: 10; /* 創建 Stacking Context */
}

.child {
position: absolute;
z-index: 9999; /* 只在 .parent 內生效 */
background: red;
width: 100px;
height: 100px;
}

.outside {
position: absolute;
z-index: 20;
background: blue;
width: 100px;
height: 100px;
top: 50px;
left: 50px;
}

結果:

  • .childz-index: 9999 只在 .parent 內生效。
  • .outsidez-index: 20 屬於 html 根 Stacking Context,所以 .outside 會蓋住 .child

4. 如何 Debug Stacking Context

z-index 沒有如預期運作時,可以用以下方式檢查:

4.1 使用開發者工具

  • Chrome 開發者工具(F12)內,檢查 z-index 的層級。
  • 在「Elements」面板檢查 z-index 及是否有 opacitytransform 等影響屬性。

4.2 確保 Stacking Context

如果發現 z-index 設定沒有影響,可以:

  1. 確認父元素是否創建了新的 Stacking Context。
  2. 嘗試移除 transformopacityfilter,看看是否影響 z-index

5. Stacking Context 的應用場景

5.1 固定導覽列與內容遮罩

position: fixed 的導覽列無法覆蓋其他元素時,可以確保它擁有較高 z-index,並避免它被無意創建的 Stacking Context 影響。

.navbar {
position: fixed;
top: 0;
width: 100%;
background: black;
color: white;
z-index: 1000;
}

5.2 Modal(模態視窗)

確保 modalz-index 高於其他元素,並避免 opacitytransform 影響 z-index

.modal {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 2000;
background: white;
padding: 20px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
}

6. 總結

  • Stacking Context 影響 z-index 的作用範圍,讓 z-index 不總是依照數值大小決定順序。
  • 多種 CSS 屬性(如 opacitytransform)會創建 Stacking Context,可能影響層級渲染結果。
  • 在開發時,應注意哪些元素創建了 Stacking Context,以確保 z-index 如預期運作

透過以上概念與技巧,可以更靈活地管理 HTML 元素的層級關係,確保視覺效果正確。

CSS transform 入門教學筆記 | 學習筆記

· 閱讀時間約 3 分鐘
kdchang

前言

CSS transform 屬性是一個強大的工具,可以用來對 HTML 元素進行旋轉、縮放、移動及傾斜等變換,而不會影響其他元素的佈局。這使得 transform 非常適合用來建立動畫效果、視覺調整以及 UI 微調。

1. transform 基礎概念

transform 屬性可以接受一個或多個變換函數,使元素在不影響文檔流的情況下進行變換。這些變換主要包含:

  • 平移 (translate)
  • 縮放 (scale)
  • 旋轉 (rotate)
  • 傾斜 (skew)
  • 矩陣變換 (matrix)

2. transform 常見屬性

2.1 平移 (translate)

translate(x, y) 用於移動元素的 X 軸與 Y 軸位置。

.box {
transform: translate(50px, 100px);
}

此範例將 .box 元素向右移動 50px,向下移動 100px。

單軸平移

  • translateX(50px):僅在 X 軸移動 50px。
  • translateY(100px):僅在 Y 軸移動 100px。

2.2 縮放 (scale)

scale(x, y) 用於縮放元素。

.box {
transform: scale(1.5, 0.5);
}

此範例將 .box 元素的寬度放大 1.5 倍,高度縮小為原來的一半。

單軸縮放

  • scaleX(2):寬度變為 2 倍。
  • scaleY(0.5):高度變為 0.5 倍。

2.3 旋轉 (rotate)

rotate(angle) 用於旋轉元素。

.box {
transform: rotate(45deg);
}

此範例將 .box 元素順時針旋轉 45 度。

2.4 傾斜 (skew)

skew(x-angle, y-angle) 用於使元素傾斜。

.box {
transform: skew(30deg, 10deg);
}

此範例將 .box 在 X 軸方向傾斜 30 度,在 Y 軸方向傾斜 10 度。

單軸傾斜

  • skewX(15deg):僅在 X 軸傾斜 15 度。
  • skewY(25deg):僅在 Y 軸傾斜 25 度。

2.5 矩陣變換 (matrix)

matrix(a, b, c, d, e, f) 是一個綜合性變換函數,允許透過 6 個參數來同時應用縮放、旋轉、傾斜與位移。

.box {
transform: matrix(1, 0.5, 0.5, 1, 50, 100);
}

這樣的矩陣表示:

  • 1:X 軸縮放。
  • 0.5:X 軸傾斜。
  • 0.5:Y 軸傾斜。
  • 1:Y 軸縮放。
  • 50:X 軸位移。
  • 100:Y 軸位移。

3. transform 的應用範例

3.1 建立簡單的 hover 效果

利用 transform,可以輕鬆製作滑鼠懸停的動畫效果,例如按鈕放大效果:

.button {
display: inline-block;
padding: 10px 20px;
background-color: #3498db;
color: white;
text-align: center;
border-radius: 5px;
transition: transform 0.3s ease-in-out;
}

.button:hover {
transform: scale(1.1);
}

3.2 圖片翻轉效果

使用 rotateY(180deg) 來製作翻轉效果,常用於卡片翻轉動畫。

.card {
width: 200px;
height: 300px;
background-color: lightgray;
transform: rotateY(0deg);
transition: transform 0.5s;
}

.card:hover {
transform: rotateY(180deg);
}

3.3 旋轉動畫

結合 @keyframestransform,可以製作無限旋轉動畫。

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

.spinner {
width: 50px;
height: 50px;
border-radius: 50%;
background-color: red;
animation: spin 2s linear infinite;
}

4. transform-origin 的應用

transform-origin 屬性用於指定變換的基準點,預設值為 50% 50%(元素中心)。

.box {
transform-origin: top left;
transform: rotate(45deg);
}

此範例中,元素將以左上角為旋轉點,而非默認的中心點。

5. perspective 與 3D 變換

當使用 3D 變換(如 rotateXrotateY)時,可使用 perspective 來模擬景深效果。

.container {
perspective: 500px;
}

.box {
transform: rotateY(45deg);
}

此範例讓 .box 具有 3D 透視效果,使其看起來更真實。

6. 總結

CSS transform 是一個靈活且強大的屬性,可以用來製作動畫、視覺調整及增強 UI 體驗。透過 translatescalerotateskew 等函數,你可以輕鬆地操控元素的外觀,讓你的網頁更具吸引力。