Khóa học IT CSS Cơ bản 031_Bố cục lưới Grid
Bố cục lưới Grid
Lưới là một chế độ bố cục bao gồm một loạt các đường ngang và dọc. Với lưới, chúng ta có thể sắp xếp các phần tử thiết kế, giúp chúng ta thiết kế các trang có các phần tử với vị trí và chiều rộng cố định, làm cho các trang web của chúng ta thống nhất hơn.
Một lưới thường có nhiều cột (column) và hàng (row), cũng như các khoảng cách giữa các hàng và cột, khoảng cách này thường được gọi là gutter.

Khái niệm cơ bản
Bố cục Grid bao gồm các khái niệm cơ bản sau:
- Container lưới (grid container): Bố cục lưới bao gồm container lưới và item lưới. Container lưới là container đặt các item lưới vào lưới. Container lưới có thể là bất kỳ phần tử nào, nhưng thường sử dụng phần tử
div. - Item lưới (grid item): Item lưới là các phần tử được đặt trong container lưới. Item lưới có thể là bất kỳ phần tử nào, nhưng thường sử dụng phần tử
div. - Đường lưới (grid line): Đường lưới là các đường chia container lưới thành các hàng và cột. Đường lưới có thể là đường ngang hoặc dọc.
- Cột lưới (grid column): Cột lưới là các đường dọc trong container lưới.
- Hàng lưới (grid row): Hàng lưới là các đường ngang trong container lưới.
Các thuộc tính thường dùng
Thuộc tính Container lưới
Container lưới có các thuộc tính sau để kiểm soát bố cục lưới:
display: Đặt chế độ hiển thị của container lưới. Container lưới phải được đặt thànhdisplay: gridhoặcdisplay: inline-gridđể sử dụng bố cục lưới.grid-template-columns: Đặt số cột và chiều rộng cột của container lưới (sử dụng đơn vịfr,px,em, v.v.).grid-template-rows: Đặt số hàng và chiều cao hàng của container lưới (sử dụng đơn vịfr,px,em, v.v.).grid-template: Đặt đồng thờigrid-template-columnsvàgrid-template-rows.grid-auto-columns: Đặt chiều rộng cột của container lưới.grid-auto-rows: Đặt chiều cao hàng của container lưới.
Thuộc tính Item lưới
Item lưới có các thuộc tính sau để kiểm soát bố cục của item lưới trong lưới:
grid-column: Đặt cột của item lưới.grid-row: Đặt hàng của item lưới.grid-column-start: Đặt vị trí bắt đầu của item lưới trong cột.grid-column-end: Đặt vị trí kết thúc của item lưới trong cột.grid-row-start: Đặt vị trí bắt đầu của item lưới trong hàng.grid-row-end: Đặt vị trí kết thúc của item lưới trong hàng.grid-area: Đặt vùng của item lưới.grid-gap: Đặt khoảng cách giữa các đường lưới.
Bố cục lưới
Định nghĩa chiều rộng cột và chiều cao hàng cố định và tự thích ứng
Ví dụ:
.grid-example{ display: grid; grid-template-columns: 100px 200px auto; /* Cột đầu tiên 100px, cột thứ hai 200px, không gian còn lại phân bổ cho cột tự thích ứng */ grid-template-rows: 100px 200px auto; /* Hàng đầu tiên 100px, hàng thứ hai 200px, không gian còn lại phân bổ cho hàng tự thích ứng */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> </div>Hiệu ứng:
Sử dụng phần trăm để định nghĩa chiều rộng cột, chiều cao hàng
Ví dụ:
.grid-example{ display: grid; grid-template-columns: 30% 2fr 1fr; /* Cột đầu tiên chiếm 30%, cột thứ hai chiếm hai phần không gian còn lại, cột thứ ba chiếm một phần không gian còn lại */ grid-template-rows: 30% 2fr 1fr; /* Hàng đầu tiên chiếm 30%, hàng thứ hai chiếm hai phần không gian còn lại, hàng thứ ba chiếm một phần không gian còn lại */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> </div>Hiệu ứng:
Chia đều (phân bổ đều) chiều rộng cột, chiều cao hàng
Ví dụ:
.grid-example{ display: grid; grid-template-columns: repeat(3, 1fr); /* Ba cột bằng nhau, mỗi cột chiếm một phần không gian còn lại */ grid-template-rows: repeat(3, 1fr); /* Ba hàng bằng nhau, mỗi hàng chiếm một phần không gian còn lại */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> </div>Hiệu ứng:
Sử dụng minmax để định nghĩa chiều rộng/cao tối thiểu và tối đa cho cột, hàng
Ví dụ:
.grid-example{ display: grid; grid-template-columns: minmax(100px, 1fr) minmax(200px, 2fr); /* Cột đầu tiên chiều rộng tối thiểu 100px, chiếm một phần không gian còn lại; cột thứ hai chiều rộng tối thiểu 200px, chiếm hai phần không gian còn lại */ grid-template-rows: minmax(100px, 1fr) minmax(200px, 2fr); /* Hàng đầu tiên chiều cao tối thiểu 100px, chiếm một phần không gian còn lại; hàng thứ hai chiều cao tối thiểu 200px, chiếm hai phần không gian còn lại */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> </div>Hiệu ứng:

Khoảng cách lưới
Khoảng cách lưới được kiểm soát bởi hai thuộc tính: grid-row-gap và grid-column-gap. Ngoài ra, CSS Grid Level 2 đã giới thiệu thuộc tính gap, có thể kiểm soát cả grid-row-gap và grid-column-gap cùng lúc.
Ví dụ:
.grid-example{ display: grid; grid-template-columns: 30% 30% 30%; grid-template-rows: 200px 200px; grid-row-gap: 50px; /* Khoảng cách hàng là 50px */ grid-column-gap: 30px; /* Khoảng cách cột là 30px */ /* gap: 50px 30px; Khoảng cách hàng là 50px, khoảng cách cột là 30px */}.item{ margin: 10px; background-color: rgb(100, 150, 200);} <div class="grid-example"> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> <div class="item">Demo Grid</div> </div>Hiệu ứng:

Định vị lưới
Định vị lưới thường đề cập đến việc sử dụng các thuộc tính grid-column, grid-row và grid-area để định vị các item trong bố cục lưới. Các thuộc tính này được sử dụng để chỉ định các cột và hàng mà item chiếm trong lưới, hoặc trực tiếp chỉ định vùng mà item nằm.
grid-columnlà thuộc tính được sử dụng để đặt các cột mà item lưới trải dài. Đây là viết tắt củagrid-column-startvàgrid-column-end. Vớigrid-column, bạn có thể định nghĩa vị trí và số cột mà item lưới trải dài theo chiều ngang thuận tiện hơn.grid-rowlà thuộc tính được sử dụng để đặt các hàng mà item lưới trải dài. Đây là viết tắt củagrid-row-startvàgrid-row-end. Vớigrid-row, bạn có thể định nghĩa vị trí và số hàng mà item lưới trải dài theo chiều dọc thuận tiện hơn.- Thuộc tính
grid-arealà thuộc tính viết tắt để đặt đồng thờigrid-row-start,grid-column-start,grid-row-endvàgrid-column-end. Vớigrid-area, bạn có thể định nghĩa vị trí và kích thước của item lưới trong bố cục lưới một cách trực quan hơn.
Ví dụ:
.example { display: grid; grid-template-columns: repeat(3, 1fr); /* Định nghĩa 3 cột, mỗi cột chiếm 1 phần không gian */ grid-template-rows: repeat(2, 150px); /* Định nghĩa 2 hàng, mỗi hàng cao 150px */ gap: 10px; padding: 20px;}.item { background-color: #f2f2f2; padding: 20px; border: 1px solid #ddd; text-align: center;}/* Định vị sử dụng grid-column và grid-row */.item1 { grid-column: 1 / 3; /* Từ cột 1 đến cột 3 (cột 1+2) */ grid-row: 1 / 2; /* Từ hàng 1 đến hàng 2 (hàng 1) */}/* Định vị sử dụng grid-area */.item2 { grid-area: 2 / 2 / 3 / 4; /* Từ hàng 2 cột 2 đến hàng 3 cột 4 (hàng 2)(cột 2+3) */}<div class="example"> <div class="item item1">Item 1</div> <div class="item item2">Item 2</div> <div class="item">Item 3</div> <div class="item">Item 4</div> <div class="item">Item 5</div> <div class="item">Item 6</div></div>Hiệu ứng:

Ví dụ:
body { margin: 0; padding: 0;}
.container { display: grid; grid-template-columns: 1fr 2fr; /* Định nghĩa hai cột, cột đầu tiên chiếm một phần, cột thứ hai chiếm hai phần */ grid-template-rows: auto; /* Định nghĩa chiều cao hàng, hàng đầu tiên và thứ ba chiều cao được xác định bởi nội dung, hàng thứ hai chiếm không gian còn lại */ grid-template-areas: "header header" "sidebar main" "footer footer"; /* Định nghĩa bố cục vùng, mỗi vùng được biểu thị bằng một chuỗi, dấu cách phân tách các ô, xuống dòng biểu thị hàng mới */ min-height: 100vh; /* Đặt chiều cao tối thiểu để đảm bảo footer có thể nhìn thấy khi chiều cao nội dung nhỏ hơn viewport */}
.header { grid-area: header; /* Đặt .header vào vùng có tên "header" */ background-color: #333; color: #fff; padding: 10px;}
.sidebar { grid-area: sidebar; /* Đặt .sidebar vào vùng có tên "sidebar" */ background-color: #f2f2f2; padding: 10px;}
.main { grid-area: main; /* Đặt .main vào vùng có tên "main" */ padding: 10px;}
.footer { grid-area: footer; /* Đặt .footer vào vùng có tên "footer" */ background-color: #333; color: #fff; padding: 10px;} <div class="container"> <div class="header">Header</div> <div class="sidebar">Sidebar</div> <div class="main"> <h1>Main Content</h1> <p>This is the main content area.</p> </div> <div class="footer">Footer</div> </div>Hiệu ứng:
