Dlaczego elementy flex nie zmniejszają się ponad rozmiar zawartości?
Mam 4 kolumny flexbox i wszystko działa dobrze, ale kiedy dodam tekst do kolumny i ustawię go na duży rozmiar czcionki, powoduje to, że kolumna jest szersza niż powinna ze względu na właściwość flex.
Próbowałem użyć word-break: break-word
i pomogło, ale mimo to, gdy zmieniam rozmiar kolumny do bardzo małej szerokości, litery w tekście są podzielone na wiele linii (jedna litera w linii), a mimo to kolumna nie jest mniejsza niż rozmiar jednej litery .
Obejrzyj to wideo (na początku pierwsza kolumna jest najmniejsza, ale kiedy zmieniam rozmiar okna, jest to najszersza kolumna. Chcę tylko zawsze przestrzegać ustawień flex; rozmiary flex 1: 3: 4: 4)
Wiem, że ustawienie mniejszego rozmiaru czcionki i wypełnienia kolumn pomoże ... ale czy jest jakieś inne rozwiązanie?
Nie mogę użyć overflow-x: hidden
.
.container {
display: flex;
width: 100%
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
Odpowiedzi
Automatyczny minimalny rozmiar elementów Flex
Napotykasz domyślne ustawienie flexbox.
Element elastyczny nie może być mniejszy niż rozmiar jego zawartości wzdłuż głównej osi.
Wartości domyślne to ...
min-width: auto
min-height: auto
... dla elementów elastycznych odpowiednio w kierunku wierszy i kolumn.
Możesz zastąpić te ustawienia domyślne, ustawiając elementy flex na:
min-width: 0
min-height: 0
overflow: hidden
(lub dowolna inna wartość, z wyjątkiemvisible
)
Specyfikacja Flexbox
4.5. Automatyczny minimalny rozmiar elementów Flex
Aby zapewnić bardziej rozsądny domyślny rozmiar minimalny dla elementów elastycznych, niniejsza specyfikacja wprowadza nową
auto
wartość jako wartość początkową właściwościmin-width
imin-height
zdefiniowanych w CSS 2.1.
Jeśli chodzi o auto
wartość ...
W elemencie flex, który
overflow
znajduje sięvisible
na osi głównej, gdy jest określony we właściwości min-size na osi głównej elementu flex, określa automatyczny rozmiar minimalny . W przeciwnym razie oblicza się0
.
Innymi słowy:
- Wartości
min-width: auto
i sąmin-height: auto
stosowane tylko wtedy, gdyoverflow
jestvisible
. - Jeśli
overflow
wartość nie jest równavisible
, wartość właściwości min-size to0
. - W związku z tym
overflow: hidden
może zastępowaćmin-width: 0
imin-height: 0
.
i...
- Algorytm minimalnego wymiarowania dotyczy tylko głównej osi.
- Na przykład element flex w kontenerze w kierunku wierszy nie
min-height: auto
jest domyślnie pobierany . - Bardziej szczegółowe wyjaśnienie znajduje się w tym poście:
Zastosowałeś min-width: 0, a element nadal się nie kurczy?
Zagnieżdżone kontenery Flex
Jeśli masz do czynienia z elastycznymi elementami na wielu poziomach struktury HTML, może być konieczne, aby zastąpić domyślne min-width: auto
/ min-height: auto
na przedmioty na wyższych poziomach.
Zasadniczo element elastyczny wyższego poziomu z min-width: auto
może zapobiegać kurczeniu się elementów zagnieżdżonych poniżej za pomocą min-width: 0
.
Przykłady:
- Element Flex nie kurczy się mniej niż jego zawartość
- Dopasowanie dziecka do rodzica
- właściwość css white-space powoduje problemy z fleksem
Uwagi dotyczące renderowania przeglądarki
Chrome kontra Firefox / Edge
Co najmniej od 2017 roku wydaje się, że Chrome (1) powraca do
min-width: 0
/min-height: 0
defaults lub (2) automatycznie stosuje0
ustawienia domyślne w określonych sytuacjach w oparciu o tajemniczy algorytm. (To może być coś, co nazywają interwencją ). W rezultacie wiele osób widzi, że ich układ (szczególnie pożądane paski przewijania) działa zgodnie z oczekiwaniami w przeglądarce Chrome, ale nie w przeglądarce Firefox / Edge. Ten problem jest omówiony bardziej szczegółowo tutaj: rozbieżność flex-shrink między przeglądarkami Firefox i ChromeIE11
Jak wspomniano w specyfikacji,
auto
wartość właściwościmin-width
imin-height
to „nowy”. Oznacza to, że niektóre przeglądarki mogą nadal0
domyślnie renderować wartość, ponieważ zaimplementowały układ flex przed aktualizacją wartości i ponieważ0
jest to wartość początkowa dlamin-width
imin-height
w CSS 2.1 . Jedną z takich przeglądarek jest IE11. Inne przeglądarki zaktualizowały się do nowszejauto
wartości zdefiniowanej w specyfikacji flexbox .
Zmienione demo
.container {
display: flex;
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px;
min-width: 0; /* NEW */
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
Odkryłem, że przez lata wielokrotnie mnie to ugryzło, zarówno w przypadku flex, jak i grid, więc zasugeruję, co następuje:
* { min-width: 0; min-height: 0; }
a następnie po prostu użyj min-width: auto
lub min-height: auto
jeśli potrzebujesz tego zachowania.
W rzeczywistości, dorzuć również rozmiar pudełka, aby cały układ był bardziej rozsądny:
* { box-sizing: border-box; min-width: 0; min-height: 0; }
Czy ktoś wie, czy są jakieś dziwne konsekwencje? Nie spotkałem się z niczym od kilku lat, używając mieszanki powyższych. W rzeczywistości nie przychodzą mi do głowy żadne przypadki, w których chciałbym układać od treści na zewnątrz do flex / grid, zamiast flex / grid do wewnątrz do treści - i na pewno, jeśli istnieją, są rzadkie. Więc to wygląda na złe ustawienie domyślne. Ale może czegoś mi brakuje?