8.1. Wprowadzenie do overflow
(visible
, hidden
, scroll
, auto
)
overflow
(visible
, hidden
, scroll
, auto
)
Wprowadzenie: Co zrobić z nadmiarem treści?
Właściwość overflow
w CSS określa, co ma się stać z treścią, która **nie mieści się** w ustalonych wymiarach (width
i/lub height
) elementu blokowego. Domyślnie treść po prostu "wylewa się" poza granice elementu, ale overflow
pozwala to zachowanie kontrolować.
Jest to kluczowa właściwość do zarządzania długimi tekstami, dużymi obrazkami w małych kontenerach, tworzenia przewijalnych obszarów na stronie oraz jako mechanizm clearfix (jak wspomniano w poprzedniej lekcji).
W tej lekcji poznamy cztery podstawowe wartości właściwości overflow
.
overflow: visible;
(Domyślne)
Jest to **wartość domyślna** dla większości elementów blokowych. Treść, która nie mieści się w elemencie, jest renderowana **na zewnątrz** jego granic (pudełka).
- Treść "wylewa się" poza element.
- Może nachodzić na inne elementy znajdujące się poniżej lub obok.
- Nie pojawiają się paski przewijania.
<div class="box visible-example">
Bardzo długi tekst, który na pewno nie zmieści się w ustalonych wymiarach tego małego pudełka i wyleje się poza jego granice.
</div>
<p>Tekst poniżej pudełka.</p>
.box {
width: 150px;
height: 50px;
border: 1px solid black;
margin-bottom: 10px;
}
.visible-example {
overflow: visible; /* Domyślne */
background-color: lightyellow;
}
/* Efekt: Tekst wyleje się poza żółte pudełko i może nachodzić na paragraf poniżej. */
overflow: hidden;
Treść, która nie mieści się w elemencie, jest **przycinana (obcinana)** do jego granic i staje się niewidoczna. Nie pojawiają się paski przewijania.
- Nadmiarowa treść jest ukrywana.
- Element zachowuje swoje ustalone wymiary.
- Brak możliwości dostępu do ukrytej treści przez użytkownika (bez dodatkowego kodu JavaScript).
- Tworzy nowy kontekst formatowania blokowego (BFC), co m.in. zapobiega zapadaniu się rodzica przy floatach.
<div class="box hidden-example">
Bardzo długi tekst, który na pewno nie zmieści się w ustalonych wymiarach tego małego pudełka i zostanie brutalnie obcięty na jego krawędziach.
</div>
<p>Tekst poniżej pudełka.</p>
.hidden-example {
overflow: hidden;
background-color: lightcoral;
}
/* Efekt: Tekst zostanie obcięty na granicach czerwonego pudełka. */
/* Paragraf poniżej pojawi się normalnie pod pudełkiem. */
overflow: scroll;
Treść, która nie mieści się w elemencie, jest przycinana, ale przeglądarka **zawsze dodaje paski przewijania** (zarówno poziomy, jak i pionowy), umożliwiając użytkownikowi dostęp do całej zawartości.
- Nadmiarowa treść jest ukrywana, ale dostępna przez przewijanie.
- Paski przewijania są widoczne **zawsze**, nawet jeśli treść idealnie mieści się w elemencie (wtedy paski są nieaktywne, "wyszarzone").
- Paski przewijania zajmują pewną przestrzeń wewnątrz elementu, potencjalnie zmniejszając dostępną przestrzeń dla treści.
- Tworzy nowy BFC.
<div class="box scroll-example">
Bardzo długi tekst, który na pewno nie zmieści się w ustalonych wymiarach tego małego pudełka. Dzięki overflow: scroll pojawią się paski przewijania, które umożliwią odczytanie całości.
</div>
<p>Tekst poniżej pudełka.</p>
.scroll-example {
overflow: scroll;
background-color: lightblue;
}
/* Efekt: Pojawią się paski przewijania (pionowy na pewno, poziomy jeśli */
/* słowa są za długie i nie ma łamania linii). */
overflow: auto;
Jest to wartość najbardziej elastyczna i często preferowana. Przeglądarka dodaje paski przewijania **tylko wtedy, gdy są one potrzebne** – czyli tylko wtedy, gdy treść faktycznie nie mieści się w dostępnej przestrzeni.
- Nadmiarowa treść jest ukrywana, ale dostępna przez przewijanie (jeśli występuje).
- Paski przewijania pojawiają się **automatycznie** tylko dla tej osi (poziomej lub pionowej), w której treść się nie mieści.
- Jeśli treść mieści się idealnie, paski przewijania nie są wyświetlane.
- Tworzy nowy BFC.
<div class="box auto-example">
Krótki tekst.
</div>
<div class="box auto-example" style="height: 80px;">
Bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo, bardzo długi tekst, który spowoduje pojawienie się pionowego paska przewijania.
</div>
<p>Tekst poniżej pudełek.</p>
.auto-example {
overflow: auto;
background-color: lightgreen;
}
/* Efekt: Pierwsze pudełko nie będzie miało pasków. */
/* Drugie pudełko będzie miało pionowy pasek przewijania. */
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz element div
o stałej szerokości i wysokości (np. 200px
na 100px
). Wypełnij go długim tekstem. Zastosuj overflow: hidden;
i zobacz, jak tekst zostaje obcięty.
Rozwiązanie:
HTML:
<div class="clipped-box">
To jest bardzo długi tekst demonstracyjny, który ma na celu pokazanie, jak działa właściwość overflow z wartością hidden. Treść, która wykracza poza ustalone wymiary pudełka, zostanie po prostu ucięta i nie będzie widoczna dla użytkownika.
</div>
CSS:
.clipped-box {
width: 200px;
height: 100px;
border: 1px solid red;
background-color: #fee;
overflow: hidden;
}
Efekt: Tekst zostanie obcięty na granicach czerwonego pudełka.
Zadanie 2 (do samodzielnego wykonania)
Weź element z Zadania 1 i zmień overflow: hidden;
na overflow: scroll;
. Zaobserwuj pojawienie się pasków przewijania.
Zadanie 3 (do samodzielnego wykonania)
Weź element z Zadania 1 i zmień overflow: hidden;
na overflow: auto;
. Następnie skróć tekst tak, aby mieścił się w pudełku. Zaobserwuj, jak paski przewijania znikają.
FAQ - Najczęściej zadawane pytania
Kiedy używać scroll
, a kiedy auto
?
auto
jest zazwyczaj preferowane, ponieważ pokazuje paski przewijania tylko wtedy, gdy są potrzebne, co jest bardziej estetyczne. scroll
używa się rzadziej, głównie w sytuacjach, gdy chcemy, aby paski były zawsze widoczne (nawet nieaktywne), np. aby uniknąć "przeskakiwania" layoutu, gdy paski pojawiają się i znikają dynamicznie.
Czy overflow
działa na elementach inline?
Nie, właściwość overflow
ma zastosowanie tylko do elementów blokowych (lub elementów, które generują kontekst formatowania blokowego, jak inline-block
, table-cell
) z ustaloną wysokością lub szerokością (lub max-height
/max-width
).
Czy mogę stylizować paski przewijania?
Standardowy CSS nie oferuje bezpośrednich właściwości do stylizowania wyglądu pasków przewijania. Istnieją jednak niestandardowe pseudoelementy specyficzne dla przeglądarek (głównie WebKit, np. ::-webkit-scrollbar
), które na to pozwalają, ale nie jest to rozwiązanie w pełni przenośne. Nowsze specyfikacje CSS wprowadzają właściwości scrollbar-width
i scrollbar-color
, ale ich wsparcie jest jeszcze ograniczone.
Jak overflow
wpływa na box-shadow
lub outline
?
overflow: hidden;
(lub scroll
/auto
) przycina również efekty wizualne, które wychodzą poza granice elementu, takie jak box-shadow
czy outline
. Domyślne overflow: visible;
pozwala im być widocznymi.