Bootstrap Grid System là gì: Cách dùng từ cơ bản đến nâng cao

Khi thiết kế giao diện web, việc chia bố cục sao cho hợp lý, đẹp mắt và phù hợp với mọi thiết bị luôn là điều quan trọng. Bootstrap giúp đơn giản hoá điều đó với Grid System. Đây là một hệ thống lưới dựa trên Flexbox, cho phép bạn dễ dàng chia layout thành các hàng và cột, linh hoạt và responsive mà không cần viết nhiều CSS.

Đọc bài viết này để hiểu hơn về:

  • Grid system trong Bootstrap là gì?
  • Các kỹ thuật sử dụng Grid từ cơ bản và nâng cao
  • Những lưu ý khi sử dụng Grid trong Bootstrap

Bootstrap Grid là gì?

Hệ thống lưới (Grid system) của Bootstrap là một công cụ mạnh mẽ, giúp bạn xây dựng các layout linh hoạt và responsive một cách nhanh chóng. Dựa trên Flexbox trong Bootstrap và thiết kế mobile-first, Bootstrap Grid cho phép bạn tạo bố cục mọi hình dạng và kích thước, từ đơn giản đến phức tạp, chỉ bằng cách sử dụng các class tiện ích được định nghĩa sẵn.

Đọc thêm: Bootstrap 5 là gì? Những thay đổi nổi bật ở Bootstrap 5

Đặc điểm chính của Grid System trong Bootstrap

  • Xây dựng dựa trên Flexbox: Grid sử dụng Flexbox ở cấp độ .row, mang lại khả năng căn chỉnh theo cả chiều ngang và dọc, đồng thời tương thích với các tiện ích khác của Bootstrap như justify-content-*, align-items-*, v.v.
  • Thiếu kế theo hướng Mobile-first: Tất cả các layout được xây dựng theo hướng tiếp cận mobile-first, nghĩa là giao diện được tối ưu hóa trước cho thiết bị nhỏ, sau đó mở rộng dần cho màn hình lớn hơn.
  • Hệ thống bao gồm 12 cột: Mỗi hàng (.row) được chia thành 12 đơn vị cột, cho phép bạn linh hoạt chia nhỏ không gian tùy theo tỷ lệ mong muốn cho các phần tử nằm trên một hàng (ví dụ: 6-6, 4-4-4, 3-9…).
  • Hỗ trợ responsive mặc định: Grid system có hỗ trợ các breakpoint sẵn gồm xs, sm, md, lg, xl, và xxl, giúp bạn tạo layout tương thích với mọi kích thước màn hình mà không cần viết thêm media queries thủ công.

Lợi ích khi dùng Grid System của Bootstrap

Sử dụng Grid System trong Bootstrap mang lại nhiều lợi ích rõ rệt cho quá trình xây dựng giao diện web:

  • Xây dựng layout nhanh chóng: Grid system cung cấp các class HTML như .row, .col-6, .offset-md-2,… giúp nhanh chóng xây dựng layout chuyên nghiệp cho trang web.
  • Tương thích với nhiều thiết bị: Grid hoạt động theo thiết kế mobile-first, hỗ trợ 6 cấp breakpoint, tự động điều chỉnh bố cục theo kích thước thiết bị.
  • Dễ dàng bảo trì: Hệ thống Grid với các class tiện ích giúp định dạng layout có cấu trúc rõ ràng, dễ đọc, giúp cả team làm việc thống nhất, nhanh chóng cập nhật giao diện mà không lo vỡ layout.
  • Linh hoạt để mở rộng: Bootstrap hỗ trợ tùy chỉnh Grid thông qua biến Sass và mixin, cho phép điều chỉnh số cột, khoảng cách, breakpoint theo nhu cầu.

Cấu trúc cơ bản của Bootstrap Grid

Hàng (.row)

Trong hệ thống Grid của Bootstrap, .row là thành phần trung gian giữa container và cột. Nó đóng vai trò như một flex container, giúp tổ chức các cột (.col-*) thành hàng ngang, đồng thời quản lý khoảng cách giữa các cột thông qua hệ thống gutter (khoảng cách lề trong). Nói cách khác, .row là “xương sống” của Grid, và nếu không có nó, hệ thống cột sẽ không thể hiển thị đúng cấu trúc.

