CSS Grid Layout Toàn Tập Dễ Hiểu: Từ Cơ Bản Đến Nâng Cao

Nhớ lại cái thời dựng layout bằng float, position mà muốn khóc thét không? Căn giữa một cái div thôi cũng đủ thứ “hack”, rồi thì clear fix lằng nhằng. May sao CSS Grid Layout ra đời như một vị cứu tinh, giải quyết dứt điểm mớ bòng bong đó. Đây là một module layout 2 chiều thực thụ, giúp bạn dễ dàng tạo ra những bố cục phức tạp mà trước đây tưởng chừng như không thể. Quên đi những ngày tháng khổ sở, giờ đây dựng layout web vừa nhanh, vừa chuẩn, lại còn rất “sướng”. Cùng Phạm Hải bóc tách công cụ tuyệt vời này nhé!

Vậy CSS Grid Layout là gì mà “thần thánh” thế?

Trực tiếp vào vấn đề: CSS Grid Layout là gì? Đây là một hệ thống bố cục dựa trên lưới 2 chiều (2D) trong CSS, cho phép các lập trình viên sắp xếp nội dung theo cả hàng và cột một cách độc lập và linh hoạt.

Trước khi Grid xuất hiện, chúng ta thường phải dựa vào các framework cồng kềnh như Bootstrap để chia cột (grid system). Nhưng giờ đây, CSS Grid được tích hợp sẵn (native) trong trình duyệt. Bạn có thể xây dựng một bố cục web phức tạp chỉ với vài dòng code thuần. Sự tiện lợi này mạnh mẽ đến mức nhiều nền tảng như Webflow thiết kế website chuyên nghiệp cũng đã tích hợp sẵn hệ thống lưới CSS Grid vào giao diện kéo thả của họ để tối ưu hóa trải nghiệm người dùng.

“Cách mạng” layout 2 chiều: Tại sao Grid lại thay đổi cuộc chơi?

Trực tiếp vào vấn đề: CSS Grid thay đổi hoàn toàn tư duy thiết kế giao diện vì nó là công cụ đầu tiên và duy nhất của CSS được sinh ra chuyên biệt để xử lý layout 2 chiều (cả trục ngang và trục dọc cùng lúc).

Nếu Flexbox cực kỳ xuất sắc trong việc dàn hàng ngang hoặc dọc (1 chiều), thì Grid ôm trọn cả hai. Bạn không cần phải lồng ghép (nesting) hàng chục thẻ <div> vào nhau chỉ để tạo một cái card có hình ảnh bên trái và nội dung bên phải. Sự ra đời của Grid giúp mã nguồn HTML sạch sẽ hơn rất nhiều, giảm thiểu DOM nodes, từ đó hỗ trợ tối ưu hóa mã nguồn cực tốt.

Những thuật ngữ cốt lõi phải nắm: Nói chuyện như dân chuyên nghiệp

Trực tiếp vào vấn đề: Để làm chủ hướng dẫn CSS Grid Layout cơ bản, bạn bắt buộc phải hiểu các thuật ngữ cấu thành nên nó như Container, Item, Line, Track, Cell và Area.

Mình thấy rất nhiều bạn Front-end developer mới vào nghề hay bị bối rối vì nhảy ngay vào code mà bỏ qua phần lý thuyết nền tảng này. Đừng vội! Hãy tưởng tượng Grid như một bàn cờ caro, bạn cần biết đâu là bàn cờ, đâu là các ô vuông và đâu là những đường kẻ. Nắm vững từ vựng giúp bạn đọc tài liệu tiếng Anh dễ như ăn kẹo.

Grid Container và Grid Item: Đâu là cha, đâu là con?

Trực tiếp vào vấn đề: Grid Container là phần tử cha bao bọc bên ngoài (được khai báo display: grid), còn Grid Item là các phần tử con trực tiếp nằm ngay bên trong Container đó.

Mối quan hệ cha – con này rất quan trọng. Các thuộc tính định hình toàn bộ khung lưới (như số lượng cột, khoảng cách) sẽ được viết ở Container. Ngược lại, các thuộc tính quyết định vị trí cụ thể của một phần tử (như nằm ở cột mấy, hàng mấy) sẽ được áp dụng lên Grid Item. Nhớ kỹ: Grid chỉ tác động lên phần tử con trực tiếp của nó.

