Chcę mieć menu pionowe o określonej wysokości.
Każde dziecko musi wypełnić wysokość rodzica i mieć wyśrodkowany tekst.
Liczba dzieci jest losowa, więc muszę pracować z wartościami dynamicznymi.
Div .container
zawiera losową liczbę dzieci ( .item
), które zawsze muszą wypełnić wysokość rodzica. Aby to osiągnąć, użyłem Flexboksa.
Do tworzenia linków z tekstem wyrównanym do środka używam display: table-cell
techniki. Ale korzystanie z wyświetlaczy tabel wymaga użycia wysokości 100%.
Mój problem polega na tym, że .item-inner { height: 100% }
nie działa w pakiecie internetowym (Chrome).
- Czy istnieje rozwiązanie tego problemu?
- Czy może istnieje inna technika
.item
polegająca na tym, aby wszystkie wypełniały wysokość elementu nadrzędnego tekstem wyrównanym pionowo do środka?
Przykład tutaj jsFiddle, powinien być oglądany w Firefox i Chrome
.container {
height: 20em;
display: flex;
flex-direction: column;
border: 5px solid black
}
.item {
flex: 1;
border-bottom: 1px solid white;
}
.item-inner {
height: 100%;
width: 100%;
display: table;
}
a {
background: orange;
display: table-cell;
vertical-align: middle;
}
<div class="container">
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
</div>
css
google-chrome
webkit
flexbox
Ricardo Castañeda
źródło
źródło
top:0
ileft:0
mieć wydaje się zgodnie z oczekiwaniami.Odpowiedzi:
Rozwiązanie
Użyj zagnieżdżonych kontenerów elastycznych.
Pozbądź się wysokości procentowych. Pozbądź się właściwości tabeli. Pozbyć się
vertical-align
. Unikaj absolutnego pozycjonowania. Po prostu trzymaj się Flexboksa do końca.Zastosuj
display: flex
do elementu flex (.item
), dzięki czemu będzie to elastyczny pojemnik. To automatycznie ustawiaalign-items: stretch
, co każe child (.item-inner
) rozwinąć pełną wysokość rodzica.Ważne: Usuń określone wysokości z elementów elastycznych, aby ta metoda działała. Jeśli dziecko ma określoną wysokość (np.
height: 100%
), Wówczas zignorujealign-items: stretch
pochodzenie od rodzica. Abystretch
domyślny działał, wzrost dziecka musi być obliczony naauto
(pełne wyjaśnienie ).Spróbuj tego (bez zmian w HTML):
Pokaż fragment kodu
Demo jsFiddle
Wyjaśnienie
To nie działa, ponieważ używasz wysokości procentowej w sposób niezgodny z tradycyjną implementacją specyfikacji.
Innymi słowy, aby procentowa wysokość działała na potomku w przepływie, rodzic musi mieć ustawioną wysokość.
W kodzie kontener najwyższego poziomu ma zdefiniowaną wysokość:
.container { height: 20em; }
Kontener trzeciego poziomu ma określoną wysokość:
.item-inner { height: 100%; }
Ale między nimi kontener drugiego poziomu -
.item
- nie ma określonej wysokości. Webkit uważa to za brakujący link..item-inner
mówi Chrome: daj miheight: 100%
. Chrome szuka informacji o obiekcie nadrzędnym (.item
) i odpowiada: 100% czego? Nic nie widzę (ignorując istniejącąflex: 1
regułę). W rezultacie ma zastosowanieheight: auto
(wysokość zawartości), zgodnie ze specyfikacją.Z drugiej strony Firefox akceptuje teraz wysokość flex rodzica jako odniesienie do procentowej wysokości dziecka. IE11 i Edge również akceptują wysokości elastyczności.
Ponadto Chrome zaakceptuje
flex-grow
jako odpowiednie odniesienie nadrzędne, jeśli zostanie użyte w połączeniu zflex-basis
(każda wartość liczbowa działa (auto
nie będzie), w tymflex-basis: 0
). Jednak w chwili pisania tego tekstu to rozwiązanie nie działa w przeglądarce Safari.Pokaż fragment kodu
Cztery rozwiązania
1. Określ wysokość wszystkich elementów nadrzędnych
Niezawodnym rozwiązaniem dla wielu przeglądarek jest określenie wysokości wszystkich elementów nadrzędnych. Zapobiega to brakującym linkom, które przeglądarki oparte na Webkit uznają za naruszenie specyfikacji.
Pamiętaj, że
min-height
imax-height
nie są akceptowane. To musi byćheight
własność.Więcej informacji tutaj: Praca z
height
właściwością CSS i wartościami procentowymi2. Pozycjonowanie względne i absolutne CSS
Zastosuj
position: relative
do rodzica iposition: absolute
dziecka.Rozmiar dziecko z
height: 100%
iwidth: 100%
lub użyj offsetowych właściwości:top: 0
,right: 0
,bottom: 0
,left: 0
.W przypadku pozycjonowania bezwzględnego wysokość procentowa działa bez określonej wysokości nadrzędnej.
3. Usuń niepotrzebne pojemniki HTML (zalecane)
Czy w pobliżu są potrzebne dwa pojemniki
button
? Dlaczego nie usunąć.item
lub.item-inner
, albo jedno i drugie? Chociażbutton
elementy czasami zawodzą jako elastyczne kontenery , mogą być elastycznymi przedmiotami. Rozważyćbutton
dzieckiem.container
albo.item
i usuwanie nieodpłatne Mark-up.Oto przykład:
Pokaż fragment kodu
4. Zagnieżdżone pojemniki Flex (zalecane)
Pozbądź się wysokości procentowych. Pozbądź się właściwości tabeli. Pozbyć się
vertical-align
. Unikaj absolutnego pozycjonowania. Po prostu trzymaj się Flexboksa do końca.Zastosuj
display: flex
do elementu flex (.item
), dzięki czemu będzie to elastyczny pojemnik. To automatycznie ustawiaalign-items: stretch
, co każe child (.item-inner
) rozwinąć pełną wysokość rodzica.Ważne: Usuń określone wysokości z elementów elastycznych, aby ta metoda działała. Jeśli dziecko ma określoną wysokość (np.
height: 100%
), Wówczas zignorujealign-items: stretch
pochodzenie od rodzica. Abystretch
domyślny działał, wzrost dziecka musi być obliczony naauto
(pełne wyjaśnienie ).Spróbuj tego (bez zmian w HTML):
Pokaż fragment kodu
jsFiddle
źródło
Rozwiązanie: Wyjmij
height: 100%
w .Item-wewnętrzna i dodaćdisplay: flex
w .ItemDemo: https://codepen.io/tronghiep92/pen/NvzVoo
źródło
Określenie atrybutu flex dla kontenera zadziałało dla mnie:
Dzięki temu wysokość jest ustawiona i nie rośnie.
źródło
Mobile Safari Jest poprawka do przeglądarki. musisz dodać -webkit-box dla urządzeń iOS.
Dawny.
jeśli używasz
align-items: stretch;
właściwości elementu nadrzędnego, usuńheight : 100%
element podrzędny.źródło
Miałem podobny problem w iOS 8, 9 i 10 i powyższe informacje nie mogły go naprawić, jednak znalazłem rozwiązanie po całym dniu pracy nad tym. To prawda, że nie będzie działać dla wszystkich, ale w moim przypadku moje przedmioty były ułożone w kolumnie i miały 0 wysokości, kiedy powinna była wysokość. Przełączenie css na wiersz i zawijanie rozwiązało problem. Działa to tylko wtedy, gdy masz jeden przedmiot i są one ułożone w stos, ale ponieważ zajęło mi to dzień, aby się o tym przekonać, pomyślałem, że powinienem podzielić się swoją poprawką!
źródło
Miałem podobny błąd, ale podczas używania stałej liczby na wysokość, a nie procent. Był to również elastyczny pojemnik w ciele (który nie ma określonej wysokości). Okazało się, że w Safari mój elastyczny pojemnik z jakiegoś powodu miał wysokość 9 pikseli, ale we wszystkich innych przeglądarkach wyświetlał prawidłową wysokość 100 pikseli określoną w arkuszu stylów.
Udało mi się go uruchomić, dodając zarówno właściwości
height
imin-height
do klasy CSS.Dla mnie zarówno Safari 13.0.4, jak i Chrome 79.0.3945.130:
Mam nadzieję że to pomoże!
źródło