Ví dụ về sử dụng .row:

       <div class="container">
           <div class="row">
               <div class="border col">Cột 1</div>
               <div class="border col">Cột 2</div>
               <div class="border col">Cột 3</div>
           </div>
       </div>

Trong đó:

  • Khi bạn khai báo <div class="row">, Bootstrap sẽ tự động áp dụng display: flexflex-wrap: wrap để sắp xếp các cột theo hàng ngang, đồng thời hỗ trợ xuống dòng khi cần thiết.
  • Tất cả các phần tử con .col, .col-*, hoặc .col-{breakpoint}-{số} phải được đặt trực tiếp bên trong .row. Nếu bạn bỏ qua .row, các cột sẽ không được sắp xếp đúng theo hệ thống lưới.

Cột tự động và chia tỷ lệ

Bootstrap sử dụng hệ thống 12 cột trong mỗi .row, bạn có thể tùy chỉnh độ rộng của các phần tử trên một .row bằng cách chỉ định số cột mà phần tử đó sử dụng.

Có hai cách để chia cột:

  1. Cột tự động chia đều (.col)

Bạn có thể sử dụng class .col cho các phần tử trong .row để chúng tự động chiếm một phần không gian bằng nhau. Ví dụ:

       <div class="row">
           <div class="col">
             Column
           </div>

           <div class="col">
             Column
           </div>

           <div class="col">
             Column
           </div>
       </div>

Như ví dụ trên, .row có 3 phần tử div sử dụng class .col, mỗi phần tử đều chiếm một phần diện tích bằng nhau (tương đương với 4 cột).

  1. Cột chia tỷ lệ cố định (.col-*)

Bạn có thể chia cụ thể tỷ lệ cột cho từng phần tử bằng cách sử dụng .col-{số} (trong đó {số} là 1–12):

       <div class="row">
           <div class="border col-4">Chiếm 4/12</div>
           <div class="border col-8">Chiếm 8/12</div>
       </div>

Lưu ý, tổng số cột không được vượt quá 12 để tránh tình trạng bị rớt dòng ngoài ý muốn.

Các loại Container

Trong hệ thống Grid của Bootstrap, Container đóng vai trò như một “khung nền” bao quanh toàn bộ layout. Dù bạn có sử dụng bao nhiêu hàng (.row) và cột (.col-*), thì tất cả đều cần được bọc trong một container để có được căn lề chính xác, khoảng cách đều đặn, và đặc biệt là hành vi responsive ổn định.

Container giúp:

  • Căn giữa nội dung theo chiều ngang của trình duyệt
  • Thêm padding hai bên để tránh nội dung sát mép
  • Quản lý chiều rộng tối đa theo từng breakpoint
  • Khởi tạo context cho layout grid – tức là .row.col phải nằm bên trong .container thì hệ thống lưới mới hoạt động đúng

Bootstrap cung cấp 3 loại container chính, mỗi loại có hành vi khác nhau về chiều rộng và khả năng responsive:

.container

Cố định theo từng kích thước.

Đây là loại container mặc định. Nó có chiều rộng cố định và sẽ tự động thay đổi theo breakpoint để phù hợp với thiết bị:

BreakpointChiều rộng tối đa (.container)
sm (≥576px)540px
md (≥768px)720px
lg (≥992px)960px
xl (≥1200px)1140px
xxl (≥1400px)1320px
       <div class="container">
           <div class="row">
               <div class="col">Cột 1</div>
               <div class="col">Cột 2</div>
           </div>
       </div>

.container-fluid

Luôn 100% chiều ngang.

Container này sẽ có chiều rộng luôn trải dài trên toàn bộ chiều ngang trong vùng chứa, phù hợp khi bạn muốn nội dung dàn full chiều ngang không giới hạn theo màn hình như dashboard, table nhiều cột, hình nền toàn trang.

       <div class="container-fluid">
           <div class="row">
               <div class="col">nội dung chiếm toàn bộ chiều rộng</div>
           </div>
       </div>

.container-{breakpoint}

