Apa yang dimaksud dengan flex: 1?

129

Seperti yang kita semua tahu, flexproperti adalah singkatan untuk flex-grow, flex-shrink, dan flex-basisproperti. Nilai defaultnya adalah 0 1 auto, yang artinya

flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;

tapi saya perhatikan, di banyak tempat flex: 1digunakan. Apakah itu singkatan untuk 1 1 autoatau 1 0 auto? Saya tidak mengerti apa artinya dan saya tidak mendapatkan apa-apa saat mencari di Google.

Md. Rafee
sumber
1
mengutip w3schools.com "Properti flex adalah singkatan dari properti flex-grow, flex-shrink, dan flex-basis"
Imran Ali

Jawaban:

86

Berikut penjelasannya:

https://www.w3.org/TR/css-flexbox-1/#flex-common

flex: <positive-number>
Setara dengan flex: <positive-number> 1 0. Menjadikan item flex fleksibel dan menyetel basis flex ke nol, menghasilkan item yang menerima proporsi tertentu dari ruang kosong di container flex. Jika semua item dalam wadah fleksibel menggunakan pola ini, ukurannya akan proporsional dengan faktor fleksibel yang ditentukan.

Oleh karena flex:1itu setara denganflex: 1 1 0

Danut Pralea
sumber
10
melenturkan: 1; tidak sama dengan flex: 1 1 0; lihat jawaban saya di bawah untuk melihat alasannya.
DreamTeK
Di samping catatan: Saya pikir ketika Anda menerapkan hal yang sama flexuntuk semua anak, yang penting sebenarnya flex: 1 ? 0;, di mana "?" bisa apa saja, tidak akan ada bedanya
flen
@DreamTeK Hanya di browser yang tidak sesuai standar seperti Chrome.
TylerH
1
@TylerH Benar dan dicatat dalam jawaban saya namun what does flex:1 mean?terbuka untuk interpretasi. Operasi tidak menanyakan spesifikasi, hanya untuk apa yang terjadi. Sayangnya Chrome sekarang adalah browser paling populer dan diperlukan dukungan. Saya sendiri bukan penggemar atau pengguna Chrome!
DreamTeK
1
@TylerH Itulah sebabnya dalam jawaban saya, yang disebut menyatakan "Perlu dicatat bahwa ini gagal karena browser ini gagal mematuhi spesifikasi." bersama dengan tautan ke spesifikasi!
DreamTeK
99

flex: 1 berarti sebagai berikut:

flex-grow : 1;    ➜ The div will grow in same proportion as the window-size       
flex-shrink : 1;  ➜ The div will shrink in same proportion as the window-size 
flex-basis : 0;   ➜ The div does not have a starting value as such and will 
                     take up screen as per the screen size available for
                     e.g:- if 3 divs are in the wrapper then each div will take 33%.
Rinku Bhilota
sumber
1
@ CookieMonster Tidak, flex: 1artinya 1 1 0... tapi di IE1 1 0px
Ason
@LGSon, Anda dapat menghilangkan unit dari nilai basis jadi 1 1 0dan 1 1 0pxsetara. IE kebetulan hanya mendukung satu dengan satu unit.
CookieMonster
@CookieMonster Saya tahu cara kerja Flexbox, saya baru saja mengoreksi komentar pertama Anda, yang mana salah.
Mulai tanggal
@LGSon, Bagaimana flex: 1 berarti 1 1 0px salah kapan 1 1 0pxdan 1 1 0setara?
CookieMonster
2
@CookieMonster Mereka mungkin merender yang sama, tapi tidak setara, seperti saat menggunakan nilai tanpa unit untuk flex-basis, konten diabaikan dan ukuran elemen didasarkan pada flex-grow/ flex-shrink.
Ason
78

HATI-HATI

Di beberapa browser:

flex:1; tidak samaflex:1 1 0;

flex:1;= flex:1 1 0n;(di mana n adalah satuan panjang).

  • flex-grow: Angka yang menentukan seberapa banyak item akan berkembang dibandingkan dengan item fleksibel lainnya.
  • flex-shrink Angka yang menentukan seberapa besar item akan menyusut relatif terhadap item fleksibel lainnya
  • flex-basis Panjang item. Nilai hukum: "auto", "inherit", atau angka yang diikuti dengan "%", "px", "em" atau satuan panjang lainnya.

Poin kuncinya di sini adalah bahwa flex-basis membutuhkan satuan panjang .

Di Chrome misalnya flex:1dan flex:1 1 0menghasilkan hasil yang berbeda. Dalam kebanyakan keadaan, ini mungkin tampak flex:1 1 0;berfungsi tetapi mari kita periksa apa yang sebenarnya terjadi:

CONTOH

Basis fleksibel diabaikan dan hanya flex-grow dan flex-shrink yang diterapkan.

flex:1 1 0;= flex:1 1;=flex:1;

Sekilas ini mungkin tampak baik-baik saja, namun jika unit yang diterapkan dari wadah bersarang; mengharapkan yang tak terduga!

Coba contoh ini di CHROME

.Wrap{
  padding:10px;
  background: #333;
}
.Flex110x, .Flex1, .Flex110, .Wrap {
  display: -webkit-flex;
  display: flex;
  -webkit-flex-direction: column;
  flex-direction: column;
}
.Flex110 {
  -webkit-flex: 1 1 0;
  flex: 1 1 0;
}
.Flex1 {
  -webkit-flex: 1;
  flex: 1;
}
.Flex110x{
  -webkit-flex: 1 1 0%;
  flex: 1 1 0%;
}
FLEX 1 1 0
<div class="Wrap">
  <div class="Flex110">
    <input type="submit" name="test1" value="TEST 1">
  </div>
</div>

FLEX 1
<div class="Wrap">
  <div class="Flex1">
    <input type="submit" name="test2" value="TEST 2">
  </div>
</div>

FLEX 1 1 0%
<div class="Wrap">
  <div class="Flex110x">
    <input type="submit" name="test3" value="TEST 3">
  </div>
</div>

KESESUAIAN

Perlu dicatat bahwa ini gagal karena beberapa browser gagal mematuhi spesifikasi .

Browser yang menggunakan spesifikasi full flex:

  • Firefox - ✓
  • Edge - ✓ (Saya tahu, saya juga terkejut.)
  • Chrome - x
  • Berani - x
  • Opera - x
  • IE - (lol, ini berfungsi tanpa satuan panjang tetapi tidak dengan satuan panjang.)

PEMBARUAN 2019

Versi terbaru Chrome tampaknya akhirnya memperbaiki masalah ini tetapi browser lain masih belum.

Diuji dan berfungsi di Chrome Ver 74.

DreamTeK
sumber
1
Jika nilainya 0, unit tidak wajib. Spesifikasinya mengatakan flex: 1sama flex: 1 1 0. Dalam contoh Anda jika Anda menghapus .Wrapkelas dalam .Flex110x,.Flex1, .Flex110, .Wrapaturan berfungsi seperti yang diharapkan.
Berikan tautan, saya tidak dapat menemukan dalam spesifikasi apa yang Anda katakan. Saya belum menemukan apa pun, jawaban saya didasarkan pada spesifikasi
@Obsidian Berikut ini tautannya: w3.org/TR/css-flexbox-1 Jika Anda pergi ke bagian untuk 'singkatan' Anda akan menemukan: "flex: [positive-number] Equivalent to flex: [positive-number] 1 0 ...
MikeB
1
@Toskan Untuk kompatibilitas maksimum, gunakan sintaks penuhflex:1 1 0n;
DreamTeK
2
Terima kasih telah menunjukkan perbedaan ini, saya tidak tahu dari mana asal masalah saya. Dapatkan beberapa karunia.
Nit