14.7. Responsywna typografia (jednostki vw
, clamp()
)
vw
, clamp()
)
Problem ze stałym rozmiarem czcionki
Tradycyjnie rozmiar czcionki ustawiało się za pomocą stałych jednostek jak piksele (px
) lub punktów (pt
). W kontekście RWD, stały rozmiar czcionki może prowadzić do problemów:
- Na bardzo małych ekranach tekst może być zbyt duży, zajmując za dużo miejsca lub powodując niechciane zawijanie.
- Na bardzo dużych ekranach tekst może wydawać się nieproporcjonalnie mały w stosunku do layoutu.
Używanie Media Queries do zmiany font-size
na różnych breakpointach jest rozwiązaniem, ale może prowadzić do skokowych zmian rozmiaru tekstu i wymaga zarządzania wieloma regułami.
Celem **responsywnej (lub płynnej) typografii** jest sprawienie, aby rozmiar tekstu skalował się płynnie wraz ze zmianą rozmiaru viewportu, zapewniając optymalną czytelność na każdym urządzeniu.
Jednostki Viewportu dla font-size
Jak wspomnieliśmy w lekcji o jednostkach relatywnych, jednostki viewportu (vw
, vh
, vmin
, vmax
) mogą być używane do ustawiania rozmiaru czcionki. Najczęściej wykorzystuje się vw
(Viewport Width).
h1 {
/* Rozmiar czcionki to 5% szerokości viewportu */
font-size: 5vw;
}
p {
/* Rozmiar czcionki to 2% szerokości viewportu */
font-size: 2vw;
}
Zalety:
- Tekst skaluje się płynnie wraz ze zmianą szerokości okna.
Wady:
- Na bardzo wąskich ekranach tekst może stać się **zbyt mały**, aby był czytelny.
- Na bardzo szerokich ekranach tekst może stać się **zbyt duży**, dominując layout.
- Może to powodować problemy z dostępnością (WCAG wymaga możliwości powiększania tekstu przez użytkownika, a czcionka oparta tylko na
vw
może to utrudniać).
Czyste użycie vw
dla font-size
jest często zbyt ekstremalne. Lepszym podejściem jest połączenie vw
z inną jednostką, np. rem
, za pomocą funkcji calc()
:
h1 {
/* Minimalny rozmiar 1.5rem + skalowanie 2vw */
font-size: calc(1.5rem + 2vw);
}
To zapewnia pewien minimalny rozmiar bazowy (1.5rem
), do którego dodawane jest płynne skalowanie (2vw
). Jednak nadal nie mamy kontroli nad maksymalnym rozmiarem.
Funkcja clamp()
Nowoczesnym i bardzo eleganckim rozwiązaniem problemów z ekstremalnymi wartościami przy skalowaniu jest funkcja CSS clamp()
. Pozwala ona zdefiniować **minimalną wartość**, **preferowaną (płynną) wartość** i **maksymalną wartość** dla danej właściwości CSS, w tym font-size
.
Składnia:
property: clamp(MIN, PREFERRED, MAX);
MIN
: Minimalna dozwolona wartość. Właściwość nie przyjmie mniejszej wartości, nawet jeśli preferowana wartość obliczy się na mniej.PREFERRED
: Wartość preferowana, która zazwyczaj zawiera jednostkę relatywną (np.vw
) pozwalającą na płynne skalowanie.MAX
: Maksymalna dozwolona wartość. Właściwość nie przyjmie większej wartości, nawet jeśli preferowana wartość obliczy się na więcej.
Przykład dla font-size
:
h1 {
/* Min: 1.5rem, Preferowany: 1rem + 3vw, Max: 3rem */
font-size: clamp(1.5rem, 1rem + 3vw, 3rem);
}
p {
/* Min: 1rem, Preferowany: 0.8rem + 0.5vw, Max: 1.2rem */
font-size: clamp(1rem, 0.8rem + 0.5vw, 1.2rem);
}
Jak to działa?
- Przeglądarka oblicza wartość preferowaną (np.
1rem + 3vw
). - Jeśli obliczona wartość jest **mniejsza niż MIN** (
1.5rem
), używana jest wartość MIN. - Jeśli obliczona wartość jest **większa niż MAX** (
3rem
), używana jest wartość MAX. - Jeśli obliczona wartość mieści się **pomiędzy MIN a MAX**, używana jest obliczona wartość preferowana.
Dzięki clamp()
uzyskujemy płynne skalowanie tekstu w określonym zakresie szerokości viewportu, ale z gwarancją, że tekst nigdy nie będzie ani za mały, ani za duży, co znacznie poprawia czytelność i dostępność.
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Ustaw rozmiar czcionki dla nagłówka h2
tak, aby płynnie skalował się między 1.2rem
a 2.5rem
, używając wartości preferowanej 1rem + 2vw
i funkcji clamp()
.
Rozwiązanie:
CSS:
h2 {
font-size: clamp(1.2rem, 1rem + 2vw, 2.5rem);
}
Efekt: Rozmiar h2
będzie się płynnie zmieniał wraz ze zmianą szerokości viewportu, ale nigdy nie spadnie poniżej 1.2rem
i nie przekroczy 2.5rem
.
Zadanie 2 (do samodzielnego wykonania)
Ustaw rozmiar czcionki dla paragrafu p
, używając clamp()
. Minimalny rozmiar to 16px
, maksymalny to 20px
, a preferowana wartość to 14px + 0.5vw
. (Pamiętaj, że rem
jest często preferowane nad px
dla dostępności, ale dla ćwiczenia użyj px
).
Zadanie 3 (do samodzielnego wykonania)
Spróbuj ustawić line-height
(wysokość linii) dla paragrafu, używając clamp()
, aby płynnie zmieniała się np. od 1.4
do 1.8
, z preferowaną wartością 1.2 + 0.2vw
. Zaobserwuj, jak odstępy między liniami dostosowują się do rozmiaru ekranu.
FAQ - Najczęściej zadawane pytania
Czy clamp()
jest dobrze wspierane przez przeglądarki?
Tak, funkcja clamp()
ma obecnie bardzo dobre wsparcie we wszystkich nowoczesnych przeglądarkach (Chrome, Firefox, Safari, Edge). Można jej bezpiecznie używać w większości projektów.
Jakie jednostki mogę mieszać w clamp()
?
Możesz mieszać różne kompatybilne jednostki. Najczęściej miesza się jednostki absolutne (jak rem
, px
) z jednostkami relatywnymi do viewportu (vw
) w wartości preferowanej, aby uzyskać płynne skalowanie z punktem bazowym.
Czy clamp()
można używać do innych właściwości niż font-size
?
Tak! clamp()
jest bardzo wszechstronne. Można go używać do wielu właściwości CSS przyjmujących wartości liczbowe z jednostkami, takich jak width
, height
, padding
, margin
, line-height
, gap
i wielu innych, aby tworzyć płynnie skalujące się layouty i odstępy.
Czy responsywna typografia zastępuje potrzebę Media Queries dla tekstu?
W dużej mierze tak, jeśli chodzi o sam rozmiar czcionki. Użycie clamp()
pozwala uniknąć wielu Media Queries tylko do zmiany font-size
. Jednak Media Queries mogą być nadal potrzebne do innych zmian typograficznych na różnych ekranach, np. zmiany line-height
, letter-spacing
, font-weight
lub nawet rodziny czcionek.