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 dohidden
, ale z potencjalnie lepszą wydajnością, bo nie tworzy nowego kontekstu formatowania i zabrania programowego przewijania.overlay
: Przestarzała wartość, działała jakauto
, 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
.