Grid Lines, Tracks, Cells, và Areas: Giải phẫu một hệ thống lưới

Trực tiếp vào vấn đề: Đây là các đơn vị cấu trúc bên trong một lưới. Lines là đường kẻ, Tracks là không gian giữa 2 đường kẻ, Cells là ô vuông nhỏ nhất, và Areas là vùng gồm nhiều Cells gộp lại.

Để dễ hình dung hơn, tại Phạm Hải, mình thường giải thích cho các bạn thực tập sinh thông qua bảng tóm tắt sau:

Thuật ngữ Giải thích dễ hiểu Ví dụ thực tế
Grid Lines Các đường kẻ ngang và dọc tạo nên lưới. Chúng được đánh số từ 1 trở đi. Đường viền của các ô trong file Excel.
Grid Tracks Khoảng không gian giữa 2 Grid Lines liền kề. Nó chính là Hàng và cột. Một cột (Column) hoặc một hàng (Row) hoàn chỉnh.
Grid Cells Đơn vị nhỏ nhất của lưới, được tạo bởi sự giao nhau giữa 1 hàng và 1 cột. Một ô duy nhất trong bảng Excel.
Grid Areas Một vùng hình chữ nhật bao gồm một hoặc nhiều Grid Cells ghép lại. Vùng bạn bôi đen gồm 4 ô vuông liền nhau.

Nắm trọn thuộc tính “ma thuật” của Grid Container (Thằng Cha)

Trực tiếp vào vấn đề: Để thiết lập một hệ thống lưới, bạn cần sử dụng các thuộc tính CSS Grid Layout dành riêng cho phần tử cha (Container) để quyết định cấu trúc tổng thể.

Đây là nơi bạn đóng vai kiến trúc sư. Bạn sẽ vẽ ra bản thiết kế: nhà có mấy phòng, hành lang rộng bao nhiêu. Hãy cùng đi vào chi tiết từng thuộc tính quan trọng nhất.

Khai báo với display: grid – Bước đầu tiên để vào thế giới lưới

Trực tiếp vào vấn đề: Để biến một phần tử HTML thông thường thành một Grid Container, bạn chỉ cần gán cho nó thuộc tính display: grid hoặc display: inline-grid.

  • display: grid: Container sẽ chiếm toàn bộ chiều rộng có sẵn (hoạt động giống như block element).
  • display: inline-grid: Container sẽ chỉ chiếm chiều rộng bằng với nội dung bên trong nó (hoạt động giống inline-block).

Ngay khi bạn khai báo dòng code này, tất cả các phần tử con trực tiếp bên trong sẽ tự động trở thành các Grid Item.

grid-template-columns & grid-template-rows: Vẽ nên cột và hàng cho layout

Trực tiếp vào vấn đề: Hai thuộc tính grid-template-columnsgrid-template-rows dùng để xác định số lượng, cũng như kích thước của các cột và hàng trong lưới.

Ví dụ, nếu bạn muốn tạo một layout có 3 cột bằng nhau, bạn có thể viết: grid-template-columns: 100px 100px 100px;. Tuy nhiên, cách viết fix cứng pixel này ít khi được dùng trong Responsive design. Thay vào đó, chúng ta có những vũ khí lợi hại hơn nhiều.

Đơn vị fr và hàm minmax(): Vũ khí tạo layout linh hoạt, responsive

Trực tiếp vào vấn đề: fr unit (fraction) đại diện cho một phần tỷ lệ của không gian trống, trong khi hàm minmax() giúp thiết lập kích thước tối thiểu và tối đa cho một track. Đây là bộ đôi hoàn hảo để tạo responsive layout với CSS Grid.

Thay vì đau đầu tính toán phần trăm, bạn chỉ cần viết grid-template-columns: 1fr 2fr 1fr;. Lưới sẽ tự chia làm 4 phần, cột giữa chiếm 2 phần, hai cột hai bên mỗi cột 1 phần.
Hàm minmax() lại càng tuyệt vời. Ví dụ minmax(200px, 1fr) nghĩa là cột đó sẽ co giãn linh hoạt, nhưng không bao giờ bị bóp nhỏ hơn 200px. Điều này giúp giao diện không bị vỡ trên màn hình điện thoại diệu kỳ.

