一磚一瓦:協助我們建構 CSS Masonry

Patrick Brosset
Patrick Brosset
Alison Maher
Alison Maher

發布日期:2025 年 7 月 23 日

Microsoft Edge 和 Google Chrome 團隊很高興宣布,從 Chrome 和 Edge 140 版開始,CSS 砌體已準備好供開發人員進行早期測試。

由於 CSS 磚砌規格和語法仍有未解決的問題,您的意見回饋對我們至關重要,有助於確定 API 的最終形式。歡迎試用這項功能並分享心得。

立即在 Chromium 中測試 CSS 磚塊式版面配置

如要立即測試 CSS 格狀配置:

  1. 使用 Chrome 或 Edge 140 以上版本 (或其他 Chromium 架構瀏覽器,且版本相符)。
  2. 在新分頁中前往 about:flags
  3. 搜尋「CSS Masonry Layout」。
  4. 啟用這項旗標。
  5. 重新啟動瀏覽器。
實驗頁面上的 Masonry 項目。

啟用這項功能後,您可以查看 Microsoft Edge 示範 (查看示範來源程式碼),瞭解實際運作情形,也可以繼續閱讀,進一步瞭解這項功能和可用的語法。

什麼是磚塊排列?

CSS 砌體是一種版面配置模式,可讓您以類似磚塊的方式排列項目,這類排列方式不容易透過 CSS 格線、Flexbox 或多欄版面配置達成。

CSS 砌磚可將項目排列成欄或列格式,並以摺疊方式將項目放置在這些欄或列中。

以格狀版面配置排列的項目。

你可以將磚塊排列方式視為高速公路,唯一的限制是不同車道的數量和大小。車輛可以在車道內任意行駛,並盡量靠近目的地 (即格狀配置的起點)。

示範:車輛在車道中排隊,展示版面配置。

版面配置項目只會在一個方向受到限制,且可沿著另一個方向自由移動,不受附近其他項目的影響。與格線不同的是,砌磚的軌道只會在一個方向定義。

在格狀配置中,項目的視覺順序不如最終設計重要。無論項目為何,都能充分利用可用空間。 因此,對於視覺效果豐富的頁面,以及內容的視覺順序不如最終結果重要的頁面,這都是絕佳選擇。

砌石布局有趣的地方在於,它也允許項目跨越多個軌道,就像格線一樣。發生這種情況時,項目會繼續放置,盡可能填滿可用空間。

這次的車輛圖片是大型車輛,橫跨兩欄。

這種自動放置行為可能會產生非常有趣的結果,這也是網頁設計師長期以來努力實現的目標。如需範例,請參閱紐約市相片集,瞭解如何以精簡方式在多個資料欄中顯示相片,同時允許特定項目 (本例中的標題) 跨越多個資料欄:

標題橫跨欄位的圖片庫。

以下列舉幾個其他使用範例。

網誌版面配置,顯示每篇文章的縮圖和說明。

新聞網站,使用砌磚式版面配置顯示文章資訊卡。
按這裡查看網誌範例

新聞網站,文章以欄顯示,部分文章比其他文章寬,主頁橫幅圖片則會跨越整個頁面寬度。

新聞網站,部分文章會跨欄。
按這裡查看新聞網站的示範

相片集,其中某些相片跨越多個資料欄,且資料欄大小不一。

攝影網站的方格布局。
按這裡觀看自然示範

解決方法和限制

如要在網路上實作這項設計模式,目前必須使用 JavaScript 程式庫,或是採用 CSS 格線、Flexbox 或多欄的解決方法。不過,這麼做可能會產生負面影響,包括:

  • 效能較差:如果依賴 JavaScript 程式庫或自訂程式碼來模擬 CSS 磚塊,效能就會受到影響,進而導致負面使用者體驗。
  • 程式碼複雜度較高
    • 在 CSS 格線、Flexbox 或多欄中,要確保項目位置正確且空間分配得宜,以模擬 CSS 砌磚版面配置,並不容易達成。
    • 處理特定功能 (例如跨越多個欄或列的項目、項目的自訂排序方式,或調整為符合可視區域) 也可能導致複雜度和限制。
  • 維護負擔較重:複雜的自訂 CSS 或 JavaScript 程式碼較難維護。

CSS 格線是一種非常靈活的版面配置模式,可讓您建立許多不同樣式的版面配置,無論是整個網頁、元件,還是只是要對齊個別項目,都非常實用。不過,這項功能與砌磚式版面配置的特性不同。

在 CSS 格線中,列和欄會嚴格定義,項目只能存在於格線儲存格內。如果嘗試沿著其中一個軸向包裝項目,但項目大小不符合各自的儲存格,您必須選擇在項目之間留有間隙,或將項目延展至填滿空白空間。

格線會將項目放在固定軌道中。

與磚塊排列方式一樣,彈性盒模型只會考量一個方向,並讓項目決定沿著另一個方向要佔用的空間。也就是說,只要您願意讓項目一次一個資料欄地以區塊方向配置,就能使用 Flexbox 取得類似砌磚布局的版面配置。Flex 容器也需要定義的區塊大小或高度,才能讓項目換行至新的 Flex 行,進而建立新的資料欄。