Responsive theo breakpoint.

Loại container này kết hợp tính năng của container thường và container-fluid. Cụ thể:

  • Ở kích thước nhỏ hơn breakpoint → rộng 100%
  • Ở kích thước lớn hơn hoặc bằng breakpoint → dùng chiều rộng cố định

Ví dụ:

       <div class="container-md">
           <div class="row">
               <div class="col">Nội dung</div>
           </div>
       </div>

Trong đó:

  • Ở mobile và tablet (<768px): container có chiều rộng 100%
  • Ở desktop (≥768px): container được giới hạn tối đa 720px

Các tính năng nâng cao trong Grid Bootstrap

Gutter

Trong Bootstrap, gutter dùng để chỉ khoảng cách giữa các cột trong một hàng (.row). Nó đảm bảo rằng các cột trong layout không bị “dính” vào nhau, từ đó tạo ra khoảng cách hợp lý, thẩm mỹ và dễ đọc giữa các phần tử.

Khi bạn tạo một .row và đặt các .col vào bên trong, Bootstrap sẽ:

  • Thêm padding-left: 0.75rempadding-right: 0.75rem cho mỗi .col, tổng cộng mỗi cặp cột có 1.5rem khoảng cách giữa chúng.
  • Đồng thời, .row sẽ có margin-left: -0.75remmargin-right: -0.75rem để cân bằng lại phần padding, giúp căn nội dung thẳng hàng với container bên ngoài.

Lưu ý: Gutter chỉ áp dụng cho khoảng cách ngang giữa các cột. Khoảng cách dọc giữa các hàng không được tính là gutter mặc định — bạn cần tự thêm bằng margin hoặc các class Bootstrap như .mb-*, .gy-*.

  • Cách tuỳ chỉnh gutter

Bootstrap 5 cung cấp bộ class tiện ích để bạn thay đổi gutter một cách nhanh chóng mà không cần viết CSS:

ClassTác dụng
.g-{n}Thay đổi cả gutter ngang và dọc
.gx-{n}Chỉ thay đổi gutter ngang (x-axis)
.gy-{n}Chỉ thay đổi gutter dọc (y-axis)
.g-0Xoá hoàn toàn khoảng cách giữa cột

Với {n} từ 0 → 5 (tương ứng từ 0 đến ~3rem).

Ví dụ thay đổi gutter giữa các cột:

  • Khi gx-1:
           <div class="row gx-1">
               <div class="border col">Cột A</div>
               <div class="border col">Cột B</div>
           </div>
  • Khi gx-5:
           <div class="row gx-5">
               <div class="border col">Cột A (gx-5)</div>
               <div class="border col">Cột B (gx-5)</div>
           </div>

Offset và căn giữa cột

Offset là kỹ thuật cho phép bạn tạo khoảng trống bên trái một cột, giúp cột đó “lùi vào trong” mà không cần thêm phần tử rỗng. Bootstrap hỗ trợ các class dạng .offset-{breakpoint}-{số}, trong đó:

  • {breakpoint}: là điểm responsive như sm, md, lg, v.v
  • {số}: là số cột bạn muốn dịch sang (từ 1 đến 11)

Ví dụ: đẩy một phần tử sang phải

           <div class="row border">
               <div class="border col-md-4 offset-md-2">
                   Cột này bắt đầu từ vị trí cột thứ 3
               </div>
           </div>

Muốn căn giữa một cột trong hàng, bạn có thể làm theo 2 cách sau:

  1. Dùng offset thủ công

Dựa trên nguyên lý chia layout thành 12 cột. Bạn có thể căn giữa một cột bằng cách:

  • Tạo cột có chiều rộng nhỏ hơn 12
  • Cộng thêm một phần offset ở bên trái để đẩy nó ra giữa

Ví dụ: căn giữa cột rộng 6/12 bằng offset

           <div class="row border">
               <div class="border bg-primary text-white col-6 offset-3">
                  Phần tử ở giữa
               </div>
           </div>
  1. Dùng Flexbox để căn giữa

Đây là cách hiện đại, linh hoạt hơn, sử dụng sức mạnh của Flexbox (được Bootstrap Grid tích hợp sẵn từ phiên bản 4 trở đi). Thay vì tính toán offset, bạn chỉ cần:

  • Áp dụng class justify-content-center vào .row
  • Đặt cột vào trong như bình thường

Ví dụ: căn giữa cột bất kỳ

           <div class="row border justify-content-center">
               <div class="border bg-primary text-white col-4">
                  Phần tử ở giữa (Flexbox)
               </div>
           </div>

Bạn không cần quan tâm đến số cột còn lại, Flexbox sẽ tự động căn giữa cột bên trong .row.

Cột tự động theo nội dung

Trong hệ thống Grid của Bootstrap, ngoài các cột chia theo tỷ lệ như .col-6, .col-md-4, bạn còn có một lựa chọn rất linh hoạt đó là class .col-auto. Loại cột này không tuân theo hệ 12 cột mà sẽ co giãn đúng bằng kích thước nội dung bên trong.

Đây là giải pháp lý tưởng khi bạn cần một phần tử có chiều rộng nhỏ gọn, không chiếm không gian dư thừa, ví dụ như: nút, logo, biểu tượng, label…

Ví dụ: .col-auto kết hợp với .col

           <div class="border row">
               <div class="col-auto">
                   <button class="btn btn-primary">Nút nhỏ</button>
               </div>

               <div class="col">
                   Phần nội dung dài hơn chiếm phần còn lại
               </div>
           </div>

Trong đó, nút chỉ chiếm vừa đủ không gian chứa chữ “Nút nhỏ”, còn nội dung còn lại sẽ được .col co giãn chiếm hết phần còn lại của hàng.

Đổi vị trí cột với order-*

Trong một số layout, đặc biệt là giao diện responsive, bạn có thể muốn thay đổi thứ tự hiển thị của các cột trên từng thiết bị, ví dụ: hiển thị ảnh trước văn bản trên mobile, nhưng ngược lại trên desktop. Bootstrap hỗ trợ giải pháp này thông qua class .order-*, dựa trên tính năng sắp xếp phần tử của Flexbox.

Các class order-* có sẵn bao gồm:

ClassGiá trị CSSMô tả
.order-firstorder: -1Luôn hiển thị đầu tiên
.order-0order: 0Mặc định
.order-1 → .order-5order: 1 → 5Hiển thị theo thứ tự tăng dần
.order-lastorder: 6Luôn hiển thị cuối cùng

Ví dụ: Đảo vị trí hai cột:

           <div class="border row">
               <div class="border col order-2">Cột 1 (hiển thị sau)</div>

               <div class="border col order-1">Cột 2 (hiển thị trước)</div>
           </div>

Trong đó, mặc dù mã HTML có “Cột 1” nằm trước “Cột 2”, nhưng khi hiển thị, “Cột 2” sẽ hiển thị trước nhờ order-1 < order-2.

Nesting Grid

Trong quá trình xây dựng giao diện với Bootstrap, đôi khi bạn sẽ cần chia cột bên trong một cột khác. Ví dụ: bố cục 2 cột lớn, mỗi cột lại chia thành 2 phần nhỏ. Đó chính là lúc Nesting Grid (lưới lồng nhau) trở nên cực kỳ hữu ích.

Bootstrap Grid hỗ trợ lồng các .row.col-* bên trong một .col khác. Miễn là bạn giữ đúng cấu trúc: .row chứa .col, thì bạn có thể lồng bao nhiêu cấp tuỳ ý (nhưng nên giữ ở mức vừa phải để dễ bảo trì).

Ví dụ:

       <div class="container">
           <div class="row">
             <div class="col-md-8">
               <h4>Nội dung chính</h4>
               <div class="row">
                 <div class="col-sm-6">
                   <div class="p-3 bg-light">Hình ảnh sản phẩm</div>
                 </div>

                 <div class="col-sm-6">
                   <div class="p-3 bg-light">Mô tả chi tiết</div>
                 </div>
               </div>
             </div>

             <div class="col-md-4">
               <h4>Sidebar</h4>
               <div class="p-3 bg-secondary text-white">🔎 Tìm kiếm</div>
             </div>
           </div>
       </div>

