Mengapa item fleksibel tidak menyusut melebihi ukuran konten?
Saya memiliki 4 kolom flexbox dan semuanya berfungsi dengan baik, tetapi ketika saya menambahkan beberapa teks ke kolom dan mengaturnya ke ukuran font yang besar, itu membuat kolom lebih lebar dari yang seharusnya karena properti flex.
Saya mencoba menggunakan word-break: break-word
dan itu membantu, tetapi tetap ketika saya mengubah ukuran kolom menjadi lebar yang sangat kecil, huruf dalam teks dipecah menjadi beberapa baris (satu huruf per baris), namun kolom tidak mendapatkan lebar yang lebih kecil dari satu ukuran huruf .
Tonton video ini (di awal, kolom pertama adalah yang terkecil, tetapi ketika saya mengubah ukuran jendela, itu adalah kolom terluas. Saya hanya ingin selalu menghormati pengaturan flex; ukuran flex 1: 3: 4: 4)
Saya tahu, mengatur ukuran font dan bantalan kolom menjadi lebih kecil akan membantu ... tetapi apakah ada solusi lain?
Saya tidak bisa menggunakan overflow-x: hidden
.
.container {
display: flex;
width: 100%
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
Jawaban
Ukuran Minimum Otomatis Item Fleksibel
Anda menemukan pengaturan default flexbox.
Item fleksibel tidak boleh lebih kecil dari ukuran kontennya di sepanjang sumbu utama.
Standarnya adalah ...
min-width: auto
min-height: auto
... untuk item fleksibel masing-masing dalam arah baris dan kolom.
Anda dapat mengganti default ini dengan mengatur item flex ke:
min-width: 0
min-height: 0
overflow: hidden
(atau nilai lainnya, kecualivisible
)
Spesifikasi Flexbox
4.5. Ukuran Minimum Otomatis Item Flex
Untuk memberikan ukuran minimum default yang lebih masuk akal untuk item fleksibel, spesifikasi ini memperkenalkan
auto
nilai baru sebagai nilai awalmin-width
danmin-height
properti yang ditentukan dalam CSS 2.1.
Berkenaan dengan auto
nilai ...
Pada item flex yang
overflow
beradavisible
di sumbu utama, ketika ditentukan pada properti ukuran min sumbu utama item flex, menentukan ukuran minimum otomatis . Itu sebaliknya menghitung0
.
Dengan kata lain:
- The
min-width: auto
danmin-height: auto
default hanya berlaku saatoverflow
inivisible
. - Jika
overflow
nilainya bukanvisible
, nilai properti min-size adalah0
. - Oleh karena itu,
overflow: hidden
dapat menjadi penggantimin-width: 0
danmin-height: 0
.
dan...
- Algoritme ukuran minimum hanya berlaku pada sumbu utama.
- Misalnya, item fleksibel dalam penampung arah baris tidak didapatkan
min-height: auto
secara default. - Untuk penjelasan lebih detail lihat posting ini:
Anda telah menerapkan min-width: 0 dan item masih tidak menyusut?
Kontainer Fleksibel Bersarang
Jika Anda berurusan dengan item fleksibel pada beberapa tingkat struktur HTML, mungkin perlu mengganti item default min-width: auto
/ min-height: auto
pada tingkat yang lebih tinggi.
Pada dasarnya, item flex dengan level yang lebih tinggi min-width: auto
dapat mencegah penyusutan pada item yang disarangkan di bawah min-width: 0
.
Contoh:
- Item fleksibel tidak menyusut lebih kecil dari isinya
- Menyesuaikan anak menjadi orang tua
- Properti white-space css membuat masalah dengan flex
Catatan Rendering Browser
Chrome vs. Firefox / Edge
Setidaknya sejak 2017, tampaknya Chrome (1) kembali ke
min-width: 0
/min-height: 0
defaults, atau (2) secara otomatis menerapkan0
default dalam situasi tertentu berdasarkan algoritme misteri. (Ini bisa disebut intervensi .) Akibatnya, banyak orang melihat tata letak mereka (terutama scrollbar yang diinginkan) berfungsi seperti yang diharapkan di Chrome, tetapi tidak di Firefox / Edge. Masalah ini dibahas lebih detail di sini: perbedaan flex-shrink antara Firefox dan ChromeIE11
Seperti disebutkan dalam spesifikasi,
auto
nilai untuk propertimin-width
danmin-height
adalah "baru". Ini berarti bahwa beberapa browser mungkin masih merender0
nilai secara default, karena mereka menerapkan tata letak fleksibel sebelum nilai diperbarui dan karena0
merupakan nilai awal untukmin-width
danmin-height
di CSS 2.1 . Salah satu browser tersebut adalah IE11. Browser lain telah memperbarui ke nilai yang lebih baruauto
seperti yang ditentukan dalam spesifikasi flexbox .
Demo Revisi
.container {
display: flex;
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px;
min-width: 0; /* NEW */
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
Saya menemukan ini telah menggigit saya berulang kali selama bertahun-tahun untuk flex dan grid, jadi saya akan menyarankan yang berikut:
* { min-width: 0; min-height: 0; }
dan kemudian gunakan saja min-width: auto
atau min-height: auto
jika Anda membutuhkan perilaku itu.
Faktanya, tambahkan juga ukuran kotak untuk membuat semua tata letak lebih waras:
* { box-sizing: border-box; min-width: 0; min-height: 0; }
Adakah yang tahu jika ada konsekuensi yang aneh? Saya tidak menemukan apa pun dalam beberapa tahun menggunakan campuran di atas. Faktanya, saya tidak dapat memikirkan kasus apa pun di mana saya ingin mengatur tata letak dari konten ke luar ke flex / grid, daripada flex / grid ke dalam ke konten --- dan tentunya jika ada, itu jarang terjadi. Jadi ini terasa seperti default yang buruk. Tapi mungkin aku melewatkan sesuatu?