Flex 版面配置會依資料欄排序項目。

多欄也可以建立類似砌磚的版面配置,同樣是將項目排列在欄中。此外,多欄版面配置也不允許您調整各欄的大小。這些項目大小相同,但砌石格線在定義項目封裝的軌道時,提供許多彈性。

請注意,這裡的重點並非格線、彈性盒或多欄是比砌磚更差的版面配置,這類版面配置非常實用,重點是:如果您想要的是磚塊式版面配置,CSS 磚塊式版面配置就能滿足您的需求。

CSS 磚塊配置的狀態

CSS 工作群組正在 CSS Grid Level 3 規格中草擬 masonry。這項規格仍在建構中,暫時包含兩種不同的建議語法。第一個範例使用 display 屬性的新關鍵字,第二個範例則直接將砌磚整合至 CSS 格線版面配置。

使用 display: masonry

這個語法會將 CSS 磚塊排列視為獨立的 display 類型。如要進一步瞭解這個方法及其動機,請參閱 Google Chrome 團隊的網誌文章「需要意見回饋:我們應如何定義 CSS 磚塊排列?」,以及本文的其餘部分。Chromium 中的現有原型就是以這項提案為基礎。

display: grid; grid-template-*: masonry;

在這個語法中,CSS 磚塊直接整合到 CSS 格線。如要觸發砌石模式,請將 masonry 關鍵字套用至以列為基礎的砌石版面配置中的 grid-template-columns 定義,或是以欄為基礎的砌石版面配置中的 grid-template-rows 定義。

如要進一步瞭解這項提案和動機,請參閱 WebKit 貼文「Help us choose the final syntax for Masonry in CSS」。

請注意,這項提案的替代方案是 item-pack 屬性collapse 關鍵字,這會觸發 CSS 砌體,而不是使用其中一個格線範本屬性。

自 Chrome 和 WebKit 團隊發布貼文以來,CSSWG 持續討論整體語法,以利後續進展。您的意見回饋有助於這些論壇的後續發展。

如要進一步瞭解目前討論的狀態,請參閱問題 11593,其中列出目前討論的砌磚語法主題,以及問題 11243,其中彙整了目前語法爭議的內容。

建立自己的 CSS 磚塊版面配置

讓我們來輕鬆一下,建立 CSS 磚塊式版面配置。

雖然 CSS 砌體語法仍在討論中,但您今天可以在 Chromium 中測試這項功能,方法是啟用「CSS Masonry Layout」旗標,詳情請參閱「立即測試 CSS 砌體」。下列範例說明開發人員試用版提供的功能。

建立磚塊容器

如要建立第一個以欄為基礎的格狀容器,請使用 display:masonry,並使用 grid-template-columns 定義欄大小。由於 masonry-direction 預設為 column,因此您可以選擇是否要設定這項屬性。

.masonry {
  display: masonry;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 10px;
}
所有欄位大小相同的磚塊式版面配置。
按這裡查看相同大小的資料欄示範

如要改用以列為單位的格狀容器,請使用 display:masonry,並使用 grid-template-rows 定義列大小,然後設定 masonry-direction:row

.masonry {
 display: masonry;
 masonry-direction: row;
 grid-template-rows: repeat(auto-fit, minmax(160px, 1fr));
 gap: 10px;
}
所有列大小相同的磚塊版面配置。
按這裡查看相同大小的列示範

如您所見,這個語法與 Google 的原始提案略有不同。無論使用哪種觸發條件,CSS 工作群組都已決定在 CSS Masonry 版面配置中重複使用格線範本大小和放置屬性

雖然這樣做可讓版面配置類型之間重複使用更多屬性,但您可能會覺得混淆,歡迎就此主題提供意見。我們可能會為 grid-template-columnsgrid-template-rows 等屬性建立更多一般別名,例如 template-columnstemplate-rows,可用於格線和砌磚。

使用預設軌道大小

新的顯示類型可讓您重新思考資源預設值。

在格狀空間中,grid-template-columnsgrid-template-rows 預設為 none,目前定義通常會產生單一欄或列。如果是磚塊式版面配置,這個預設值通常會導致不理想的版面配置。

Chromium 的實作項目會為 none 新增建議定義,取代 CSS 砌體中的預設軌道大小。這個新的預設軌道大小為 repeat(auto-fill, auto) 值。這個值會建立美觀的磚塊式版面配置,完全不必定義軌道大小:

.masonry {
  display: masonry;
  gap: 10px;
}
自動調整欄寬的格狀配置。
在此查看預設軌道大小的示範

如圖片所示,格狀容器會建立盡可能多的自動調整大小的欄,以填滿可用空間。

使用 CSS 格線時,所有項目都會在軌道調整大小前放置,這表示無法進行這項軌道自動調整大小定義。不過,使用 CSS 磚塊時,由於放置位置和大小會交織在一起並簡化,因此不再適用這項限制。解除這項限制後,我們就能為格狀配置提供更有用的軌道預設大小。

