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-basiskhông phải lúc nào cũng áp dụng width.
Khi flex-directionlà row, flex-basiskiểm soát chiều rộng.
Nhưng khi flex-directioncó column, flex-basiskiể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-basisvà width/ height:
flex-basischỉ á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-basisnhưng có thể sử dụng widthvà height.
flex-basischỉ hoạt động trên trục chính. Ví dụ: nếu bạn đang ở flex-direction: column, widthtài sản sẽ cần thiết để định cỡ các mục flex theo chiều ngang.
flex-basiskhông có tác dụng đối với các mặt hàng flex được định vị tuyệt đối. widthvà heighttà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 flextài sản, ba bất động sản - flex-grow, flex-shrinkvà 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-basisvà width, trừ khi flex-basislà autohoặc content.
Từ thông số kỹ thuật:
7.2.3. Tài flex-basissản
Đối với tất cả các giá trị khác autovà content, flex-basisđược giải quyết theo cùng một cách như widthtrong chế độ viết ngang.
Nhưng tác động của autohoặc contentcó 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, autotừ 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 autocùng với kích thước chính ( widthhoặc height) là auto.
Vì vậy, theo thông số kỹ thuật, flex-basisvà widthgiải quyết giống hệt, trừ khi flex-basislà autohoặc content. Trong các trường hợp như vậy, flex-basiscó 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 / heightcó thể bị ghi đè.
Ví dụ, flex-basis: 100pxhoặ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 flexký 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. widthlà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 widthtà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-basisvà white-space: nowraptràn inline-flexcontainer. widthlàm.
Có vẻ như một hộp chứa flex được đặt inline-flexkhô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 widthtà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-basisthấ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: absoluteviệc sử dụng floatvà 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: