Menu

CSS overflow: hidden, scroll, auto, clip i wielokropek

overflow decyduje, co dzieje się z treścią, która nie mieści się w pudełku: pokazać ją, przyciąć czy dodać paski przewijania. Poznaj visible, hidden, scroll, auto i clip, overflow-x i overflow-y, wielokropek w tekście i skutki uboczne overflow w układzie.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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 widziszKontener przewijania
visible (domyślna)Treść wylewa się z pudełka i zachodzi na to, co jest dalejNie
hiddenPrzycięta przy krawędzi paddingu, bez pasków przewijania (skrypt nadal może ją przewinąć)Tak
clipPrzycięta i bez żadnego przewijania, nawet skryptemNie
scrollZawsze pokazuje paski przewijania, nawet gdy treść się mieściTak
autoPaski przewijania tylko wtedy, gdy treść się nie mieściTak

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-root robi to samo, niczego nie przycinając.
  • Psuje position: sticky poniż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 height lub max-height rośnie zamiast się przepełniać.
  • overflow: hidden na body, żeby "naprawić" poziome przewijanie. Zamiast tego znajdź element, który jest za szeroki (często stałe width, długi adres URL albo 100vw przy 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: hidden tworzące pionowy pasek przewijania. Użyj clip.
  • Rozwijane menu przycięte przez kartę. Przycina je overflow: hidden karty; 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;.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