CSS Gap Space với Flexbox

CSS Flexbox và CSS Grid là những công cụ tuyệt vời có sẵn để quản lý bố cục trên Web. Flexbox xử lý bố cục đơn chiều rất tốt trong khi CSS Grid xử lý bố cục hai chiều với cột và hàng.

Thường thì chúng ta muốn thêm không gian giữa các item trong bố cục của mình. Bài viết này sẽ chỉ ra cách thực hiện việc này bằng cách sử dụng thuộc tính CSS gap trong Flexbox và các cách giải quyết cần thiết để hỗ trợ trình duyệt hợp lý.

Inline Flex

Để chứng minh CSS Gap, chúng ta sẽ sử dụng Flexbox. CSS Gap hoạt động trong CSS Grid, nhưng có nhiều trường hợp chúng ta có danh sách nội tuyến cần khoảng trống mà không có Grid xác định.

<div class="flex-gap">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>

// CSS
.flex-gap {
  display: inline-flex;
  flex-wrap: wrap;
}

Chúng ta sử dụng inline-flex để có thể có các mục flex nhưng hiển thị phần tử mẹ của chúng ta dưới dạng phần tử inline thay vì phần tử block.

Thuộc tính flex-wrap: wrap sẽ cho phép các mục của chúng ta xuống hàng khi vùng chứa parent bị thu hẹp hoặc bị hạn chế.

CSS Gap Space với Flexbox
CSS flex wrap

Nếu chúng ta muốn thêm khoảng cách giữa mỗi item, chúng ta có thể sử dụng margin trên mỗi item.

.flex-gap {
  display: inline-flex;
  flex-wrap: wrap;
}

.flex-gap > div {
  margin: 6px;
}
Css flex wrap and margin space
Css flex wrap and margin space

Margins hoạt động nhưng không phải giống như CSS Gap space. Chú ý không gian thừa xung quanh các item. Chúng ta chỉ muốn áp dụng khoảng cách giữa các item. Sử dụng CSS Gap, chúng ta có thể đạt được điều này.

.flex-gap {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 12px;
}
Css flex wrap with css gap spacing
Css flex wrap with css gap spacing

CSS Gap là một tính năng của CSS Grid spec và Flexbox; tuy nhiên, hiện tại Firefox là trình duyệt chính duy nhất hỗ trợ gap trên các flex items.

Vì thiếu sự hỗ trợ của trình duyệt, để đạt được hiệu quả tương tự, chúng ta sẽ cần sử dụng một số bản hack CSS với margins.

<div class="emulated-flex-gap">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>

//CSS
.emulated-flex-gap > * {
  margin: 12px 0 0 12px;
}

.emulated-flex-gap {
  display: inline-flex;
  flex-wrap: wrap;
  margin: -12px 0 0 -12px;
  width: calc(100% + 12px);
}

Chúng ta có thể đặt margin ở trên cùng và bên trái của mỗi item. Trên phần tử cha flex, chúng ta có thể sử dụng margin âm để bù lại phần dư thừa trên các phần tử bên ngoài để có được hiệu ứng tương tự như CSS gap space.

Css flex wrap with css gap spacing
Css flex wrap with css gap spacing

Chúng ta có thể clean CSS một chút bằng cách sử dụng CSS Custom Properties để thay đổi khoảng cách lề dễ dàng hơn.

.emulated-flex-gap {
  --gap: 12px;
  display: inline-flex;
  flex-wrap: wrap;
  margin: calc(-1 * var(--gap)) 0 0 calc(-1 * var(--gap));
  width: calc(100% + var(--gap));
}

.emulated-flex-gap > * {
  margin: var(--gap) 0 0 var(--gap);
}

Với cách giải quyết này, chúng ta có thể có được thứ gì đó gần với CSS Gap trong tất cả các trình duyệt. Hy vọng sẽ sớm thấy hỗ trợ trình duyệt được cải thiện cho CSS gap vì nó tăng cường quản lý bố cục bằng CSS. Với CSS Gap spacing, chúng ta có thể loại bỏ rất nhiều khoảng trắng phức tạp trong CSS khi sử dụng margin.

Xem bản demo đầy đủ bên dưới!

Nguồn bài viết: https://coryrylan.com/blog/css-gap-space-with-flexbox

Oh My Zsh: Nâng cao trải nghiệm terminal với giao diện đẹp và các plugin tăng hiệu suất! Git cherry-pick là gì? Cách sử dụng và ví dụ Git Rebase: Gộp nhiều commit thành một để tối ưu hóa lịch sử commit 11 tính năng JavaScript mới tuyệt vời trong ES13 (ES2022) CSS diệu kỳ: Các thuộc tính CSS mà bạn có thể chưa biết Auto deploy projects với GitHub Actions – sử dụng ssh-action WordPress Gutenberg Block Server Side Render Add, Upload image trong Gutenberg Block Development Tạo Block Controls – Block Toolbar và Settings Sidebar trong WordPress Gutenberg Làm quen với các components thường dùng khi tạo Gutenberg Block

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.