Ada banyak pertanyaan dan artikel tentang ini, tetapi sejauh ini tidak ada yang konklusif. Ringkasan terbaik yang bisa saya temukan adalah
flex-basis memungkinkan Anda untuk menentukan ukuran awal / awal elemen, sebelum hal lain dihitung. Ini bisa berupa persentase atau nilai absolut.
... yang dengan sendirinya tidak banyak bicara tentang perilaku elemen dengan set basis fleksibel . Dengan pengetahuan saya saat ini tentang flexbox, saya tidak mengerti mengapa itu tidak bisa menggambarkan lebar juga.
Saya ingin tahu bagaimana tepatnya flex-basis berbeda dari lebar dalam praktiknya:
- Jika saya ganti lebar dengan basis flex (dan sebaliknya), apa yang akan berubah secara visual?
- Apa yang terjadi jika saya menetapkan keduanya ke nilai yang berbeda? Apa yang terjadi jika mereka memiliki nilai yang sama?
- Apakah ada beberapa kasus khusus di mana menggunakan lebar atau basis-fleksibel akan memiliki perbedaan yang signifikan untuk menggunakan yang lain?
- Bagaimana perbedaan lebar dan dasar-fleksibel bila digunakan bersama dengan gaya-gaya kotak fleksibel lainnya, seperti flex-wrap , flex-grow dan flex-shrink ?
- Adakah perbedaan signifikan lainnya?
Sunting / klarifikasi : Pertanyaan ini telah ditanyakan dalam format yang berbeda di Apa set properti berbasis flex yang sebenarnya? tapi saya merasa perbandingan atau ringkasan yang lebih langsung dari perbedaan basis-fleksibel dan lebar (atau tinggi ) akan menyenangkan.
Jawaban:
Mempertimbangkan
flex-direction
Hal pertama yang terlintas dalam pikiran ketika membaca pertanyaan Anda adalah bahwa hal
flex-basis
itu tidak selalu berlakuwidth
.Ketika
flex-direction
adalahrow
,flex-basis
kontrol lebar.Tapi ketika
flex-direction
adalahcolumn
,flex-basis
kontrol tinggi.Perbedaan utama
Berikut adalah beberapa perbedaan penting antara
flex-basis
danwidth
/height
:flex-basis
hanya berlaku untuk item fleksibel. Wadah fleksibel (yang juga bukan item fleksibel) akan diabaikanflex-basis
tetapi dapat digunakanwidth
danheight
.flex-basis
hanya bekerja pada poros utama. Misalnya, jika Anda berada di dalamflex-direction: column
,width
properti akan diperlukan untuk mengukur item fleksibel secara horizontal.flex-basis
tidak berpengaruh pada item fleksibel yang benar-benar diposisikan.width
danheight
properti akan diperlukan. Item fleksibel yang diposisikan benar-benar tidak berpartisipasi dalam tata letak flex .Dengan menggunakan
flex
properti, tiga properti -flex-grow
,flex-shrink
danflex-basis
- dapat digabungkan dengan rapi menjadi satu deklarasi. Menggunakanwidth
, aturan yang sama akan membutuhkan banyak baris kode.Perilaku Browser
Dalam hal bagaimana mereka diterjemahkan, seharusnya tidak ada perbedaan antara
flex-basis
danwidth
, kecualiflex-basis
adaauto
ataucontent
.Dari spec:
Tetapi dampak
auto
ataucontent
mungkin minimal atau tidak sama sekali. Lebih dari spec:Jadi, sesuai dengan spesifikasi,
flex-basis
danwidth
menyelesaikan secara identik, kecualiflex-basis
adaauto
ataucontent
. Dalam kasus seperti itu,flex-basis
dapat menggunakan lebar konten (yang, mungkin,width
properti juga akan digunakan).The
flex-shrink
faktorPenting untuk mengingat pengaturan awal wadah fleksibel. Beberapa pengaturan ini meliputi:
flex-direction: row
- item fleksibel akan sejajar secara horizontaljustify-content: flex-start
- item fleksibel akan menumpuk di awal garis pada sumbu utamaalign-items: stretch
- item fleksibel akan meluas untuk menutupi ukuran silang wadahflex-wrap: nowrap
- item fleksibel dipaksa untuk tetap dalam satu barisflex-shrink: 1
- item fleksibel diperbolehkan menyusutPerhatikan pengaturan terakhir.
Karena item fleksibel diperbolehkan menyusut secara default (yang mencegahnya meluap wadah),
flex-basis
/width
/ yang ditentukanheight
mungkin ditimpa.Misalnya,
flex-basis: 100px
atauwidth: 100px
, ditambah denganflex-shrink: 1
, tidak harus 100px.Untuk membuat lebar yang ditentukan - dan tetap memperbaikinya - Anda harus menonaktifkan penyusutan:
ATAU
ATAU, seperti yang direkomendasikan oleh spesifikasi:
Bug Peramban
Beberapa browser mengalami kesulitan menentukan ukuran item fleksibel dalam wadah fleksibel bersarang.
flex-basis
diabaikan dalam wadah fleksibel bersarang.width
bekerja.Saat menggunakan
flex-basis
, wadah mengabaikan ukuran anak-anaknya, dan anak-anak meluap wadah. Tetapi denganwidth
properti itu, wadah itu menghormati ukuran anak-anaknya dan memperluasnya.Referensi:
Contoh:
item fleksibel menggunakan
flex-basis
danwhite-space: nowrap
meluapinline-flex
wadah.width
bekerja.Tampaknya wadah fleksibel diatur untuk
inline-flex
tidak mengenaliflex-basis
seorang anak saat memberikan saudara kandungwhite-space: nowrap
(meskipun itu bisa saja item dengan lebar yang tidak ditentukan). Wadah tidak berkembang untuk mengakomodasi barang.Tetapi ketika
width
properti itu digunakan alih-alihflex-basis
, wadah itu menghargai ukuran anak-anaknya dan memperluasnya. Ini bukan masalah di IE11 dan Edge.Referensi:
Contoh:
flex-basis
(danflex-grow
) tidak bekerja pada elemen tabelReferensi:
flex-basis
gagal di Chrome dan Firefox ketika wadah kakek-nenek adalah elemen menyusut-agar-cocok. Set-up berfungsi dengan baik di Edge.Seperti pada contoh yang disajikan dalam tautan di atas, yang melibatkan
position: absolute
, penggunaanfloat
daninline-block
, juga akan membuat output cacat yang sama ( demo jsfiddle ).Bug yang memengaruhi IE 10 dan 11:
flex
deklarasi steno denganflex-basis
nilai unitless diabaikanflex-basis
tidak memperhitungkanbox-sizing: border-box
flex-basis
tidak mendukungcalc()
flex-basis
saat menggunakanflex
singkatansumber
min-width:100px;
? Bisakah itu menjadi opsi untuk menonaktifkan penyusutan?flex-shrink
berhenti dimin-width
. Aturan fleksibel yang setara adalahflex: 1 0 100px
.flex: 1 0 100px
mengarah ke hasil yang sama, tetapi saya tidak yakin apa yang Anda maksud dengan "setara".flex: 0 0 100px
, misalnya?Selain ringkasan bagus Michael_B, ada baiknya mengulangi ini:
Bagian penting di sini adalah inisial .
Dengan sendirinya, ini tidak menyelesaikan lebar / tinggi sampai flex tumbuh / menyusut sifat ikut bermain.
Begitu. seorang anak dengan
akan menjadi lebar 25% pada awalnya tetapi kemudian segera berkembang sebanyak mungkin sampai elemen-elemen lain masuk. Jika tidak ada .. itu akan menjadi lebar 100% / tinggi.
Demo cepat:
Tampilkan cuplikan kode
Bereksperimen dengan
flex-grow
,flex-shrink
danflex-basis
(atau singkatanflex :fg fs fb
) ... dapat menghasilkan beberapa hasil menarik.sumber
flex-basis
danwidth / height
mengatur ukuran awal / awal elemen. Sebagai contohflex-basis: 200px
pada dasarnya bekerja sama denganflex-basis: auto; width: 200px;
. Sepertinya ketikaflex-basis
tidak diatur untukauto
kemudian hanya menimpawidth / height
nilai. Satu-satunya perbedaan yang saya lihat adalah cara penanganan konten melimpah.Mungkin poin paling penting untuk ditambahkan:
Bagaimana jika browser tidak mendukung
flex
? Dalam kasus seperti itu,width/height
ambil alih dan nilainya berlaku.Ini adalah ide yang sangat bagus - hampir esensial - untuk mendefinisikan
width/height
elemen, bahkan jika Anda memiliki nilai yang sangat berbedaflex-basis
. Ingatlah untuk menguji dengan menonaktifkandisplay:flex
dan melihat apa yang Anda dapatkan.sumber
flex
.