用 CSS 實現元件響應式布局:@container 解析
@container 是什麼?
以往我們經常使用 @media 依據「整個視窗的大小」來調整版面。 但隨著元件化設計盛行,我們開始需要「依照容器大小」來做響應式的調整。
這時 @container 的出現,它可以根據某個容器的大小、條件,動態的調整內部元素樣式,從而實現真正模組化、可覆用的設計系統。
基本運作原理
- 先將某個元素定義為「容器」(container) → 使用
container-type啟用監聽 - 透過
@container根據容器的大小變化來套用不同的樣式 - 查詢只會影響該容器的後代元素
@container 的影響範圍 = 「擁有 container-type 的元素」的內部世界
容器和內容的層級關係
用以下範例來說明容器與被查詢內容的結構關係:
<div class="section">
<div class="card-grid">
<div class="card">A</div>
<div class="card">B</div>
<div class="card">C</div>
</div>
</div>
.card-grid {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
container-type: inline-size;
container-name: gridArea;
}
/* 容器寬度小於 400px,調整卡片樣式 */
@container gridArea (max-width: 400px) {
.card {
font-size: 14px;
}
}
層級示意圖
<body>
└── <div class="section"> ← 普通區塊 (非容器)
└── <div class="card-grid"> ← ✅ 容器 (container-type)
├── <div class="card">A</div> ← 被查詢元素
├── <div class="card">B</div>
└── <div class="card">C</div>
查詢生效條件:
.card-grid定義了container-type: inline-size.card是.card-grid的後代 → 可以被@container影響- 若
.card不在.card-grid裡,就不會被查詢到
命名容器與最近容器優先原則
容器查詢會依循「最近容器優先原則」,也就是元素會優先監聽最近一層具有 container-type 的父層。
若畫面中有多個容器、或巢狀結構複雜時候,則可以透過 container-name 來明確的指定監聽對象。 這讓每個模組的樣式更加獨立,避免被外層布局所影響,行為也更可以預期。
容器查詢不會跨界
容器查詢與 @media 最大的差別是在作用範圍:
| @media | @container | |
| 對象 | 視窗大小 | 容器大小 |
| 作用範圍 | 全域 | 區域 (容器內部) |
| 套用元素 | 所有示素 | 容器的後代元素 |
| 巢狀支援 | 無限制 | 依層級生效 |
換句話說:
容器查詢是「局部版的 media query」,讓元素能根據所在的區域依照設定調整,不再是依賴整個畫面大小。
結語
容器查詢的出現,讓 CSS 終於進入「組件自適應」的時代。以前我們只能針對整個螢幕寫 media query,現在每個區塊都能依自己的寬度、內容比例或者是用途靈活的調整。 善用容器查詢的層級邏輯和命名方式,不只可以讓設計更有彈性,也讓前端模組更好的維護、更容易覆用。
Gleezy:sk3826 台灣旅遊必備放鬆 純台正妹推薦 外約高檔美女 在校學生妹18-22歲 小隻馬高中生 纖細美腿 嫵媚性感 艶麗火辣美女 國際模特 華航空姐 外約護士 約旅館 一律現金支付 TG搜sk38266官網www.ppp8669.com活動買二送二 買三送一