gap (hay grid-gap): Tạo khoảng trống chưa bao giờ dễ hơn

Trực tiếp vào vấn đề: Thuộc tính gap (trước đây gọi là grid-gap) giúp bạn tạo khoảng cách đều đặn giữa các hàng và các cột mà không cần dùng đến margin phức tạp.

Bạn muốn các ô cách nhau 20px? Chỉ cần một dòng duy nhất: gap: 20px;. Nếu muốn khoảng cách hàng và cột khác nhau, bạn dùng gap: 20px 10px; (20px cho hàng, 10px cho cột). Quá gọn gàng và thanh lịch!

Căn chỉnh tất cả item với align-itemsjustify-items

Trực tiếp vào vấn đề: Tương tự như Flexbox, Grid cũng có align-items (căn chỉnh theo trục dọc – dọc theo cột) và justify-items (căn chỉnh theo trục ngang – dọc theo hàng) để điều khiển vị trí của nội dung bên trong các Grid Cells.

Các giá trị thường dùng là start, end, center, và stretch (mặc định). Nếu bạn muốn nội dung của tất cả các ô đều nằm ngay chính giữa, chỉ cần thêm place-items: center; (đây là cách viết gộp của cả align và justify).

Điều khiển từng Grid Item (Mấy Đứa Con) theo ý muốn

Trực tiếp vào vấn đề: Sau khi đã dựng xong khung nhà (Container), bạn sẽ dùng các thuộc tính cấp độ Item để quyết định mỗi Grid Item sẽ nằm ở đâu, chiếm bao nhiêu ô. Đây là trọng tâm của cách sử dụng CSS Grid Layout.

grid-column & grid-row: Chỉ định vị trí và kích thước cho item

Trực tiếp vào vấn đề: grid-columngrid-row xác định điểm bắt đầu và điểm kết thúc của một item dựa trên các Grid Lines (đường kẻ lưới).

Ví dụ, bạn muốn một bài viết nổi bật chiếm từ cột 1 đến cột 3, bạn viết: grid-column: 1 / 4; (bắt đầu từ đường số 1, kết thúc ở đường số 4). Hoặc cách viết ngắn gọn hơn: grid-column: 1 / span 3; (bắt đầu từ 1 và kéo dài 3 cột).

grid-area: Đặt tên cho vùng và xây dựng layout cực nhanh

Trực tiếp vào vấn đề: grid-area cho phép bạn đặt một cái tên (string) cho Grid Item. Sau đó, ở phần Container, bạn dùng grid-template-areas để sắp xếp các tên này thành một bản đồ layout trực quan.

Đây là tính năng mình thích nhất. Mã CSS của bạn sẽ trông giống hệt như một bản vẽ.

.header { grid-area: hd; }
.sidebar { grid-area: sd; }
.main { grid-area: mn; }

.container {
  display: grid;
  grid-template-areas: 
    "hd hd hd"
    "sd mn mn";
}

Nhìn vào code là biết ngay Header nằm trên cùng, Sidebar bên trái, Main bên phải.

Tự căn chỉnh một item với align-selfjustify-self

Trực tiếp vào vấn đề: Nếu align-itemsjustify-items áp dụng cho toàn bộ lưới, thì align-selfjustify-self cho phép một Grid Item cụ thể tự “phá vỡ” quy tắc chung để tự căn chỉnh theo ý nó.

Ví dụ, mọi item đều căn trái (start), nhưng riêng cái nút “Mua ngay” bạn muốn nó nằm giữa ô, bạn chỉ cần ném justify-self: center; vào class của cái nút đó.

So sánh kinh điển: CSS Grid và Flexbox – Khi nào dùng cái nào?

Trực tiếp vào vấn đề: So sánh CSS Grid và Flexbox không phải để tìm ra kẻ chiến thắng, mà để hiểu rõ công năng của từng công cụ: Grid sinh ra cho layout 2 chiều (trang tổng thể), còn Flexbox là bá chủ của layout 1 chiều (các thành phần nhỏ).

Nhiều bạn thắc mắc học Grid rồi có cần học Flexbox nữa không? Câu trả lời là CÓ. Cả hai bổ trợ cho nhau vô cùng hoàn hảo.

Grid cho layout 2 chiều, Flexbox cho layout 1 chiều – Quy tắc vàng

Trực tiếp vào vấn đề: Nếu bạn cần kiểm soát cả hàng và cột cùng lúc (ví dụ: chia giao diện thành Header, Sidebar, Content, Footer), hãy dùng Grid. Nếu bạn chỉ cần xếp các phần tử thành một hàng ngang hoặc một cột dọc (ví dụ: thanh menu navigation), hãy dùng Flexbox.

Flexbox lấy nội dung làm trung tâm (content-first). Kích thước của item phụ thuộc vào nội dung bên trong nó. Ngược lại, Grid lấy bố cục làm trung tâm (layout-first). Bạn vẽ ra các ô trước, rồi mới nhét nội dung vào.

Kinh nghiệm cá nhân: Khi nào mình dùng Grid, khi nào mình chọn Flexbox?

Trực tiếp vào vấn đề: Trả lời cho câu hỏi khi nào dùng CSS Grid, khi nào dùng Flexbox, kinh nghiệm của mình là: Dùng Grid cho “bộ xương” của trang web, và dùng Flexbox cho “nội tạng” bên trong.

Tại Phạm Hải, khi nhận một dự án thiết kế giao diện, mình luôn bắt đầu bằng display: grid cho thẻ <main> để chia khung. Sau đó, đi sâu vào từng component nhỏ như một cái Card sản phẩm (gồm ảnh, tiêu đề, giá tiền xếp dọc), mình sẽ dùng display: flex; flex-direction: column; vì nó nhanh và trực quan hơn.

Kết hợp Grid và Flexbox: Tạo ra những layout “bất khả chiến bại”

Trực tiếp vào vấn đề: Kết hợp CSS Grid và Flexbox là kỹ năng tối thượng của một Front-end developer hiện đại. Một Grid Item hoàn toàn có thể đồng thời là một Flex Container.

Ví dụ: Bạn dùng Grid để tạo ra một danh sách 10 thẻ sản phẩm xếp thành lưới 3 cột. Nhưng bên trong mỗi thẻ sản phẩm đó, bạn lại dùng Flexbox để căn giữa icon và đoạn text. Sự kết hợp này mang lại sức mạnh vô song, giúp bạn xử lý mọi thiết kế dù là oái oăm nhất.

Ví dụ thực chiến: Dựng layout blog hoàn chỉnh với CSS Grid

Trực tiếp vào vấn đề: Trăm nghe không bằng một thấy, hãy cùng xem một ví dụ về CSS Grid Layout thực tế: Dựng khung cho một trang Blog cá nhân chuẩn SEO và responsive.

Chúng ta sẽ xây dựng cấu trúc kinh điển: Header ở trên, Main Content bên trái, Sidebar bên phải, và Footer ở dưới cùng.

Bước 1: Phân tích và phác thảo cấu trúc layout

Trực tiếp vào vấn đề: Trước khi code HTML/CSS, bạn cần định hình trang web sẽ có 2 cột (Main và Sidebar) trên màn hình máy tính, và sẽ gập lại thành 1 cột trên màn hình điện thoại.

Việc phác thảo này giúp bạn xác định được cần bao nhiêu Grid Areas và cách chia tỷ lệ fr cho hợp lý.

Bước 2: Xây dựng Grid Container cho toàn trang

Trực tiếp vào vấn đề: Chúng ta bọc toàn bộ nội dung trong một thẻ <div class="wrapper"> và khai báo display: grid.

.wrapper {
  display: grid;
  grid-template-columns: 3fr 1fr; /* Main 3 phần, Sidebar 1 phần */
  gap: 20px;
}

Layout ổn định với Grid giúp giảm thiểu hiện tượng giật cục (CLS – Cumulative Layout Shift), qua đó hỗ trợ tối ưu điểm core web vitals wordpress rất hiệu quả.

Bước 3: Định vị Header, Main Content, Sidebar, và Footer bằng grid-area

Trực tiếp vào vấn đề: Sử dụng grid-template-areas để gán vị trí cho từng khối nội dung một cách trực quan nhất.

.wrapper {
  grid-template-areas: 
    "header header"
    "main sidebar"
    "footer footer";
}

