Problem
Flexbox sprawia, że centrowanie jest bardzo łatwe.
Po prostu nakładając align-items: center
i justify-content: center
na elastyczny pojemnik, twoje elastyczne przedmioty będą wyśrodkowane pionowo i poziomo.
Istnieje jednak problem z tą metodą, gdy element elastyczny jest większy niż pojemnik elastyczny.
Jak zauważono w pytaniu, gdy element elastyczny przepełnia pojemnik, blat staje się niedostępny.
W przypadku przepełnienia poziomego lewa sekcja staje się niedostępna (lub prawa sekcja w językach RTL).
Oto przykład, w którym pojemnik LTR ma justify-content: center
i trzy elastyczne elementy:
Zobacz na dole tej odpowiedzi wyjaśnienie tego zachowania.
Rozwiązanie nr 1
Aby rozwiązać ten problem, użyj automatycznych marginesów Flexbox zamiast justify-content
.
Dzięki auto
marginesom przepełniony elastyczny element można wyśrodkować w pionie i poziomie, nie tracąc dostępu do żadnej jego części.
Zamiast tego kodu na kontenerze Flex:
#flex-container {
align-items: center;
justify-content: center;
}
Użyj tego kodu na elemencie flex:
.flex-item {
margin: auto;
}
Zmienione demo
Rozwiązanie nr 2 (jeszcze nie zaimplementowane w większości przeglądarek)
Dodaj safe
wartość do reguły wyrównywania słów kluczowych, w ten sposób:
justify-content: safe center
lub
align-self: safe center
Ze specyfikacji modułu CSS Box Alignment Module :
4.4 Przepełnienie Ustawienie: safe
i unsafe
słowa kluczowe i limitów bezpieczeństwa przewijania
Gdy [elastyczny element] jest większy niż [elastyczny pojemnik], przepełni się. Niektóre tryby wyrównania, jeśli są honorowane w tej sytuacji, mogą powodować utratę danych: na przykład, jeśli zawartość paska bocznego jest wyśrodkowana, po przepełnieniu mogą wysyłać część swoich pól poza krawędź początkową rzutni, której nie można przewinąć do .
Aby kontrolować tę sytuację, można jawnie określić tryb wyrównania przepełnienia . Unsafe
wyrównanie honoruje określony tryb wyrównania w sytuacjach przepełnienia, nawet jeśli powoduje utratę danych, natomiast safe
wyrównanie zmienia tryb wyrównania w sytuacjach przepełnienia, aby uniknąć utraty danych.
Domyślnym zachowaniem jest umieszczenie przedmiotu wyrównania w przewijalnym obszarze, chociaż w chwili pisania tej funkcji bezpieczeństwa nie jest jeszcze zaimplementowana.
safe
Jeśli rozmiar [elementu elastycznego] przepełnia [element elastycznego pojemnika], [element elastyczny] jest zamiast tego wyrównywany, jakby trybem wyrównania był [ flex-start
].
unsafe
Bez względu na względne rozmiary [elementu elastycznego] i [elastycznego pojemnika] podana wartość wyrównania jest honorowana.
Uwaga: Moduł wyrównania skrzynek jest przeznaczony do stosowania w wielu modelach układów skrzynek, a nie tylko flex. Tak więc w powyższym fragmencie specyfikacji wyrażenia w nawiasach faktycznie mówią „temat wyrównania”, „pojemnik wyrównania” i „ start
”. Użyłem terminów specyficznych dla flex, aby skupić się na tym konkretnym problemie.
Objaśnienie ograniczenia przewijania z MDN:
Uwagi dotyczące elementów elastycznych
Właściwości wyrównania Flexbox wykonują „prawdziwe” centrowanie, w przeciwieństwie do innych metod centrowania w CSS. Oznacza to, że elementy elastyczne pozostaną wyśrodkowane, nawet jeśli przepełnią pojemnik elastyczny.
Może to czasem być problematyczne, jeśli przekroczą górną krawędź strony lub lewą krawędź [...], ponieważ nie można przewinąć do tego obszaru, nawet jeśli jest tam zawartość!
W przyszłej wersji właściwości wyrównania zostaną rozszerzone o opcję „bezpieczną”.
Na razie, jeśli jest to problem, możesz zamiast tego użyć marginesów, aby uzyskać centrowanie, ponieważ zareagują one w „bezpieczny” sposób i przestaną centrować, jeśli się przepełnią.
Zamiast korzystać z align-
właściwości, po prostu umieść auto
marginesy na elementach elastycznych, które chcesz wyśrodkować.
Zamiast justify-
właściwości umieść automatyczne marginesy na zewnętrznych krawędziach pierwszego i ostatniego elementu elastycznego w kontenerze elastycznym.
Te auto
marże będą „flex” i zakładają przestrzeń resztki, centrowanie wyginanie elementów, gdy istnieje resztki przestrzeni, a przejście na normalnym zestrojeniu kiedy nie.
Jeśli jednak próbujesz zastąpić justify-content
oparte na marginesach centrowanie w wieloliniowym urządzeniu Flexbox, prawdopodobnie nie masz szczęścia, ponieważ musisz umieścić marginesy na pierwszym i ostatnim elemencie flex w każdej linii. O ile nie możesz przewidzieć z góry, które przedmioty znajdą się w której linii, nie możesz wiarygodnie użyć centrowania opartego na marginesie w głównej osi, aby zastąpić justify-content
właściwość.