Trong đó:

  • Cột trái chiếm 2/3 chiều rộng (8 cột trong hệ thống 12 cột). Bên trong chia thành 2 phần nhỏ để hiển thị: hình ảnh và mô tả
  • Cột phải chiếm 1/3 chiều rộng (4 cột) dùng làm sidebar

Lưu ý khi triển khai Grid lồng nhau:

  • .row phải nằm trong .col: Không được lồng .row trực tiếp trong .row
  • .row mới chia lại 12 cột: Cột con bên trong .col sẽ tính lại theo 12 cột
  • Gutter áp dụng độc lập: .row con có khoảng cách riêng (có thể dùng .g-0 để xoá nếu cần)

Grid responsive với breakpoint trong Bootstrap

Một trong những điểm mạnh nhất của hệ thống Grid trong Bootstrap là khả năng responsive theo từng kích thước màn hình, nhờ vào hệ thống 6 breakpoint class được định nghĩa sẵn. Với những class này, bạn có thể tùy chỉnh kích thước cột theo từng loại thiết bị từ mobile đến desktop mà không cần viết CSS thủ công hay media query.

Bootstrap chia layout responsive thành 6 mốc kích thước cụ thể:

BreakpointClass prefixChiều rộng màn hình
Extra small.col-<576px
Small.col-sm-≥576px
Medium.col-md-≥768px
Large.col-lg-≥992px
Extra large.col-xl-≥1200px
XXL.col-xxl-≥1400px

Ví dụ sử dụng Grid responsive:

     <div class="row">
       <div class="col-12 col-md-6 col-lg-4">Cột 1</div>
       <div class="col-12 col-md-6 col-lg-4">Cột 2</div>
       <div class="col-12 col-md-12 col-lg-4">Cột 3</div>
     </div>

Trong đó:

  • Mobile (<768px): Mỗi cột chiếm toàn bộ chiều rộng (.col-12), hiển thị theo chiều dọc.
  • Tablet (≥768px): Hai cột đầu chiếm mỗi cột 6/12 (.col-md-6), cột thứ 3 chiếm trọn dòng.
  • Desktop (≥992px): Mỗi cột chỉ chiếm 4/12 (col-lg-4), ba cột nằm trên một hàng duy nhất.

Một ví dụ tổng hợp nhiều tính năng reponsive trong Grid:

<div class="border row">
    <div class="bg-warning col-12 col-sm-6 col-lg-3 order-3 order-lg-1">Sidebar</div>
  <div class="bg-primary text-white col-12 col-lg-6 order-1 order-lg-2">Nội dung chính</div>
 <div class="bg-secondary text-white col-12 col-sm-6 col-lg-3 order-2 order-lg-3">Thông tin phụ</div>
</div>

Trên mobile:

  • Mỗi thành phần sẽ nằm trên 1 hàng (col-12)
  • “Nội dung chính” xuất hiện đầu tiên (order-1)
  • “Thông tin phụ” ở giữa (order-2)
  • “Sidebar” ở cuối (order-3)

Trên desktop:

  • “Sidebar” chuyển lên đầu (order-lg-1) chiếm 3 cột (col-lg-3)
  • “Nội dung chính” ở giữa (order-lg-2) chiếm 3 cột (col-lg-3)
  • “Thông tin phụ” ở cuối (order-lg-3) chiếm 6 cột (col-lg-6)

Khi nào dùng Grid, khi nào dùng Flex?

Trong Bootstrap, cả Grid system và Flexbox đều được xây dựng dựa trên Flex, nhưng chúng phục vụ mục đích khác nhau. Việc lựa chọn dùng Grid hay Flex không chỉ là vấn đề cú pháp, mà còn ảnh hưởng trực tiếp đến cách bạn thiết kế và kiểm soát bố cục.

Dùng Grid khi:

  • Bạn đang xây dựng layout tổng thể của trang hoặc component (ví dụ: 2 cột nội dung chính và sidebar).
  • Trang web cần chia tỷ lệ bố cục theo hệ 12 cột và responsive tự động theo breakpoint.
  • Hệ thống yêu cầu phải dễ bảo trì, mở rộng layout mà không cần can thiệp nhiều vào CSS.