Chỉ với vài dòng code, toàn bộ cấu trúc trang đã được định hình chắc chắn mà không cần bất kỳ thuộc tính float hay clear nào.

Bước 4: Tạo danh sách bài viết responsive với repeat(auto-fit, minmax())

Trực tiếp vào vấn đề: Bên trong khu vực Main Content, để hiển thị danh sách các bài viết tự động xuống hàng khi thu nhỏ màn hình, ta dùng công thức huyền thoại: grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));.

Đây là tuyệt chiêu tối thượng. Trình duyệt sẽ tự động tính toán: nếu đủ chỗ trống, nó sẽ nhét thêm cột; nếu thiếu chỗ (màn hình nhỏ hơn 250px), nó sẽ đẩy item xuống hàng dưới. Bạn có được một layout responsive hoàn hảo mà không cần viết media queries! Đừng quên rằng, sau khi viết code xong, việc minify css html js wordpress là bước cần thiết để tăng tốc độ tải trang thực tế.

Những câu hỏi cuối cùng: Hỗ trợ trình duyệt và các vấn đề khác

Trực tiếp vào vấn đề: Khi áp dụng công nghệ mới, sự tương thích luôn là nỗi lo. Vậy CSS Grid Layout có hỗ trợ trình duyệt nào tính đến thời điểm hiện tại?

CSS Grid Layout có hỗ trợ trình duyệt nào? Cần lo lắng không?

Trực tiếp vào vấn đề: Tính đến tháng 3/2026, theo dữ liệu từ CanIUse, CSS Grid Layout (Level 1) đã được hỗ trợ tới hơn 97.5% trên toàn cầu đối với mọi trình duyệt hiện đại (Chrome, Safari, Firefox, Edge).

Ngay cả tính năng nâng cao như CSS Subgrid (cho phép lưới con kế thừa các đường kẻ của lưới cha) cũng đã được hỗ trợ toàn diện trên các trình duyệt kể từ cuối năm 2023. Do đó, bạn hoàn toàn có thể yên tâm 100% sử dụng CSS Grid cho các dự án thực tế (Production) ngay hôm nay mà không cần lo lắng về tính tương thích.

Mẹo gỡ lỗi (debug) CSS Grid nhanh gọn với trình duyệt DevTools

Trực tiếp vào vấn đề: Để debug CSS Grid, hãy mở Chrome DevTools (hoặc Firefox Developer Tools), tìm đến phần tử Grid Container và click vào biểu tượng chữ “grid” nhỏ xíu bên cạnh nó.

Trình duyệt sẽ hiển thị trực quan các đường Grid Lines, số thứ tự hàng/cột và các khoảng gap ngay trên màn hình trang web của bạn. Tính năng này giúp bạn phát hiện ngay lập tức item nào đang nằm sai vị trí hoặc bị tràn (overflow) ra khỏi ô.


CSS Grid không chỉ là một tập hợp các thuộc tính CSS mới, nó thực sự là một sự chuyển đổi về tư duy thiết kế layout. Là một người đã từng chật vật với bảng (table), float, rồi đến Flexbox, mình khẳng định CSS Grid cho người mới bắt đầu là một khoản đầu tư kiến thức sinh lời cao nhất. Nắm vững hệ thống lưới này trong tay, bạn có thể tự tin chinh phục mọi bản thiết kế phức tạp nhất. Đừng ngại thử nghiệm, phá vỡ các giới hạn, bởi vì một khi đã quen với sức mạnh của Grid, mình tin chắc bạn sẽ không bao giờ muốn quay lại với những cách làm cũ kỹ, rườm rà nữa đâu. Hãy mở editor lên và bắt đầu “kẻ ô” ngay hôm nay!

Bạn đã dựng được layout nào “chất” bằng sự kết hợp giữa CSS Grid và Flexbox chưa? Hoặc bạn đang gặp khó khăn ở thuộc tính nào? Hãy để lại bình luận bên dưới để chúng ta cùng thảo luận nhé!

Lưu ý: Các thông tin trong bài viết này chỉ mang tính chất tham khảo. Để có được lời khuyên tốt nhất, vui lòng liên hệ trực tiếp với chúng tôi để được tư vấn cụ thể dựa trên nhu cầu thực tế của bạn.

Categories: HTML & CSS Lập Trình Web

mrhai

Để lại bình luận