跟著 5 種置中技巧進行一系列測試,看看哪種技巧最能適應變化。
在 CSS 中置中是出了名的難題,充滿笑話和嘲諷。2020 年 CSS 已經成熟,現在我們可以誠實地笑著那些笑話,而不是咬牙切齒。
如果您比較喜歡看影片,可以觀看這篇貼文的 YouTube 版本:
難題
置中方式有幾種。包括不同的用途、要置中的項目數量等。為了說明「勝出」置中技術背後的原理,我建立了 Resilience Ringer。這是一系列壓力測試,可平衡每種置中策略,並觀察其成效。最後,我會揭曉得分最高的技巧,以及「最有價值」的技巧。希望您能學到新的置中技巧和解決方案。
韌性響鈴
Resilience Ringer 代表我的信念,即置中策略應能彈性因應國際版面配置、可變大小的可視區域、文字編輯和動態內容。這些原則有助於制定下列彈性測試,確保置中技術能經得起考驗:
- 擠壓:置中功能應能處理寬度變更
- Squashed:置中功能應能處理高度變更
- 重複:置中應根據項目數量動態調整
- 編輯: 置中應根據內容長度和語言動態調整
- Flow:置中應與文件方向和書寫模式無關
勝出的解決方案應展現其彈性,在內容被擠壓、壓縮、複製、編輯及切換至各種語言模式和方向時,仍能保持在中心位置。值得信賴且具備韌性的安全中心。
圖例
我提供了一些視覺色彩提示,協助您在情境中保留一些中繼資訊:
- 粉紅色邊框表示置中樣式的所有權
- 灰色方塊是容器的背景,容器會將項目置中
- 每個子項都有白色背景顏色,因此您可以查看置中技術對子項方塊大小的任何影響 (如有)
5 位參賽者
5 種定心技巧進入韌性擂台,只有一種能獲得韌性皇冠 👸。
1. 內容中心
- Squish:太好了!
- Squash:太好了!
- 重複:太棒了!
- 編輯:太棒了!
- Flow:太棒了!
display: grid 和 place-content 簡寫的簡潔性很難超越。由於它會將子項集中置中並對齊,因此對於要閱讀的元素群組來說,這是一種可靠的置中技術。
.content-center {
display: grid;
place-content: center;
gap: 1ch;
}
- 即使空間受限且溢位,內容仍會置中
- 集中編輯和維護
- 間隔可確保 n 個子項之間的間距相等
- 格狀版面配置預設會建立資料列
- 最寬的子項 (
max-content) 會設定其餘所有子項的寬度。我們會在「Gentle Flex」一節中進一步討論。
適合包含段落和標題的巨集版面配置、原型,或通常需要清晰置中的內容。
2. Gentle Flex
- Squish:太好了!
- Squash:太好了!
- 複製:太棒了!
- 編輯:太好了!
- Flow:太好了!
「溫和彈性」是更純粹的「僅限置中」策略。這種效果柔和溫和,因為與 place-content: center 不同,置中時不會變更任何子項的方塊大小。所有項目都會盡可能輕柔地堆疊、置中及排列。
.gentle-flex {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1ch;
}
- 僅處理對齊、方向和分布
- 集中編輯和維護
- 間隔可確保 n 個子項之間的間距相等
- 程式碼行數最多
適合巨觀和微觀版面配置。
3. Autobot
- Squish:極佳
- Squash:極佳
- 重複:罰款
- 編輯:太棒了
- Flow:極佳
容器設為 Flex,沒有對齊樣式,而直接子項則設為自動邊界樣式。margin: auto在元素的所有面上工作,有種懷舊又美妙的感覺。
.autobot {
display: flex;
}
.autobot > * {
margin: auto;
}
- 趣味技巧
- 快速簡便
- 溢位時結果不自然
- 依賴分布而非間距,表示版面配置可能會出現子項接觸側邊的情況
- 「推」到定位似乎不是最佳做法,而且可能會導致子項方塊大小變更
適合將圖示或虛擬元素置中。
4. Fluffy Center
- Squish:不佳
- Squash:不佳
- 重複:不佳
- 編輯:太好了!
- Flow:太好了!(只要使用邏輯屬性)
「fluffy center」是目前最吸引人的置中技術,也是唯一完全由元素/子項擁有的置中技術。看到我們單獨的內側粉紅色邊框了嗎?
.fluffy-center {
padding: 10ch;
}
- 保護內容
- 核能
- 每項測試都暗藏這項置中策略
- 字詞間距
- 覺得自己沒用
- 容器和項目之間會發生衝突,因為兩者都對大小有嚴格要求
適合以字詞或詞組為中心的置中、標記、藥丸、按鈕、方塊等。
5. Pop & Plop
- Squish:好
- Squash:好
- 重複:不佳
- 編輯:罰款
- 流量:正常
這會「彈出」,因為絕對定位會將元素從一般流程中彈出。名稱中的「plop」一詞,來自於我認為最實用的功能:將它放在其他東西上。這是一種經典且實用的疊加層置中技術,可根據內容大小彈性調整。有時您只需要將 UI 疊在其他 UI 上。
- 實用
- 穩定可靠
- 在需要時,這項功能非常實用
- 負百分比值的程式碼
- 需要
position: relative才能強制建立包含區塊 - 過早和突兀的換行
- 每個包含區塊只能有 1 個,不需額外設定
適合:互動視窗、浮動式訊息和訊息、堆疊和深度效果、彈出式視窗。
獲勝者
如果我身在孤島,只能使用一種置中技巧,我會選擇…
[鼓聲]
Gentle Flex 🎉
.gentle-flex {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1ch;
}
我的樣式表一律會使用這個屬性,因為它對巨集和微版面配置都很有用。這項解決方案在各方面都相當可靠,結果也符合我的預期。此外,由於我是內建大小調整功能的愛好者,因此我傾向於採用這項解決方案。雖然要輸入的內容很多,但其帶來的好處遠超過額外的程式碼。
最小可行性產品 (MVP)
Fluffy Center
.fluffy-center {
padding: 2ch;
}
Fluffy Center 技巧非常細微,很容易被忽略,但這是我置中策略的主力。這項功能非常精細,有時我甚至會忘記自己正在使用。
結論
哪些因素會破壞置中策略?韌性考驗還能加入哪些挑戰?我考慮過平移和容器的自動高度切換…還有什麼!?
現在你知道我是怎麼做的了,你會怎麼做呢?讓我們多元化做法,並瞭解在網路上建構的所有方式。請按照這篇文章中的程式碼實驗室,建立自己的置中範例,就像這篇文章中的範例一樣。在 X 上分享您的版本,我會將其新增至下方的「社群混音」部分。