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.
align-items: flex-start
ke wadah flex dan simpanmargin: auto
untuk item flex.Yah, sebagaimana Hukum Murphy akan memilikinya, bacaan yang saya lakukan setelah memposting pertanyaan ini menghasilkan beberapa hasil - tidak sepenuhnya terselesaikan, tetapi tetap berguna.
Saya bermain-main dengan min-height sedikit sebelum memposting, tetapi tidak menyadari kendala ukuran intrinsik yang cukup baru untuk spesifikasi.
http://caniuse.com/#feat=intrinsic-width
Menambahkan
min-height: min-content
ke area flexbox tidak menyelesaikan masalah di Chrome, dan dengan awalan vendor juga memperbaiki Opera dan Safari, meskipun Firefox tetap belum terselesaikan.Masih mencari ide di Firefox, dan solusi potensial lainnya.
sumber
margin: auto
berhentiflex-basis
bekerja untuk saya sedangkan jawaban ini menyelesaikan kedua masalah.Saya berhasil melakukan ini hanya dengan 3 kontainer. Caranya adalah dengan memisahkan wadah flexbox dari wadah yang mengontrol pengguliran. Terakhir, masukkan semuanya ke dalam wadah root untuk memusatkan semuanya. Berikut adalah gaya-gaya penting untuk menciptakan efek:
CSS:
HTML:
Saya telah membuat demo di sini: https://jsfiddle.net/r5jxtgba/14/
sumber
flex: 1 1 auto
kescroll-container
. Saya melakukan ini dengan kebiasaan dan mendapat masalah.Saya pikir saya menemukan solusi. Ini berfungsi dengan banyak teks dan sedikit teks . Anda tidak perlu menentukan lebar apa pun, dan itu harus bekerja di IE8.
sumber
Menurut MDN,
safe
nilai sekarang dapat diberikan ke properti sepertialign-items
danjustify-content
. Dijelaskan sebagai berikut:Jadi, bisa digunakan sebagai berikut.
Namun, tidak jelas berapa banyak dukungan browser yang dimilikinya, saya tidak dapat menemukan contoh penggunaannya, dan saya sendiri mengalami beberapa masalah. Menyebutkannya di sini untuk menarik lebih banyak perhatian padanya.
sumber
Saya juga berhasil melakukannya menggunakan wadah tambahan
HTML
CSS
di jsfiddle> https://jsfiddle.net/Nash171/cpf4weq5/
ubah nilai .content width / height dan lihat
sumber
2 Metode Flex Container dengan Table fallback menguji IE8-9, flex bekerja di IE10,11. Sunting: Diedit untuk memastikan pemusatan vertikal saat konten minimal, menambahkan dukungan lawas.
Masalahnya bermula dari ketinggian yang diwarisi dari ukuran viewport yang menyebabkan anak-anak meluap, seperti yang dijawab Michael. https://stackoverflow.com/a/33455342/3500688
sesuatu yang lebih sederhana dan gunakan flex untuk mempertahankan tata letak dalam wadah sembulan (konten):
sumber