Kurs HTML

8.2. overflow-x i overflow-y

Wprowadzenie: Niezależna kontrola przepełnienia

W poprzedniej lekcji poznaliśmy właściwość overflow, która kontroluje zachowanie treści wykraczającej poza granice elementu w obu kierunkach (poziomym i pionowym) jednocześnie.

CSS oferuje również dwie bardziej szczegółowe właściwości: overflow-x i overflow-y. Pozwalają one na **niezależne zdefiniowanie**, co ma się dziać z treścią przepełniającą element odpowiednio w **osi poziomej (X)** i **osi pionowej (Y)**.

Daje to większą elastyczność w zarządzaniu układem i przewijaniem, pozwalając np. włączyć tylko pionowy pasek przewijania lub ukryć przepełnienie tylko w poziomie.

Właściwości overflow-x i overflow-y

Obie te właściwości przyjmują te same wartości, co ogólna właściwość overflow:

  • visible: (Domyślne) Treść przepełniająca w danej osi jest renderowana poza granicami elementu.
  • hidden: Treść przepełniająca w danej osi jest przycinana (ukrywana).
  • scroll: Pasek przewijania dla danej osi jest dodawany zawsze (nawet jeśli nie jest potrzebny), a treść jest przycinana.
  • auto: Pasek przewijania dla danej osi jest dodawany tylko wtedy, gdy treść faktycznie przepełnia element w tym kierunku.
  • clip: Podobne do hidden, ale z potencjalnie lepszą wydajnością, bo nie tworzy nowego kontekstu formatowania i zabrania programowego przewijania.
  • overlay: Przestarzała wartość, działała jak auto, ale paski przewijania rysowane były "nad" treścią, nie zajmując miejsca. Nie należy jej używać.

Ważna zależność: Jeśli ustawisz overflow-x lub overflow-y na wartość inną niż visible (np. hidden, scroll, auto), a druga oś ma wartość visible (domyślnie), to wartość visible dla tej drugiej osi zostanie potraktowana tak, jakby była ustawiona na auto. Innymi słowy, nie można mieć jednej osi z przewijaniem lub ukrywaniem, a drugiej z treścią "wylewającą się" poza element - przeglądarka automatycznie ograniczy obie osie.

<div class="box overflow-xy-example">
  Ten tekst jest dość długi i może wymagać pionowego przewijania. Unikamy jednak długich słów, aby nie wymusić poziomego przepełnienia, które chcemy ukryć.
</div>
.box {
  width: 200px;
  height: 100px;
  border: 1px solid black;
  margin-bottom: 10px;
  padding: 5px;
}

.overflow-xy-example {
  overflow-y: auto;   /* Włącz pionowe przewijanie, jeśli potrzebne */
  overflow-x: hidden; /* Zawsze ukrywaj poziome przepełnienie */
  background-color: lightcyan;
  white-space: normal; /* Upewnij się, że tekst się zawija */
}
/* Efekt: Jeśli tekst jest za długi pionowo, pojawi się pionowy pasek. */
/* Poziomy pasek nigdy się nie pojawi, nawet jeśli słowo byłoby za długie. */

Przykłady użycia

Tylko pionowe przewijanie (częsty przypadek)

Chcemy, aby długi tekst w kontenerze był przewijalny tylko w pionie, a ewentualne zbyt długie słowa były po prostu ucinane lub zawijane.

.vertical-scroll-only {
  width: 300px;
  max-height: 200px; /* Ogranicz wysokość */
  overflow-y: auto;   /* Włącz pionowe auto-przewijanie */
  overflow-x: hidden; /* Ukryj poziome przepełnienie */
  border: 1px solid blue;
}

Tylko poziome przewijanie (np. dla tabeli, kodu)

Chcemy, aby szeroka tabela lub blok kodu był przewijalny tylko w poziomie, bez pionowego paska.

.horizontal-scroll-only {
  max-width: 400px; /* Ogranicz szerokość kontenera */
  overflow-x: auto;   /* Włącz poziome auto-przewijanie */
  overflow-y: hidden; /* Ukryj pionowe przepełnienie */
  border: 1px solid green;
  white-space: nowrap; /* Zapobiegaj zawijaniu się treści (np. w bloku kodu) */
}
<div class="horizontal-scroll-only">
  <pre><code>To jest bardzo długa linia kodu, która normalnie spowodowałaby poziome przepełnienie całego layoutu, ale dzięki overflow-x: auto zostanie zamknięta w przewijalnym kontenerze.</code></pre>
</div>

Ukrywanie przepełnienia w obu kierunkach

To samo co overflow: hidden;.

.hide-both {
  overflow-x: hidden;
  overflow-y: hidden;
  /* Równoważne: overflow: hidden; */
}

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz element div o stałej szerokości i wysokości. Wypełnij go tekstem, który jest zarówno długi (aby przepełnić pionowo), jak i zawiera bardzo długie słowo bez spacji (aby przepełnić poziomo). Użyj overflow-y: scroll; i overflow-x: hidden;, aby pokazać tylko pionowy pasek przewijania i obciąć poziome przepełnienie.

Rozwiązanie:

HTML:

<div class="task-box">
  Normalny tekst, który jest wystarczająco długi, aby spowodować pionowe przepełnienie tego kontenera. A teraz bardzo_długie_słowo_bez_spacji_które_spowoduje_poziome_przepełnienie_ale_zostanie_ukryte.
</div>

CSS:

.task-box {
  width: 250px;
  height: 120px;
  border: 1px solid purple;
  background-color: #f0f0ff;
  padding: 10px;
  overflow-y: scroll; /* Zawsze pokazuj pionowy pasek */
  overflow-x: hidden; /* Ukryj poziome przepełnienie */
}

Efekt: Pudełko będzie miało widoczny pionowy pasek przewijania (nawet jeśli tekst by się zmieścił), a bardzo długie słowo zostanie obcięte na prawej krawędzi i nie spowoduje pojawienia się poziomego paska.

Zadanie 2 (do samodzielnego wykonania)

Zmodyfikuj Zadanie 1, używając overflow-y: auto; i overflow-x: auto;. Zaobserwuj, jak teraz pojawiają się oba paski przewijania.

Zadanie 3 (do samodzielnego wykonania)

Stwórz kontener z overflow-x: scroll; i overflow-y: visible;. Umieść w nim treść, która przepełnia go w obu kierunkach. Sprawdź w narzędziach deweloperskich, jaką obliczoną wartość ma overflow-y. Czy treść "wylewa się" w pionie?

FAQ - Najczęściej zadawane pytania

Czy mogę ustawić overflow-x: scroll; i overflow-y: hidden; jednocześnie?

Tak, jest to w pełni poprawne i często używane. Pozwala to na wymuszenie poziomego paska przewijania (jeśli jest potrzebny lub zawsze - zależnie od scroll vs auto) przy jednoczesnym ukryciu jakiegokolwiek pionowego przepełnienia.

Co się stanie, jeśli ustawię tylko overflow-x lub tylko overflow-y?

Jeśli ustawisz tylko jedną z tych właściwości (np. overflow-x: auto;), druga właściwość (overflow-y) przyjmie tę samą wartość. Czyli overflow-x: auto; jest równoważne overflow-x: auto; overflow-y: auto;, a overflow-y: hidden; jest równoważne overflow-x: hidden; overflow-y: hidden;. Wyjątkiem jest sytuacja opisana wcześniej: jeśli jedna oś ma visible, a druga inną wartość, visible jest traktowane jak auto.

Czy overflow-x/y tworzy BFC?

Tak, ustawienie overflow-x lub overflow-y na wartość inną niż visible (i clip) spowoduje utworzenie nowego kontekstu formatowania blokowego (BFC) dla elementu, podobnie jak ogólna właściwość overflow.

Jak overflow-x/y ma się do właściwości overflow?

Właściwość overflow jest skróconą notacją (shorthand) dla overflow-x i overflow-y. Ustawienie overflow: auto; jest równoważne ustawieniu overflow-x: auto; overflow-y: auto;. Jeśli overflow ma podane dwie wartości (np. overflow: scroll hidden;), pierwsza odnosi się do overflow-x, a druga do overflow-y.