嘗試使用 masonry 簡寫屬性

如先前所述,Chromium 目前的實作方式是依據 grid-template-* 屬性,在版面配置中定義砌石軌。不過,由於 Masonry 只有一個維度,我們也實作了 masonry 簡寫屬性,您可以使用這個屬性一次定義 Masonry 方向和軌跡定義,不必使用令人困惑的 grid- 前置字元屬性。

舉例來說,下列兩個程式碼片段會建立等效的 CSS 磚塊容器。

.masonry {
 display: masonry;
 masonry: "a a b" 50px 100px 200px row;
}

.masonry {
  display: masonry;
  masonry-direction: row;
  grid-template-rows: 50px 100px 200px;
  grid-template-areas: "a" "a" "b"
}
三列漸大的方格配置。
在此查看格狀捷徑示範

CSS 工作群組仍在討論 masonry 簡寫。歡迎立即試用,並與我們分享你的想法。

使用自訂軌道大小

在定義軌道大小方面,砌磚與格線一樣靈活,可讓您微調版面配置軌道的數量和大小。此外,砌磚軌道不一定要大小相同,例如:

.masonry {
 display: masonry;
 masonry: repeat(2, 3rem) repeat(auto-fit, 5rem) 12rem;
}
具有各種不同軌道大小的格狀版面配置。
在此查看自訂軌道大小的示範

在這個範例中,我們定義了兩個前 3rem 軌,後面接著數量不一的 5rem 軌,最後是單一 12rem 軌。

橫跨多個測試群組

在砌磚模式中,項目不一定要限制在所放置的軌道中,因為項目可以視需要跨越多個軌道。如果某些項目比其他項目更重要,需要更多空間,這項功能就非常實用。

例如:

.masonry {
  display: masonry;
  masonry: repeat(auto-fill, minmax(12rem, 1fr));
}

.important-item {
  grid-column: span 2;
}
項目跨越多個軌道的 Masonry 版面配置。
在此觀看跨多個軌道的示範

您也可以使用這項功能跨越多個軌道,讓特定項目佔滿整個容器的長度:

.masonry {
 display: masonry;
 masonry: repeat(auto-fill, minmax(12rem, 1fr));
}

.full-bleed {
 grid-column: 1 / -1;
}

新聞網站的示範內容會使用這個元素,在文章中顯示訂閱廣告。

新聞網站版面配置,橫幅涵蓋整個區域。

微調磚塊項目放置位置

在 CSS Masonry 中,項目會放置在執行位置最短的欄或列中。

假設有兩欄的磚塊容器,如果容器的第一欄有 110 像素高的項目,第二欄有 100 像素高的項目,第三個項目就會放在第二欄,並更靠近砌磚方向的開頭 10 像素。

兩欄的砌磚版面配置。

如果您認為執行位置的 10 像素差異對您的情況來說夠小,且偏好將第三個項目放在第一欄,以便更符合來源順序,請使用 item-tolerance 屬性。

新的 item-tolerance 屬性可控制項目放置位置的感應度。

在上述範例中,您可以將 item-tolerance: 10px; 套用至容器,自訂項目放置位置的變異性:

.masonry {
  display: masonry;
  masonry: 200px 200px;
  gap: 10px;
  item-tolerance: 10px;
}
兩欄的砌磚式版面配置。
按這裡查看項目容差示範

請注意,草案規格將這項屬性稱為 item-slack。CSS 工作群組最近決定改用「item-tolerance」做為名稱,規格很快就會更新。

其他可用屬性

您可以使用與 CSS 格線相同的範本大小和放置屬性,在砌磚容器的格線軸中調整項目大小和放置項目,例如 grid-rowgrid-columngrid-areagrid-template-areasorder。建立砌塊格線版面配置時,充分發揮 CSS 格線的強大功能。

徵求意見回饋

我們迫不及待想讓您探索 CSS 砌磚版面配置,發揮創意,並瞭解這項新功能可協助您解鎖哪些新功能。如要開始使用,建議您查看我們的範例及其原始碼,然後在 Chromium 中建立自己的範例 (請記得先啟用標記)。

您的意見回饋非常重要,可協助我們建構 API,並確認 API 的設計符合您的網路需求。歡迎試用,並分享你的想法!

如對 API 的形狀有任何想法或意見回饋,歡迎在問題 11243 中留言。如果想在自己的網誌或社群媒體上發文,請務必在 XLinkedIn 上通知我們。

Chromium 仍在實作 CSS 砌體。如果您確實要測試,請注意我們仍在積極開發這項功能,因此可能會遇到無法正常運作的情況。目前的限制包括密集封裝、反向放置、子格線支援、超出流程的支援、基準線支援、開發人員工具支援、片段支援、間距裝飾支援等。

如果在測試這項功能時發現錯誤,請開啟新的 Chromium 錯誤,分享你的意見。