Co robi overflow
Gdy treść jest większa niż jej pudełko (stała wysokość, długie słowo, szeroka tabela), przepełnia je. Właściwość overflow decyduje, co dzieje się z nadmiarem:
| Wartość | Co widzisz | Kontener przewijania |
|---|---|---|
visible (domyślna) | Treść wylewa się z pudełka i zachodzi na to, co jest dalej | Nie |
hidden | Przycięta przy krawędzi paddingu, bez pasków przewijania (skrypt nadal może ją przewinąć) | Tak |
clip | Przycięta i bez żadnego przewijania, nawet skryptem | Nie |
scroll | Zawsze pokazuje paski przewijania, nawet gdy treść się mieści | Tak |
auto | Paski przewijania tylko wtedy, gdy treść się nie mieści | Tak |
Na macOS i telefonach paski przewijania nakładają się na treść i znikają, więc scroll i auto mogą wyglądać tak samo, dopóki nie zaczniesz przewijać.
Tworzenie przewijanego pudełka
Pudełko przepełnia się tylko wtedy, gdy coś ogranicza jego rozmiar. height albo max-height razem z overflow-y: auto zamienia długą listę w przewijany panel:
max-height jest tu lepsze niż height: krótka lista pozostaje krótka, a przewija się tylko długa. Przewijany obszar bez elementów, na których można ustawić fokus, powinien dostać tabindex="0", żeby osoby korzystające z klawiatury też mogły go przewijać.
overflow-x i overflow-y
Obie osie można ustawić osobno. Typowe zastosowanie to szeroka tabela, która przewija się na boki wewnątrz swojego kontenera, zamiast poszerzać całą stronę:
Jedna zasada do zapamiętania: jeśli jedna oś ma hidden, scroll lub auto, wartość visible na drugiej osi staje się auto. Dlatego samo overflow-x: hidden może dać nieoczekiwany pionowy pasek przewijania. overflow-x: clip nie ma tego efektu:
.a { overflow-x: hidden; } /* overflow-y computes to auto */
.b { overflow-x: clip; } /* overflow-y stays visible */
Przycinanie tekstu wielokropkiem
text-overflow: ellipsis zastępuje przycięty koniec linii znakiem "…". Potrzebuje trzech rzeczy naraz: ograniczonej szerokości, tekstu, który nie może się zawijać, i ukrytego przepełnienia:
Ograniczanie linii z prefiksem -webkit- działa w Chrome, Firefoksie i Safari. Czytniki ekranu nadal odczytują pełny tekst, więc przycięte słowa nie giną dla nich.
Skutki uboczne overflow
Ustawienie overflow na cokolwiek innego niż visible lub clip zmienia więcej niż samo przycinanie:
- Obejmuje elementy float i marginesy dzieci. Element tworzy nowy kontekst formatowania bloków, więc rośnie, żeby objąć dzieci z float.
display: flow-rootrobi to samo, niczego nie przycinając. - Psuje
position: stickyponiżej. Dziecko ze sticky przykleja się do najbliższego kontenera przewijania; jeśli ten kontener się nie przewija, nic się nie przykleja. - Przycina dzieci pozycjonowane absolutnie (gdy przepełniony element jest też ich blokiem zawierającym), w tym rozwijane menu i podpowiedzi, a także cienie dzieci.
Ukrywanie paska przewijania
Możesz zachować przewijanie pudełka, ukrywając jego pasek przez scrollbar-width: none. Rób to oszczędnie: bez paska przewijania wielu czytelników nie zauważy, że jest więcej treści. scrollbar-gutter: stable działa odwrotnie: rezerwuje miejsce na pasek przewijania, żeby treść nie przesuwała się, gdy pasek się pojawi.
Częste błędy
- Oczekiwanie przepełnienia bez limitu rozmiaru. Pudełko bez
heightlubmax-heightrośnie zamiast się przepełniać. overflow: hiddennabody, żeby "naprawić" poziome przewijanie. Zamiast tego znajdź element, który jest za szeroki (często stałewidth, długi adres URL albo100vwprzy widocznym pasku przewijania).- Wielokropek bez
white-space: nowrap. Tekst się zawija, więc nic nie przepełnia się w poziomie i wielokropek się nie pojawia. overflow-x: hiddentworzące pionowy pasek przewijania. Użyjclip.- Rozwijane menu przycięte przez kartę. Przycina je
overflow: hiddenkarty; przenieś regułę overflow albo wyrenderuj menu poza kartą.
Najczęściej zadawane pytania
Co robi overflow: hidden?
Przycina treść, która nie mieści się w polu paddingu elementu, bez pasków przewijania. Do ukrytej części nadal można przewinąć skryptem albo przez ustawienie fokusu na czymś w jej wnętrzu.
Czym różni się overflow auto od scroll?
scroll zawsze rezerwuje paski przewijania, nawet gdy treść się mieści. auto pokazuje pasek przewijania tylko wtedy, gdy treść jest większa niż pudełko, i zwykle właśnie o to chodzi.
Jak zrobić przewijany div?
Ogranicz jego rozmiar i pozwól na przewijanie: max-height: 300px; overflow-y: auto;. Bez ograniczenia height lub max-height div rośnie razem z treścią i nigdy się nie przepełnia.
Dlaczego overflow-x: hidden dodaje też pionowy pasek przewijania?
Jeśli jedna oś ma hidden, scroll lub auto, wartość visible na drugiej osi jest obliczana jako auto. Zamiast tego użyj overflow-x: clip, które nie tworzy kontenera przewijania i zostawia drugą oś widoczną.
Jak dodać wielokropek (...) do przepełnionego tekstu?
Dla jednej linii: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; na elemencie o ograniczonej szerokości. Dla kilku linii użyj display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;.