Vì vậy, Grid cực kỳ phù hợp để thiết kế bố cục lớn hoặc lưới nội dung như danh sách sản phẩm, card gallery, layout trang chi tiết…

Dùng Flex khi:

  • Bạn muốn canh giữa, giãn cách hoặc thay đổi trật tự phần tử trong một hàng hoặc cột.
  • Bạn chỉ cần điều chỉnh layout nhỏ trong component, không phải toàn bộ trang.
  • Bạn đang xử lý các phần tử không theo tỷ lệ 12 cột (ví dụ: logo + menu + nút đăng nhập).

Flex rất hữu ích cho việc định vị nhanh, xử lý layout nhỏ bên trong thẻ nav, header, form, button group…

Những lưu ý khi dùng Grid trong Bootstrap

Hệ thống Grid của Bootstrap rất mạnh và dễ dùng, nhưng nếu không nắm rõ một số nguyên tắc cốt lõi, bạn rất dễ gặp lỗi như vỡ layout, sai thứ tự, hoặc không responsive như mong muốn. Dưới đây là những lưu ý quan trọng bạn cần ghi nhớ khi sử dụng Grid:

  • Phần tử sử dụng .row phải nằm trong .container hoặc .container-fluid: .container giúp canh lề, giới hạn chiều rộng và cung cấp ngữ cảnh để hệ thống Grid hoạt động chính xác. Nếu bạn đặt .row bên ngoài .container, bố cục có thể bị tràn mép hoặc căn chỉnh sai.
     <div class="container">
       <div class="row">
         <div class="col">...</div>
       </div>
     </div>
  • .col-* phải nằm trực tiếp bên trong .row: Đây là nguyên tắc bắt buộc. Nếu bạn đặt .col-* bên ngoài hoặc không nằm trực tiếp trong .row, Bootstrap không thể xử lý Grid đúng cách.
       <div class="row">
         <div class="col">...</div>
         <div class="col">...</div>
         <div class="col">...</div>
       </div>
  • Tổng số cột trong một .row không được vượt quá 12: Hệ thống Grid của Bootstrap hoạt động trên nguyên lý chia layout thành 12 cột. Nếu tổng số .col-* trong một hàng vượt quá 12, các phần tử sẽ tự động xuống dòng có thể không như bạn mong muốn.
       <div class="row">
         <div class="col-4">4</div>
         <div class="col-4">4</div>
         <div class="col-4">4</div> <!-- Tổng 12 -->
       </div>
  • Tránh lạm dụng Nesting (lưới lồng nhau) quá nhiều cấp: Mặc dù Bootstrap cho phép bạn lồng .row và .col nhiều cấp để tạo layout phức tạp, nhưng nếu lồng quá sâu sẽ dẫn đến khó bảo trì, dễ gây xung đột gutter và anh hưởng hiệu suất trình duyệt. Chỉ nesting khi cần chia nhỏ layout bên trong một cột lớn, và nên dừng ở 1–2 cấp tối đa.

Ví dụ nesting quá sâu (không tối ưu):

       <div class="row">
         <div class="col-md-6">
           <div class="row">
             <div class="col-12">
               <div class="row">
                 <div class="col-6">Tên sản phẩm</div>
                 <div class="col-6">Giá</div>
               </div>
             </div>
           </div>
         </div>
       </div>

Cách viết gọn gàng hơn (giữ nesting ở mức hợp lý):

       <div class="row">
         <div class="col-md-6">
           <div class="row">
             <div class="col-6">Tên sản phẩm</div>
             <div class="col-6">Giá</div>
           </div>
         </div>
       </div>

Bài tập luyện tập Grid Bootstrap

Bài tập 1 – Cơ bản

Tạo một danh sách gồm 4 sản phẩm hiển thị theo dạng lưới.

  • Trên mobile: mỗi hàng 1 sản phẩm
  • Trên tablet trở lên (≥768px): mỗi hàng 2 sản phẩm
