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
vwmoż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.