Sinh code CSS Subgrid đúng chuẩn cho card thẳng hàng và form thẳng cột
CSS Subgrid Generator của Tấn Phát Digital giúp tạo code CSS Subgrid - tính năng của CSS Grid Level 2 cho phép grid lồng bên trong dùng lại chính các track (cột/hàng) của grid cha. Subgrid giải quyết bài toán căn thẳng hàng nội dung giữa nhiều card hoặc nhiều dòng form - thứ CSS Grid lồng nhau thông thường không làm được. Công cụ có ba mẫu: subgrid theo hàng cho card có header/body/footer thẳng hàng, subgrid theo cột cho form có nhãn và ô nhập cùng cột, và subgrid cả hai chiều. Bạn chọn số cột, số hàng, khoảng cách gap, xem trước trực tiếp trên trình duyệt và copy CSS kèm HTML mẫu cùng khối @supports dự phòng. Hỗ trợ trình duyệt: Firefox 71+ (12/2019), Safari 16+ (9/2022), Chrome và Edge 117+ (9/2023).
Tính năng nổi bật
- Ba mẫu subgrid: theo hàng (card), theo cột (form), cả hai chiều
- Sinh grid-template-rows: subgrid và/hoặc grid-template-columns: subgrid đúng với item con span đủ số track
- Tự thêm grid-row: span N hoặc grid-column: 1 / -1 để item con phủ đúng các track cần kế thừa
- Sinh kèm HTML mẫu khớp với số cột, số hàng đã chọn
- Sinh khối @supports not (...) dự phòng cho trình duyệt cũ
- Xem trước trực tiếp bằng chính các thuộc tính CSS đã sinh, cập nhật ngay khi đổi thông số
- Tùy chỉnh gap (rem) của grid cha, card mẫu ghi đè row-gap bên trong
- Kiểm tra đầu vào: số cột, số hàng là số nguyên từ 1 đến 12
- Export CSS với comments giải thích tiếng Việt
- Copy riêng CSS và HTML bằng một cú bấm
- Tương thích với code CSS Grid hiện có
- Hoàn toàn miễn phí, copy & dùng ngay
CSS Subgrid giải quyết vấn đề nested grid alignment
Trước CSS Subgrid, khi có grid cha và grid con, items trong grid con KHÔNG thể align với items của grid con bên cạnh. Ví dụ: 3 cards (header, body, footer), nếu header card 1 dài hơn header card 2, phần body và footer của các card sẽ lệch nhau. Developers phải dùng JavaScript đo chiều cao, hoặc đặt chiều cao cố định rồi cắt chữ - khó bảo trì. Với Subgrid, grid con dùng lại track của grid cha: .card { display: grid; grid-template-rows: subgrid; grid-row: span 3; } - các headers, bodies, footers tự động thẳng hàng qua tất cả cards trên cùng một dòng. Use case khác: nhãn form cùng độ rộng qua nhiều dòng, dashboard widgets cùng baseline, product grids với nút mua thẳng hàng. Subgrid biến CSS Grid từ 'mạnh' thành 'hoàn chỉnh' cho bố cục lồng nhau.
Lợi ích khi sử dụng
- Align items hoàn hảo qua nhiều grid items
- Loại bỏ JavaScript height-matching hacks
- HTML gọn - giữ đúng cấu trúc ngữ nghĩa card, không cần làm phẳng DOM
- Responsive tự động khi parent grid thay đổi số cột
- Tận dụng CSS Grid skills đã có
- Không tốn JavaScript đo đạc lại mỗi khi nội dung hay kích thước màn hình đổi
- Maintainable - logic align ở CSS thuần
- Compatible với CSS Grid hiện tại, không phá layout cũ
Hướng dẫn tạo CSS Subgrid layout với công cụ
- 1Chọn kiểu subgrid: theo hàng cho card thẳng hàng, theo cột cho form thẳng cột, hoặc cả hai chiều
- 2Nhập số cột của grid cha (Parent Columns), từ 1 đến 12
- 3Nhập số hàng mỗi card chiếm (kiểu theo hàng) hoặc số dòng form (kiểu theo cột), tương ứng số phần tử con trực tiếp của mỗi item
- 4Chỉnh gap của grid cha theo rem nếu cần
- 5Xem phần Xem trước: ô đầu tiên có nội dung dài hơn để bạn thấy các hàng tương ứng ở card khác giãn theo
- 6Copy CSS và HTML mẫu, đổi tên lớp .parent-grid, .child-subgrid theo dự án của bạn
- 7Giữ khối @supports nếu dự án còn phải chạy trên trình duyệt cũ
- 8Kiểm tra bằng lớp phủ Grid trong DevTools của trình duyệt
Use case thực tế: Card grid với header/body/footer aligned
Pattern phổ biến: product cards trên trang thương mại điện tử với tên sản phẩm (1-3 dòng), mô tả (2-4 dòng), giá và nút mua. Không có subgrid: nếu tên sản phẩm ở card 1 dài hơn, phần mô tả và nút mua của card 1 sẽ thấp hơn các card khác - layout lộn xộn. Có subgrid: HTML: <div class='grid'><article><h3>Title</h3><p>Desc</p><div>Price</div><button>Buy</button></article>...</div>. CSS: .grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; } .grid > article { display: grid; grid-row: span 4; grid-template-rows: subgrid; }. Grid cha tự tạo các hàng ngầm định, mỗi nhóm 4 hàng cho một dòng card; mỗi hàng cao bằng phần tử cao nhất trong hàng đó ở mọi card. Kết quả: tất cả tên sản phẩm cùng vùng, tất cả mô tả cùng vùng, tất cả nút mua cùng đáy. Căn thẳng hàng hoàn hảo không cần JavaScript.
Giải thích từng dòng code mặc định (3 cột, 3 hàng, gap 1rem)
Với cài đặt mặc định, công cụ sinh .parent-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; } và .child-subgrid { display: grid; grid-row: span 3; grid-template-rows: subgrid; row-gap: 0.5rem; }. minmax(0, 1fr) thay vì 1fr để cột không bị nội dung dài (URL, từ không ngắt) kéo rộng ra. Trong container rộng 960 px, mỗi cột rộng (960 - 2 x 16) / 3 = 309,33 px. grid-row: span 3 khiến mỗi card chiếm 3 hàng liên tiếp; với 6 card trong 3 cột, grid cha có 2 dòng card x 3 hàng = 6 hàng ngầm định. grid-template-rows: subgrid khiến 3 phần tử con của card nằm đúng trên 3 hàng đó. Nếu header card 1 có 2 dòng chữ (48 px) còn header card 2, card 3 chỉ 1 dòng (24 px), hàng header cao 48 px cho cả ba card, nên phần body của cả ba bắt đầu cùng một vị trí. row-gap: 0.5rem trên subgrid thay khoảng cách giữa các hàng bên trong card, còn khoảng cách giữa hai dòng card vẫn là gap 1rem của grid cha.
Ba quy tắc bắt buộc và lỗi hay gặp khi viết subgrid
Thứ nhất, phần tử dùng subgrid phải là con trực tiếp (grid item) của grid cha và bản thân nó phải có display: grid; thiếu một trong hai thì giá trị subgrid bị bỏ qua. Thứ hai, item phải span đúng số track muốn kế thừa: grid-row: span 3 cho 3 hàng, hoặc grid-column: 1 / -1 để trải hết các cột tường minh. Nếu quên span, item chỉ chiếm 1 track và mọi phần tử con dồn vào đó. Thứ ba, theo chiều đã khai báo subgrid, grid con không tự tạo thêm track ngầm định: nếu card span 3 hàng mà có 4 phần tử con, phần tử thứ tư bị đặt chồng vào track cuối thay vì xuống hàng mới. Vì vậy số phần tử con trực tiếp của mỗi card nên bằng đúng số hàng span; nội dung phụ hãy bọc chung vào một phần tử. Một lỗi nữa là dùng grid-column: 1 / -1 khi grid cha chỉ định nghĩa cột bằng grid-auto-columns: -1 chỉ tính trên các đường kẻ tường minh, nên hãy khai báo grid-template-columns.
Hỗ trợ trình duyệt năm 2026 và cách viết dự phòng
Firefox hỗ trợ subgrid từ bản 71 (12/2019), Safari từ bản 16 (9/2022), Chrome và Edge từ bản 117 (9/2023). Kể từ khi Chrome 117 phát hành, subgrid có mặt trên cả ba bộ máy hiển thị chính và được Baseline xếp vào nhóm 'widely available' sau mốc 30 tháng, tức khoảng đầu năm 2026. Trên thực tế, nhóm còn thiếu là máy dùng trình duyệt không cập nhật, ví dụ iPhone kẹt ở iOS 15 hoặc WebView cũ trong một số ứng dụng. Hãy kiểm tra tỷ lệ trên caniuse.com và số liệu truy cập của chính website trước khi quyết định. Khối dự phòng @supports not (grid-template-rows: subgrid) { ... } mà công cụ sinh ra giữ cho card vẫn hiển thị bình thường, chỉ mất phần căn thẳng hàng giữa các card, đây là kiểu xuống cấp nhẹ nhàng (graceful degradation).
Subgrid vs Flexbox vs CSS Grid thuần
Flexbox: 1 chiều (hàng HOẶC cột), không chia sẻ track giữa các phần tử anh em - phải đặt chiều cao cố định. CSS Grid thuần: 2 chiều, nhưng grid lồng bên trong KHÔNG chia sẻ track với grid cha. Subgrid: phần mở rộng của Grid, grid con dùng chung track với grid cha. Khi nào dùng: Flexbox cho bố cục 1 chiều đơn giản (thanh điều hướng, nhóm nút). Grid cho bố cục 2 chiều độc lập. Subgrid khi cần CĂN THẲNG HÀNG xuyên qua các cấp lồng nhau. Maintenance: Subgrid gọn hơn nhiều so với giải pháp đo chiều cao bằng JavaScript.
Subgrid khác gì display: contents
Trước khi có subgrid, một mẹo phổ biến là đặt display: contents cho card để các phần tử con 'nhảy' thẳng lên làm grid item của grid cha. Cách này cũng căn thẳng hàng được, nhưng card mất hộp riêng: không có nền, viền, bo góc, padding hay bóng đổ, và ở một số trình duyệt cũ còn làm mất vai trò ngữ nghĩa của phần tử với trình đọc màn hình. Subgrid giữ card là một hộp thật, vẫn trang trí được, trong khi các phần tử con vẫn bám theo track của grid cha. Padding và viền của subgrid được tính như lề thêm cho các phần tử ở mép, nên nội dung vẫn thẳng hàng giữa các card có cùng padding.
Các bước viết CSS Subgrid thủ công
Nếu muốn tự viết thay vì dùng công cụ: Định nghĩa parent grid: display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)). Chọn child element làm subgrid (ví dụ: .card). Đặt .card { display: grid; grid-template-rows: subgrid }. Đặt grid-row: span N (N = số hàng muốn kế thừa, bằng số phần tử con của card). Có thể subgrid cả cột: grid-template-columns: subgrid kèm grid-column: 1 / -1. Thêm phần tử con vào .card - chúng bám theo track của grid cha. Kiểm tra kết quả - các phần tử thẳng hàng qua tất cả card. Copy CSS và dán vào stylesheet. Subgrid cũng nhận thêm tên đường kẻ, ví dụ grid-template-columns: subgrid [label] [field], và kế thừa luôn tên đường kẻ đã đặt ở grid cha.
Giới hạn của công cụ
Công cụ sinh ba mẫu phổ biến nhất với số cột, số hàng từ 1 đến 12 và một giá trị gap. Công cụ không có trình kéo thả để đặt item vào vị trí tùy ý, không sinh grid-template-areas, không sinh @media cho responsive và không gắn tên đường kẻ. Với responsive, bạn chỉ cần đổi grid-template-columns của grid cha trong @media (ví dụ từ 3 cột xuống 1 cột trên điện thoại), phần subgrid tự thích ứng. Kiểu theo cột dùng max-content cho cột đầu để nhãn dài nhất quyết định độ rộng cột nhãn; nếu nhãn rất dài, hãy đổi thành minmax(0, 12rem) hoặc giá trị phù hợp.
Câu hỏi thường gặp (FAQ)
CSS Subgrid là gì và khác CSS Grid thường thế nào?
Subgrid là tính năng của CSS Grid Level 2: grid con dùng lại track (cột/hàng) của grid cha. Khác Grid thường: grid lồng trong grid thường có track ĐỘC LẬP với grid cha, không căn theo nhau. Với Subgrid: grid-template-rows: subgrid - grid con dùng cùng các hàng với grid cha, cho phép căn thẳng hàng qua nhiều card/section - thứ Grid thường không làm được.
Browser nào hỗ trợ Subgrid hiện tại?
Firefox 71+ (12/2019) - trình duyệt đầu tiên hỗ trợ, Safari 16+ (9/2022), Chrome 117+ và Edge 117+ (9/2023). Năm 2026, mọi trình duyệt lớn bản hiện hành đều hỗ trợ và subgrid thuộc nhóm Baseline 'widely available'. Phần còn thiếu chủ yếu là thiết bị không cập nhật trình duyệt; hãy xem tỷ lệ trên caniuse.com và dữ liệu truy cập của website. Dùng @supports (grid-template-rows: subgrid) { ... } để kiểm tra hỗ trợ.
Có thể subgrid cả columns và rows cùng lúc không?
Có. Đặt cả grid-template-columns: subgrid; grid-template-rows: subgrid;. Grid con kế thừa cả cột và hàng từ grid cha. Tuy nhiên grid con phải span đủ track ở cả hai chiều: grid-column: span N (hoặc 1 / -1); grid-row: span M;. Nếu chỉ cần 1 chiều, đặt subgrid cho chiều đó - chiều còn lại dùng grid thường hoặc auto.
Subgrid có thể nested nhiều cấp không?
Có, subgrid có thể lồng nhiều cấp. Mỗi cấp kế thừa từ cấp cha trực tiếp. Ví dụ: grandparent > parent (subgrid) > child (subgrid) - child kế thừa từ parent, parent kế thừa từ grandparent, nên track được giữ xuyên suốt nhiều cấp DOM. Tuy nhiên lồng quá sâu khó gỡ lỗi - hãy dùng lớp phủ Grid trong DevTools để kiểm tra.
Có cần fallback cho browsers không support Subgrid?
Nên có nếu website còn khách dùng trình duyệt cũ. Dùng @supports: @supports not (grid-template-rows: subgrid) { .card { grid-template-rows: auto; } } như công cụ sinh sẵn, hoặc viết ngược lại với @supports (grid-template-rows: subgrid). Card vẫn hiển thị, chỉ mất căn thẳng hàng giữa các card. Kiểm tra trên Chrome cũ (dưới 117) hoặc Safari dưới 16 để xác nhận.
Subgrid có ảnh hưởng SEO/accessibility không?
Không. Subgrid là CSS thuần, không thay đổi cấu trúc HTML hay thứ tự DOM. SEO và trình đọc màn hình dựa vào thứ tự DOM, không phải thứ tự hiển thị. Tuy nhiên cẩn thận: nếu thứ tự hiển thị khác thứ tự DOM (qua grid-area hoặc order), trình đọc màn hình vẫn đọc theo DOM - có thể gây khó hiểu. Best practice: giữ thứ tự hiển thị trùng thứ tự DOM khi có thể.
Vì sao tôi đặt grid-template-rows: subgrid mà không có tác dụng?
Ba nguyên nhân phổ biến: phần tử không phải con trực tiếp của grid cha (bị bọc thêm một div), phần tử thiếu display: grid, hoặc phần tử không span nhiều hàng nên chỉ kế thừa đúng 1 hàng. Kiểm tra trong DevTools: phần tử subgrid hợp lệ sẽ có nhãn grid/subgrid và lớp phủ đường kẻ trùng với grid cha.
Card có nhiều phần tử con hơn số hàng span thì sao?
Theo chiều đã khai báo subgrid, grid con không tạo thêm hàng ngầm định, nên phần tử thừa bị đặt chồng lên hàng cuối cùng. Hãy tăng grid-row: span cho bằng số phần tử con, hoặc bọc các phần tử phụ vào chung một phần tử để số con trực tiếp khớp với số hàng.
Subgrid có kế thừa gap của grid cha không?
Có. Mặc định khoảng cách giữa các track bên trong subgrid bằng gap của grid cha. Bạn có thể ghi đè bằng row-gap hoặc column-gap trên chính phần tử subgrid, như mẫu card của công cụ đặt row-gap: 0.5rem. Khoảng cách giữa hai card cạnh nhau vẫn là gap của grid cha.
Nên dùng span N hay 1 / -1 cho item subgrid?
Dùng grid-column: 1 / -1 khi item cần trải hết các cột tường minh của grid cha (dòng form, phần tử toàn chiều ngang). Dùng span N khi item chỉ chiếm một phần và để grid tự xếp chỗ, như card chiếm span 3 hàng. Lưu ý -1 chỉ là đường kẻ cuối của lưới tường minh, nên grid cha phải khai báo grid-template-columns.
Subgrid có dùng được với Tailwind CSS không?
Có. Tailwind CSS từ phiên bản 3.4 có sẵn lớp grid-rows-subgrid và grid-cols-subgrid, kết hợp với row-span-3 hoặc col-span-full để span đủ track. Với phiên bản cũ hơn, dùng giá trị tùy ý như [grid-template-rows:subgrid].
Subgrid và display: contents nên chọn cái nào?
Chọn subgrid khi card cần nền, viền, padding, bóng đổ hay sự kiện click, vì display: contents xóa hộp của phần tử đó. display: contents chỉ phù hợp khi phần tử bọc hoàn toàn không cần hiển thị gì và bạn cần hỗ trợ trình duyệt rất cũ.
Làm sao cho nút mua luôn nằm sát đáy card?
Với subgrid, nút mua là phần tử con cuối của card nên nằm ở hàng cuối, và hàng đó dùng chung cho mọi card trên cùng dòng, nên các nút tự thẳng hàng mà không cần mẹo margin-top: auto của Flexbox. Nếu nút thấp hơn chiều cao hàng (ví dụ card khác có hàng cuối cao hơn), thêm align-self: end cho nút để nó bám sát đáy.
Có kiểm tra subgrid bằng DevTools được không?
Được. Chrome, Edge và Firefox đều có lớp phủ Grid trong tab Elements/Inspector; phần tử subgrid hiện nhãn subgrid và bạn có thể bật lớp phủ để thấy đường kẻ của grid con trùng với grid cha. Đây là cách nhanh nhất để phát hiện item span thiếu track.
Từ khóa liên quan
- css subgrid generator
- css subgrid example
- css nested grid
- css grid level 2
- subgrid card alignment
- css subgrid support
- subgrid form layout
- css grid track inheritance
- subgrid responsive
- grid-template-rows subgrid
- grid-template-columns subgrid
- css subgrid browser support 2026
- subgrid fallback @supports
- card cao bằng nhau css
- căn thẳng hàng card css grid
- subgrid tailwind
- subgrid vs display contents
- css grid lồng nhau