Lời giải Bài tập 1
  • Dùng .col-12 để mỗi phần tử đều chiếu 12 cột (1 hàng) cho mobile
  • Dùng .col-md-6 cho tablet trở lên để mỗi hàng sẽ có 2 phần tử (mỗi phần tử chiếm 6 cột)
     <div class="container">
       <div class="row">
         <div class="p-3 col-12 col-md-6 border">Sản phẩm 1</div>
         <div class="p-3 col-12 col-md-6 border">Sản phẩm 2</div>
         <div class="p-3 col-12 col-md-6 border">Sản phẩm 3</div>
         <div class="p-3 col-12 col-md-6 border">Sản phẩm 4</div>
       </div>
     </div>

Bài tập 2 – Trung bình

Tạo layout blog có: Sidebar bên trái (chiếm 3/12), nội dung bài viết bên phải (chiếm 9/12).

  • Trên mobile: Sidebar nằm dưới cùng, nội dung ở trên
  • Trên desktop: Sidebar nằm bên trái
Lời giải Bài tập 2
  • Dùng .col-12 để tất cả cột hiển thị 100% chiều ngang trên mobile.
  • Dùng .col-lg-3 và .col-lg-9 để chia layout sidebar/nội dung theo tỷ lệ 3/9 trên desktop (≥992px).
  • Dùng .order-2 và .order-lg-1 để thay đổi thứ tự hiển thị giữa mobile và desktop – giúp nội dung chính lên trước trên mobile, sidebar lên trước trên desktop.
     <div class="container">
       <div class="row g-3">
         <div class="p-2 col-12 col-lg-3 order-2 order-lg-1 border">📚 Sidebar</div>
      <div class="p-2 col-12 col-lg-9 order-1 order-lg-2 border">📝 Nội dung bài viết</div>
       </div>
     </div>

Bài tập 3 – Khó

Tạo bố cục chi tiết sản phẩm với cấu trúc sau:

Trên desktop:

  • Bên trái (6/12): ảnh lớn + ảnh phụ (chia 2 cột nhỏ)
  • Bên phải (6/12): tiêu đề, mô tả, giá, nút mua

Trên mobile: ảnh và thông tin xếp dọc.

Lời giải Bài tập 3
  • Chia bố cục chính thành 2 phần: ảnh (bên trái) và thông tin (bên phải), mỗi phần chiếm .col-lg-6 (50%) trên desktop, .col-12 trên mobile.
  • Dùng Grid lồng nhau (nesting) bên trong cột ảnh để chia tiếp thành 1 ảnh lớn và 2 ảnh nhỏ.
  • Áp dụng img-fluid giúp ảnh co giãn theo màn hình, giữ được tính responsive.
  • Sử dụng .row và .g-4 tạo khoảng cách đều giữa các phần tử, giúp layout thông thoáng và dễ đọc.
     <div class="container">
       <div class="row g-4">
         <!-- Ảnh sản phẩm -->
         <div class="col-12 col-lg-6">
           <div class="row g-2">
    <div class="col-12"><img src="https://itviec.com/assets/logo_black_text-04776232a37ae9091cddb3df1973277252b12ad19a16715f4486e603ade3b6a4.png" class="img-fluid" alt="Ảnh sản phẩm lớn"></div>
             <div class="col-6"><img src="https://itviec.com/blog/wp-content/uploads/2016/10/homepage3-1.png" class="img-fluid rounded border" alt="Ảnh phụ 1"></div>
             <div class="col-6"><img src="https://itviec.com/assets/it_stories/social-image-thumbnail-64975e87e9fc54100844057f5cfb4a0e93082ab344dff63e0b5c480350a8b837.png" class="img-fluid rounded border" alt="Ảnh phụ 2"></div>
           </div>
         </div>

         <!-- Thông tin sản phẩm -->

         <div class="col-12 col-lg-6">
           <h3>Tên sản phẩm</h3>
           <p>Mô tả ngắn gọn về sản phẩm...</p>
           <div class="mb-2 fw-bold text-danger">Giá: 1.290.000₫</div>
           <button class="btn btn-primary">🛒 Thêm vào giỏ</button>
         </div>
       </div>
     </div>

Câu hỏi thường gặp về Bootstrap Grid

col-auto và col khác nhau gì?

