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ść.
align-items: flex-start
do kontenera Flex i zachowajmargin: auto
element Flex.Cóż, zgodnie z prawem Murphy'ego, lektura, którą zrobiłem po opublikowaniu tego pytania, dała kilka wyników - nie do końca rozwiązanych, ale mimo to nieco przydatnych.
Bawiłem się trochę z minimalną wysokością przed opublikowaniem, ale nie byłem świadomy wewnętrznych ograniczeń rozmiaru, które są dość nowe w specyfikacji.
http://caniuse.com/#feat=intrinsic-width
Dodanie
min-height: min-content
do obszaru Flexbox rozwiązuje problem w Chrome, a dzięki prefiksom dostawców rozwiązuje także Operę i Safari, chociaż Firefox pozostaje nierozwiązany.Wciąż szukam pomysłów na Firefoksa i innych potencjalnych rozwiązań.
źródło
margin: auto
przestałoflex-basis
dla mnie działać, podczas gdy ta odpowiedź rozwiązała oba problemy.Udało mi się to z zaledwie 3 pojemnikami. Sztuczka polega na oddzieleniu kontenera Flexbox od kontenera sterującego przewijaniem. Na koniec umieść wszystko w pojemniku głównym, aby wszystko wyśrodkować. Oto niezbędne style do stworzenia efektu:
CSS:
HTML:
Stworzyłem tutaj demo: https://jsfiddle.net/r5jxtgba/14/
źródło
flex: 1 1 auto
doscroll-container
. Robiłem to z przyzwyczajeniem i miałem problem.Myślę, że znalazłem rozwiązanie. Działa z dużą ilością tekstu i małym tekstem . Nie musisz określać żadnych szerokości i powinno to działać w IE8.
źródło
Zgodnie z MDN
safe
wartość można teraz nadać właściwościom takim jakalign-items
ijustify-content
. Jest to opisane w następujący sposób:Tak więc można go użyć w następujący sposób.
Jednak nie jest jasne, ile obsługuje przeglądarki, nie mogłem znaleźć żadnych przykładów jej użycia i sam miałem z tym pewne problemy. Wspominając o tym tutaj, aby zwrócić na to większą uwagę.
źródło
Udało mi się to również zrobić przy użyciu dodatkowego kontenera
HTML
CSS
w jsfiddle> https://jsfiddle.net/Nash171/cpf4weq5/
zmień wartości szerokości / wysokości zawartości i zobacz
źródło
2 Metoda Flex kontenera z testem zastępowania tabeli IE8-9, flex działa w IE10,11. Edycja: Edytowane w celu zapewnienia pionowego centrowania przy minimalnej zawartości, dodano obsługę starszych wersji.
Problem wynika z dziedziczenia wysokości z rozmiaru okienka ekranu, co powoduje przepełnienie dzieci, jak odpowiedział Michael. https://stackoverflow.com/a/33455342/3500688
coś prostszego i użyj flex, aby zachować układ w kontenerze wyskakującym (zawartość):
źródło