Xem xét flex-direction
Điều đầu tiên bạn nghĩ đến khi đọc câu hỏi của bạn là flex-basis
không phải lúc nào cũng áp dụng width
.
Khi flex-direction
là row
, flex-basis
kiểm soát chiều rộng.
Nhưng khi flex-direction
có column
, flex-basis
kiểm soát chiều cao.
Sự khác biệt chính
Dưới đây là một số khác biệt quan trọng giữa flex-basis
và width
/ height
:
flex-basis
chỉ áp dụng cho các mục flex. Các thùng chứa Flex (không phải là các mặt hàng flex) sẽ bỏ qua flex-basis
nhưng có thể sử dụng width
và height
.
flex-basis
chỉ hoạt động trên trục chính. Ví dụ: nếu bạn đang ở flex-direction: column
, width
tài sản sẽ cần thiết để định cỡ các mục flex theo chiều ngang.
flex-basis
không có tác dụng đối với các mặt hàng flex được định vị tuyệt đối. width
và height
tài sản sẽ là cần thiết. Các mục flex được định vị tuyệt đối không tham gia vào bố trí flex .
Bằng việc sử dụng flex
tài sản, ba bất động sản - flex-grow
, flex-shrink
và flex-basis
- có thể được gọn gàng kết hợp thành một tuyên bố. Sử dụng width
, cùng một quy tắc sẽ yêu cầu nhiều dòng mã.
Hành vi trình duyệt
Về cách chúng được hiển thị, sẽ không có sự khác biệt giữa flex-basis
và width
, trừ khi flex-basis
là auto
hoặc content
.
Từ thông số kỹ thuật:
7.2.3. Tài flex-basis
sản
Đối với tất cả các giá trị khác auto
và content
, flex-basis
được giải quyết theo cùng một cách như width
trong chế độ viết ngang.
Nhưng tác động của auto
hoặc content
có thể là tối thiểu hoặc không có gì cả. Thêm từ thông số kỹ thuật:
auto
Khi được chỉ định trên một mục flex, auto
từ khóa sẽ lấy giá trị của thuộc tính kích thước chính như được sử dụng flex-basis
. Nếu giá trị đó là chính nó auto
, thì giá trị được sử dụng là content
.
content
Biểu thị kích thước tự động, dựa trên nội dung của mục flex.
Lưu ý: Giá trị này không có trong bản phát hành ban đầu của Bố cục hộp linh hoạt và do đó một số triển khai cũ hơn sẽ không hỗ trợ nó. Hiệu quả tương đương có thể đạt được bằng cách sử dụng auto
cùng với kích thước chính ( width
hoặc height
) là auto
.
Vì vậy, theo thông số kỹ thuật, flex-basis
và width
giải quyết giống hệt, trừ khi flex-basis
là auto
hoặc content
. Trong các trường hợp như vậy, flex-basis
có thể sử dụng chiều rộng nội dung (có lẽ làwidth
tài sản cũng sẽ sử dụng).
Các flex-shrink
yếu tố
Điều quan trọng là phải nhớ các cài đặt ban đầu của thùng chứa flex. Một số cài đặt này bao gồm:
flex-direction: row
- Các mục flex sẽ căn chỉnh theo chiều ngang
justify-content: flex-start
- các mục flex sẽ xếp chồng ở đầu dòng trên trục chính
align-items: stretch
- vật phẩm flex sẽ mở rộng để bao phủ kích thước chéo của container
flex-wrap: nowrap
- các mặt hàng flex bị buộc phải ở trong một dòng duy nhất
flex-shrink: 1
- một vật phẩm flex được phép thu nhỏ
Lưu ý cài đặt cuối cùng.
Bởi vì các mục flex được phép thu nhỏ theo mặc định (điều này ngăn chúng tràn vào vùng chứa), nên chỉ định flex-basis
/width
/ height
có thể bị ghi đè.
Ví dụ, flex-basis: 100px
hoặcwidth: 100px
, cùng với flex-shrink: 1
, sẽ không nhất thiết phải là 100px.
Để hiển thị chiều rộng được chỉ định - và giữ cố định - bạn sẽ cần phải tắt thu hẹp:
div {
width: 100px;
flex-shrink: 0;
}
HOẶC LÀ
div {
flex-basis: 100px;
flex-shrink: 0;
}
HOẶC, theo khuyến nghị của thông số kỹ thuật:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2. Các thành phần của tính linh hoạt
Các tác giả được khuyến khích kiểm soát tính linh hoạt bằng cách sử dụng tốc flex
ký thay vì trực tiếp với các thuộc tính của nó, vì tốc ký sẽ đặt lại chính xác bất kỳ thành phần không xác định nào để phù hợp với việc sử dụng chung .
Lỗi trình duyệt
Một số trình duyệt gặp khó khăn khi định cỡ các mục flex trong các thùng chứa flex lồng nhau.
flex-basis
bỏ qua trong một container flex lồng nhau. width
làm.
Khi sử dụng flex-basis
, container bỏ qua kích thước của trẻ em và trẻ em tràn vào container. Nhưng với width
tài sản, container tôn trọng kích thước của con cái và mở rộng tương ứng.
Người giới thiệu:
Ví dụ:
vật phẩm flex sử dụng flex-basis
và white-space: nowrap
tràn inline-flex
container. width
làm.
Có vẻ như một hộp chứa flex được đặt inline-flex
không nhận ra flex-basis
ở trẻ khi kết xuất anh chị em vớiwhite-space: nowrap
(mặc dù nó chỉ có thể là một vật phẩm có chiều rộng không xác định). Các container không mở rộng để chứa các mặt hàng.
Nhưng khi width
tài sản được sử dụng thay vìflex-basis
, container tôn trọng kích thước của con cái và mở rộng tương ứng. Đây không phải là vấn đề trong IE11 và Edge.
Người giới thiệu:
Thí dụ:
flex-basis
(và flex-grow
) không hoạt động trên phần tử bảng
Người giới thiệu:
flex-basis
thất bại trong Chrome và Firefox khi thùng chứa ông bà là một yếu tố thu nhỏ để phù hợp. Thiết lập hoạt động tốt trong Edge.
Giống như trong ví dụ được trình bày trong liên kết ở trên, liên quan đến position: absolute
việc sử dụng float
và inline-block
, cũng sẽ hiển thị cùng một đầu ra không hoàn hảo ( bản demo jsfiddle ).
Lỗi ảnh hưởng đến IE 10 và 11: