在上一篇《CSS 布局大比拼:浮動、Flex、Grid 實(shí)戰(zhàn)對比,看完就知道該用哪個!?》文章中我們主要是對常見的布局方式做了個對比,我們今天主要是通過常見的布局場景來看看Grid怎么用。
基礎(chǔ)網(wǎng)格布局
我們先來看看一個簡單的3x3網(wǎng)格,使用 fr 單位和 gap,第二列的寬度是另外兩列的兩倍(2fr vs 1fr)。中間的行高度會隨著內(nèi)容變化,而首尾行高度固定。每個項(xiàng)目(item)之間都有20px的間隙。
<style> .container { display: grid; grid-template-columns: 1fr 2fr 1fr; grid-template-rows: 80px auto 80px; gap: 20px; height: 100vh; padding: 20px; box-sizing: border-box; background-color: #f0f0f0; }
.item { background-color: #3498db; color: white; border-radius: 5px; display: flex; justify-content: center; align-items: center; font-size: 1.5rem; font-weight: bold; }
.item:nth-child(even) { background-color: #2ecc71; } </style> <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> </div>
經(jīng)典的圣杯布局
使用Grid輕松實(shí)現(xiàn)Header, Footer, Sidebar, Main Content區(qū)域,并添加簡單的響應(yīng)式。在桌面端,會看到經(jīng)典的Header、左右布局、Footer結(jié)構(gòu)。調(diào)整瀏覽器窗口寬度小于768px時(shí),布局會自動變?yōu)閱瘟卸询B,Sidebar移動到Main Content上方,非常適合移動設(shè)備瀏覽。
?
<style> body { margin: 0; padding: 0; }
.container { display: grid; grid-template-areas: "header header" "sidebar main" "footer footer"; grid-template-columns: 200px 1fr; grid-template-rows: 80px 1fr 80px; height: 100vh; gap: 10px; padding: 10px; box-sizing: border-box; } .header { grid-area: header; background-color: #ff7979; }
.sidebar { grid-area: sidebar; background-color: #7ed6df; }
.main { grid-area: main; background-color: #f6e58d; }
.footer { grid-area: footer; background-color: #badc58; }
.header, .sidebar, .main, .footer { padding: 15px; border-radius: 5px; color: #333; font-weight: bold; }
@media (max-width: 768px) { .container { grid-template-areas: "header" "sidebar" "main" "footer"; grid-template-columns: 1fr; grid-template-rows: 80px auto auto 80px; } } </style> <div class="container"> <header class="header">Header</header> <aside class="sidebar">Sidebar</aside> <main class="main">Main Content</main> <footer class="footer">Footer</footer> </div>
照片墻/瀑布流布局
使用 grid-auto-rows 和 span 關(guān)鍵字創(chuàng)建高度不一的卡片布局。一個不均勻的網(wǎng)格布局,有些卡片較高,有些較矮,形成了類似瀑布流的效果。用grid-auto-rows 設(shè)置了基礎(chǔ)行高,而 grid-row: span X 讓某些項(xiàng)目跨越多個行軌道。repeat(auto-fit, minmax(200px, 1fr)) 確保了布局是響應(yīng)式的。

<style> .container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); grid-auto-rows: 150px; gap: 15px; padding: 20px; }
.item { background-color: #9b59b6; border-radius: 8px; display: flex; justify-content: center; align-items: center; color: white; font-weight: bold; font-size: 1.2rem; }
.tall { grid-row: span 2; background-color: #e74c3c; }
.very-tall { grid-row: span 3; background-color: #34495e; }
.item:nth-child(3n) { background-color: #16a085; } .item:nth-child(5n) { background-color: #f39c12; } </style> <div class="container"> <div class="item">1</div> <div class="item tall">2 (Tall)</div> <div class="item">3</div> <div class="item very-tall">4 (Very Tall)</div> <div class="item">5</div> <div class="item tall">6 (Tall)</div> <div class="item">7</div> <div class="item">8</div> <div class="item tall">9 (Tall)</div> <div class="item">10</div> <div class="item very-tall">11 (Very Tall)</div> <div class="item">12</div> </div>
電商產(chǎn)品卡片
結(jié)合Flexbox和Grid,并使用 auto-fit 和 minmax() 實(shí)現(xiàn)完全響應(yīng)式,典型的電商產(chǎn)品列表,Grid布局 (products-grid) 負(fù)責(zé)外部的響應(yīng)式網(wǎng)格,會根據(jù)容器寬度自動調(diào)整每行顯示的產(chǎn)品數(shù)量(至少250px寬)。每個產(chǎn)品卡片的內(nèi)部則使用Flexbox進(jìn)行精細(xì)的排版,確保按鈕始終位于卡片底部。無需媒體查詢即可實(shí)現(xiàn)響應(yīng)式。
<style> body { background-color: #ecf0f1; padding: 20px; font-family: ; }
.products-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 25px; max-width: 1200px; margin: 0 auto; }
.product-card { display: flex; flex-direction: column; background-color: white; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); transition: transform 0.3s ease; }
.product-card:hover { transform: translateY(-5px); }
.product-image { height: 180px; background-color: #ddd; display: flex; align-items: center; justify-content: center; color: #777; font-size: 0.9rem; }
.product-info { padding: 20px; display: flex; flex-direction: column; flex-grow: 1; }
.product-title { margin-top: 0; color: #2c3e50; }
.product-price { color: #e74c3c; font-size: 1.2rem; font-weight: bold; margin: 10px 0; }
.product-description { color: #7f8c8d; font-size: 0.9rem; flex-grow: 1; }
.add-to-cart-btn { background-color: #3498db; color: white; border: none; padding: 10px 15px; border-radius: 5px; cursor: pointer; margin-top: 15px; font-weight: bold; transition: background-color 0.2s ease; }
.add-to-cart-btn:hover { background-color: #2980b9; } </style> <div class="products-grid"> <div class="product-card"> <div class="product-image">產(chǎn)品圖片</div> <div class="product-info"> <h3 class="product-title">優(yōu)質(zhì)產(chǎn)品名稱</h3> <p class="product-price">¥199.00</p> <p class="product-description">這是一段關(guān)于這個產(chǎn)品的精彩描述,說明它的特點(diǎn)和優(yōu)點(diǎn)。</p> <button class="add-to-cart-btn">加入購物車</button> </div> </div>
<div class="product-card"> <div class="product-image">產(chǎn)品圖片</div> <div class="product-info"> <h3 class="product-title">另一個很棒的產(chǎn)品</h3> <p class="product-price">¥259.00</p> <p class="product-description">這是另一個產(chǎn)品的描述,可能更長一些,以展示卡片高度的靈活性。</p> <button class="add-to-cart-btn">加入購物車</button> </div> </div>
<div class="product-card"> <div class="product-image">產(chǎn)品圖片</div> <div class="product-info"> <h3 class="product-title">超級產(chǎn)品三號</h3> <p class="product-price">¥99.00</p> <p class="product-description">簡潔的描述。</p> <button class="add-to-cart-btn">加入購物車</button> </div> </div>
<div class="product-card"> <div class="product-image">產(chǎn)品圖片</div> <div class="product-info"> <h3 class="product-title">旗艦產(chǎn)品</h3> <p class="product-price">¥599.00</p> <p class="product-description">這是我們最高端的產(chǎn)品,擁有所有你能想到的功能和卓越的性能表現(xiàn)。</p> <button class="add-to-cart-btn">加入購物車</button> </div> </div> </div>
使用基于線的定位,讓網(wǎng)格項(xiàng)跨越多個行列,創(chuàng)建視覺沖擊力強(qiáng)的布局,這個布局打破了整齊的網(wǎng)格,創(chuàng)建了一個視覺重心。最大的「特色文章」區(qū)塊橫跨4列2行,立即吸引用戶的注意力。其他文章區(qū)塊大小不一,交錯排列,形成了動態(tài)且有趣的雜志或新聞網(wǎng)站首頁布局。關(guān)鍵在于使用 grid-column 和 grid-row 并指定起始和結(jié)束的網(wǎng)格線來精確控制每個項(xiàng)目的位置和大小。

<style> .magazine-layout { display: grid; grid-template-columns: repeat(6, 1fr); grid-auto-rows: minmax(150px, auto); gap: 15px; max-width: 1200px; margin: 0 auto; padding: 20px; }
.featured { grid-column: 1 / 5; grid-row: 1 / 3; background-color: #e74c3c; }
.secondary { grid-column: 5 / 7; background-color: #3498db; }
.tertiary { grid-column: span 2; background-color: #2ecc71; }
.tall { grid-row: span 2; background-color: #f39c12; }
.magazine-layout > div { padding: 20px; border-radius: 8px; color: white; font-weight: bold; font-size: 1.2rem; display: flex; align-items: center; justify-content: center; } </style> <div class="magazine-layout"> <div class="featured">特色文章 (占據(jù)4x2)</div> <div class="secondary">次要文章 (占據(jù)2x1)</div> <div class="tertiary tall">文章 3 (占據(jù)2x2)</div> <div class="tertiary">文章 4 (占據(jù)2x1)</div> <div class="tertiary">文章 5 (占據(jù)2x1)</div> <div class="tertiary tall">文章 6 (占據(jù)2x2)</div> <div class="tertiary">文章 7 (占據(jù)2x1)</div> <div class="tertiary">文章 8 (占據(jù)2x1)</div> </div>
閱讀原文:https://mp.weixin.qq.com/s/Trp31UUbZzMCdb76TSkzFw
該文章在 2025/9/22 15:31:28 編輯過