Cả hai class đều dùng để tạo cột trong hệ thống Grid, nhưng mục đích và cách hoạt động lại rất khác nhau:

  • .col là class chia đều không gian còn lại giữa các cột. Nếu bạn đặt nhiều cột col trong cùng một hàng, Bootstrap sẽ tự động phân chia chiều rộng các cột theo tỷ lệ bằng nhau.
  • .col-auto chỉ chiếm vừa đủ không gian theo nội dung bên trong, không co giãn hay chia đều. Đây là lựa chọn lý tưởng cho các phần tử nhỏ như nút, biểu tượng, nhãn, v.v.

Ví dụ:

       <div class="row">
         <div class="col-auto">Nút nhỏ</div>
         <div class="col">Nội dung mở rộng</div>
       </div>

Tại sao offset không hoạt động?

Nhiều người mới dùng Grid thường gặp tình huống offset không có tác dụng. Dưới đây là những lý do phổ biến:

  • Dùng sai breakpoint: Ví dụ class offset-md-2 chỉ có hiệu lực khi kích thước màn hình từ 768px trở lên. Nếu bạn đang xem trên thiết bị nhỏ hơn, offset sẽ không áp dụng.
  • Không nằm trong .row: offset chỉ hoạt động khi các .col-* nằm trực tiếp trong một .row. Nếu bạn bỏ qua .row, hệ thống Grid sẽ không hoạt động đúng, kéo theo offset cũng vô hiệu.
  • Thiếu class .col-*: offset không thể hoạt động độc lập. Bạn cần kết hợp nó với một class .col-* tương ứng.

Ví dụ sử dụng đúng offset:

       <div class="row">
         <div class="col-md-6 offset-md-3">
           Cột này được đẩy vào giữa nhờ offset
         </div>
       </div>

Grid có cần Flex không?

Hệ thống Grid của Bootstrap được xây dựng dựa trên Flexbox, vì vậy Grid cần có Flex để hoạt động đúng. Cụ thể:

  • .row thực chất là một flex container (display: flex)
  • Các .col-* là các flex item
  • Hệ thống tự động wrap, sắp xếp, và giãn cột đều dựa trên nguyên tắc của Flexbox

Vì vậy, bạn không bắt buộc phải dùng class Flex riêng, nhưng hoàn toàn có thể kết hợp nếu muốn tùy chỉnh sâu hơn. Điều này giúp bạn tận dụng tối đa sức mạnh layout hiện đại mà không cần viết thêm CSS.

Tổng Kết

Hệ thống Grid trong Bootstrap là nền tảng mạnh mẽ giúp bạn xây dựng bố cục linh hoạt, responsive và nhất quán mà không cần viết nhiều CSS tùy chỉnh. Với cách tổ chức 12 cột, tích hợp breakpoint và hỗ trợ Flexbox, Grid phù hợp với mọi dự án web – từ landing page đơn giản đến dashboard phức tạp. Qua bài viết này, ITviec hy vọng bạn đã nắm vững cách sử dụng Grid để tạo ra giao diện chuẩn, dễ bảo trì và tối ưu trải nghiệm người dùng trên mọi thiết bị.

TÁC GIẢ
Phạm Hữu Ngọc
Phạm Hữu Ngọc

Software Engineer

Ngọc Phạm – một kỹ sư phần mềm với hơn 5 năm kinh nghiệm, từng tham gia phát triển các dự án đa dạng cho khách hàng tại Mỹ, Nhật Bản và Việt Nam. Với niềm đam mê sáng tạo và tinh thần không ngừng học hỏi, Ngọc luôn tìm kiếm những giải pháp tối ưu, nâng cao chất lượng sản phẩm và sẵn sàng chinh phục những thách thức công nghệ mới. Hiện tại, Ngọc là Software Engineer tại Voyager Inc., chuyên làm việc với Ruby on Rails, Python, ReactJS và NuxtJS. Với nền tảng vững chắc về phát triển web, API backend và frontend hiện đại, Ngọc không chỉ tập trung vào việc xây dựng các ứng dụng mạnh mẽ, linh hoạt mà còn chú trọng đến trải nghiệm người dùng, bảo mật và khả năng mở rộng hệ thống.