Masalah
Flexbox membuat pemusatan sangat mudah.
Dengan hanya menerapkan align-items: center
dan justify-content: center
ke wadah fleksibel, item fleksibel Anda akan terpusat secara vertikal dan horizontal.
Namun, ada masalah dengan metode ini ketika item fleksibel lebih besar dari wadah fleksibel.
Seperti disebutkan dalam pertanyaan, ketika item fleksibel meluap wadah bagian atas menjadi tidak dapat diakses.
Untuk overflow horisontal, bagian kiri menjadi tidak dapat diakses (atau bagian kanan, dalam bahasa RTL).
Berikut adalah contoh dengan wadah LTR memiliki justify-content: center
dan tiga item fleksibel:
Lihat bagian bawah jawaban ini untuk penjelasan tentang perilaku ini.
Solusi # 1
Untuk memperbaiki masalah ini, gunakan margin otomatis flexbox , bukan justify-content
.
Dengan auto
margin, item flex yang meluap dapat dipusatkan secara vertikal dan horizontal tanpa kehilangan akses ke bagian mana pun darinya.
Jadi alih-alih kode ini pada wadah fleksibel:
#flex-container {
align-items: center;
justify-content: center;
}
Gunakan kode ini pada item fleksibel:
.flex-item {
margin: auto;
}
Demo yang Direvisi
Solusi # 2 (belum diterapkan di sebagian besar browser)
Tambahkan safe
nilai ke aturan pelurusan kata kunci Anda, seperti ini:
justify-content: safe center
atau
align-self: safe center
Dari spesifikasi Modul Kotak Alignment CSS :
4.4. Overflow Alignment: safe
dan unsafe
kata kunci serta batas keamanan gulir
Ketika [item fleksibel] lebih besar dari [kontainer fleksibel], itu akan meluap. Beberapa mode penyelarasan, jika merasa terhormat dalam situasi ini, dapat menyebabkan kehilangan data: misalnya, jika konten bilah sisi berada di tengah, ketika mereka meluap mereka dapat mengirim bagian dari kotak mereka melewati tepi awal viewport, yang tidak dapat digulir ke .
Untuk mengontrol situasi ini, mode pelurusan overflow dapat ditentukan secara eksplisit. Unsafe
perataan menghormati mode perataan yang ditentukan dalam situasi luapan, bahkan jika itu menyebabkan kehilangan data, sementara safe
perataan mengubah mode perataan dalam situasi luapan dalam upaya untuk menghindari kehilangan data.
Perilaku default adalah memuat subjek pelurusan dalam area yang dapat digulir, meskipun pada saat penulisan fitur keselamatan ini belum diterapkan.
safe
Jika ukuran [item fleksibel] melebihi [kontainer fleksibel], [item fleksibel] disejajarkan seolah-olah mode alignment adalah [ flex-start
].
unsafe
Terlepas dari ukuran relatif dari [item fleksibel] dan [kontainer fleksibel], nilai penyelarasan yang diberikan dihormati.
Catatan: Box Alignment Module digunakan untuk berbagai model tata letak kotak, bukan hanya fleksibel. Jadi dalam kutipan spesifikasi di atas, istilah dalam tanda kurung sebenarnya mengatakan "subjek pelurusan", "wadah pelurusan" dan " start
". Saya menggunakan istilah khusus-fleksibel untuk menjaga fokus pada masalah khusus ini.
Penjelasan untuk batasan gulir dari MDN:
Pertimbangan item fleksibel
Properti perataan Flexbox melakukan pemusatan "benar", tidak seperti metode pemusatan lainnya di CSS. Ini berarti bahwa item flex akan tetap berada di tengah, bahkan jika item tersebut meluap wadah flex.
Namun, terkadang hal ini dapat menimbulkan masalah, jika meluap melewati tepi atas halaman, atau tepi kiri [...], karena Anda tidak dapat menggulir ke area itu, bahkan jika ada konten di sana!
Dalam rilis yang akan datang, properti pelurusan akan diperluas untuk memiliki opsi "aman" juga.
Untuk saat ini, jika ini merupakan masalah, Anda dapat menggunakan margin untuk mencapai pemusatan, karena mereka akan merespons dengan cara yang "aman" dan berhenti pemusatan jika meluap.
Alih-alih menggunakan align-
properti, cukup beri auto
margin pada item fleksibel yang ingin Anda pusatkan.
Alih-alih justify-
properti, letakkan margin otomatis di tepi luar item flex pertama dan terakhir dalam wadah flex.
The auto
margin akan "fleksibel" dan menganggap ruang sisa, berpusat item fleksibel ketika ada sisa ruang, dan beralih ke keselarasan normal ketika tidak.
Namun, jika Anda mencoba untuk mengganti justify-content
dengan pemusatan berbasis margin dalam kotak multi-line, Anda mungkin kurang beruntung, karena Anda perlu menempatkan margin pada item flex pertama dan terakhir pada setiap baris. Kecuali jika Anda dapat memprediksi sebelumnya item mana yang akan berakhir pada baris mana, Anda tidak dapat menggunakan pemusatan berbasis margin pada sumbu utama untuk mengganti justify-content
properti.