Sorun
Flexbox merkezlemeyi çok kolaylaştırır.
Sadece uygulayarak align-items: center
vejustify-content: center
Esnek kabı esnek kabınız / eşyalarınız dikey ve yatay olarak ortalanacaktır.
Ancak, esnek öğe esnek konteynırdan daha büyük olduğunda bu yöntemle ilgili bir sorun vardır.
Soruda belirtildiği gibi, esnek öğe konteyneri taştığında üste erişilemez hale gelir.
Yatay taşma için, sol bölüme erişilemez (veya RTL dillerinde sağ bölüm).
İşte bir LTR konteynerine justify-content: center
ve üç esnek öğeye sahip bir örnek :
Bu davranışın açıklaması için bu cevabın alt kısmına bakın.
Çözüm # 1
Bu sorunu düzeltmek için flexbox otomatik kenar boşluklarını kullanın,justify-content
.
İle auto
marjlar, bir taşan esnek öğe dikey ve yatay olarak da bir bölümünde erişimi kaybetmeden merkezli edilebilir.
Esnek konteynerdeki bu kod yerine:
#flex-container {
align-items: center;
justify-content: center;
}
Esnek öğede bu kodu kullanın:
.flex-item {
margin: auto;
}
Gözden Geçirilmiş Demo
Çözüm # 2 (henüz çoğu tarayıcıda uygulanmadı)
Ekle safe
Bu gibi anahtar kelime hizalama kuralın değerini:
justify-content: safe center
veya
align-self: safe center
Gönderen CSS Kutu Hizalama Modülü şartname :
4.4. Taşma Hizalaması: safe
ve unsafe
anahtar sözcükleri ve kaydırma güvenliği sınırları
[Flex öğesi] [flex kabı] 'ndan daha büyük olduğunda taşar. Bazı hizalama modları, bu durumda onurlandırılırsa, veri kaybına neden olabilir: örneğin, bir kenar çubuğunun içeriği ortalanmışsa, taştıklarında kutularının bir kısmını görünümün başlangıç kenarından geçerek kaydırılamazlar .
Bu durumu kontrol etmek için bir taşma hizalama modu açıkça belirtilebilir. Unsafe
hizalama, veri kaybına neden olsa bile taşma durumlarında belirtilen hizalama modunu onurlandırırken, hizalama veri kaybını safe
önlemek için taşma durumlarında hizalama modunu değiştirir.
Varsayılan davranış, kaydırılabilir alandaki hizalama konusunu içermektir, ancak yazma sırasında bu güvenlik özelliği henüz uygulanmamıştır.
safe
[Flex öğesinin] boyutu [flex konteynerinden] taşarsa, [flex öğesi] bunun yerine hizalama modu [ flex-start
] gibi hizalanır .
unsafe
[Flex öğesi] ve [flex kabı] 'nın göreceli boyutlarından bağımsız olarak, verilen hizalama değeri dikkate alınır.
Not: Kutu Hizalama Modülü, yalnızca esnek değil, birden çok kutu düzeni modelinde kullanım içindir. Dolayısıyla yukarıdaki spesifik alıntıda, parantez içindeki terimler aslında "hizalama konusu", "hizalama kabı" ve " start
" der . Bu soruna odaklanmak için esnekliğe özgü terimler kullandım.
MDN'den kaydırma sınırlaması için açıklama:
Esnek öğe değerlendirmeleri
Flexbox'ın hizalama özellikleri, CSS'deki diğer merkezleme yöntemlerinin aksine "gerçek" merkezleme yapar. Bu, esnek nesnelerin esnek kabı taşmasına rağmen ortalanmış kalacağı anlamına gelir.
Bununla birlikte, sayfanın üst kenarından veya sol kenarından [...] taşarlarsa bu bazen sorunlu olabilir, çünkü orada içerik olsa bile bu alana geçemezsiniz!
Gelecekteki bir sürümde, hizalama özellikleri de "güvenli" bir seçeneğe sahip olacak şekilde genişletilecektir.
Şimdilik, bu bir endişe ise, merkezlemeyi elde etmek için kenar boşluklarını kullanabilirsiniz, çünkü bunlar "güvenli" bir şekilde yanıt verecek ve taşmaları durumunda merkezlemeyi durduracaklardır.
align-
Özellikleri kullanmak yerine, ortalamak auto
istediğiniz esnek öğelerin kenar boşluklarını koymanız yeterlidir.
Onun yerine justify-
, esnek kaptaki ilk ve son esnek öğelerin dış kenarlarına otomatik kenar boşlukları koyun.
auto
Marjları "esnek" ve mekan artık olduğunda esnek öğeleri ortalamak, ve ne zaman normal uyum geçiş, artık uzay üstlenecek.
Ancak, justify-content
çok satırlı bir esnek kutuda kenar boşluğu tabanlı merkezleme ile değiştirmeye çalışıyorsanız , her satırdaki ilk ve son esnek öğenin kenar boşluklarını koymanız gerektiğinden muhtemelen şansınız kalmaz. Hangi öğelerin hangi satıra geleceğini önceden tahmin edemezseniz, justify-content
özelliği değiştirmek için ana eksendeki marj tabanlı merkezlemeyi güvenilir bir şekilde kullanamazsınız .