Jednostki
Przegląd jednostek długości w CSS: od stałych pikseli, przez em i rem zależne od czcionki, po jednostki okna, kontenera i siatki.
Przykład
#.lesson {
max-width: 45ch;
padding: 1rem 1.25rem;
border: 1px solid #3f3f46;
border-radius: 0.75rem;
}
.lesson h3 {
margin: 0 0 0.5rem;
font-size: 1.25rem;
}
.lesson .tag {
display: inline-block;
margin-bottom: 0.5rem;
padding: 0.25em 0.75em;
border-radius: 1em;
background: #3b0764;
font-size: 0.75rem;
}<article class="lesson">
<span class="tag">Moduł 2</span>
<h3>Jednostki względne</h3>
<p style="margin: 0; color: #a1a1aa;">Szerokość w ch, odstępy w rem, etykieta w em, a cienka ramka w pikselach.</p>
</article>Każda jednostka ma tu swoje zadanie: ch ogranicza szerokość tekstu, rem trzyma spójne odstępy i rozmiary, em skaluje etykietę razem z jej czcionką, a px rysuje ramkę, która ma być zawsze cienka.
Definicja i zastosowanie
#Każda długość w CSS to liczba z jednostką, np. 16px, 1.5rem czy 50%. Wyjątkiem jest zero, przy którym jednostkę można pominąć. Jednostki dzielą się na bezwzględne, które zawsze znaczą to samo (w praktyce tylko px), i względne, liczone od czegoś innego: rozmiaru czcionki, rodzica, okna przeglądarki albo kontenera.
em i rem zależą od czcionki. 1rem to rozmiar czcionki elementu głównego <html> (domyślnie 16px), taki sam w całym dokumencie. 1em to rozmiar czcionki bieżącego elementu, więc zmienia się razem z nim, a w samej właściwości font-size liczy się od czcionki rodzica. Dlatego em kumuluje się w zagnieżdżonych elementach, a rem nie.
Jednostki okna liczą się od obszaru widoku: 1vw to 1% jego szerokości, 1vh 1% wysokości. Na telefonach wysokość okna zmienia się, gdy chowa się pasek adresu, dlatego powstały warianty: svh (mały widok, pasek widoczny), lvh (duży widok, pasek schowany) i dvh (dynamiczny, zmienia się na bieżąco). Do sekcji na cały ekran lepsze niż 100vh są 100svh albo 100dvh.
Są też jednostki do zadań specjalnych. ch to szerokość znaku „0” w bieżącej czcionce, więc dobrze ogranicza długość wiersza. fr działa tylko w CSS Grid i oznacza część wolnego miejsca. cqi to 1% szerokości kontenera z container-type. Procenty liczą się zwykle od rodzica, ale od jego szerokości czy wysokości, zależy od właściwości: width od szerokości, height od wysokości, a padding i margin zawsze od szerokości.
Składnia
#<liczba><jednostka>
bezwzględne: px
zależne od czcionki: em, rem, ch
zależne od rodzica, okna lub kontenera: %, vw, vh, svh, lvh, dvh, cqi
siatka: frJednostki
#stała wartość
Piksel CSS to jednostka bezwzględna. Kafelek ma zawsze 160 px, niezależnie od rodzica i okna. Na ekranach o dużej gęstości jeden piksel CSS to kilka pikseli fizycznych, dzięki czemu rozmiary wyglądają podobnie na każdym urządzeniu.czcionka elementu
Odstępy i zaokrąglenie wemrosną razem z czcionką przycisku. Wystarczy zmienićfont-size, a proporcje zostają zachowane.czcionka elementu html
Oba napisy mają 20 px (1,25 × 16 px), choć ich rodzice mają różne czcionki.remzawsze liczy się od elementu<html>, więc się nie kumuluje.rozmiar rodzica
Procenty liczą się od rodzica. Paski mają ćwierć, połowę i całą szerokość ramki z przerywaną linią.szerokość i wysokość okna
50vwto połowa szerokości okna, tutaj ramki podglądu, a nie pola z przerywaną linią, dlatego pierwszy kafelek jest szerszy niż połowa pola.50vhto połowa wysokości okna.wysokość okna na telefonie
Na telefonie pasek adresu chowa się i pokazuje.svhliczy wysokość przy widocznym pasku (najmniejszą),lvhprzy schowanym (największą), advhzmienia się na bieżąco. W ramce podglądu paska nie ma, więc wszystkie trzy kafelki są równe.szerokość znaku 0
Szerokość znaku „0” w bieżącej czcionce. Akapit jest nie szerszy niż 24 takie znaki, a pole na kod pocztowy mieści dokładnie tyle, ile trzeba.wolne miejsce w siatce
frdziała tylko w siatce i oznacza część wolnego miejsca. Środkowa kolumna dostaje dwie części, a boczne po jednej.szerokość kontenera
Przeciągnij prawy dolny róg ramki. Tekst ma 9% szerokości kontenera, więc rośnie i maleje razem z nim, a nie z oknem.
Jednostki w praktyce
#px
.demo { width: 160px; }em
em rosną razem z czcionką przycisku. Wystarczy zmienić font-size, a proporcje zostają zachowane..demo {
padding: 0.5em 1em;
border: 0;
border-radius: 0.5em;
background: #7c3aed;
color: #fff;
}rem
rem zawsze liczy się od elementu <html>, więc się nie kumuluje..demo {
font-size: 1.25rem;
font-weight: 700;
color: #a78bfa;
}%
.a { width: 25%; }
.b { width: 50%; }
.c { width: 100%; }vw / vh
50vw to połowa szerokości okna, tutaj ramki podglądu, a nie pola z przerywaną linią, dlatego pierwszy kafelek jest szerszy niż połowa pola. 50vh to połowa wysokości okna..vw { width: 50vw; }
.vh { height: 50vh; }dvh / svh / lvh
svh liczy wysokość przy widocznym pasku (najmniejszą), lvh przy schowanym (największą), a dvh zmienia się na bieżąco. W ramce podglądu paska nie ma, więc wszystkie trzy kafelki są równe..s { height: 50svh; }
.d { height: 50dvh; }
.l { height: 50lvh; }ch
.demo { max-width: 24ch; margin: 0 0 10px; }
.zip { width: 8ch; font-family: monospace; }fr
fr działa tylko w siatce i oznacza część wolnego miejsca. Środkowa kolumna dostaje dwie części, a boczne po jednej..demo {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 8px;
}cqi
.cq { container-type: inline-size; }
.cq p { font-size: 9cqi; }Więcej przykładów
#.hero {
min-height: 100vh;
min-height: 100svh;
}Pierwsza deklaracja to zapas dla starszych przeglądarek, druga nadpisuje ją tam, gdzie svh działa. Sekcja wypełnia ekran telefonu, a jej dół nie chowa się pod paskiem adresu. Przykład nie ma podglądu, bo ramka dopasowuje wysokość do treści.
Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Rozmiary czcionek podawaj w
rem, nie wpx. Tekst zareaguje wtedy na ustawienie wielkości czcionki w przeglądarce, z którego korzystają osoby słabiej widzące. - Uważaj na
100vw: obejmuje też pionowy pasek przewijania, więc element może wyjść poza stronę i wywołać poziome przewijanie. Na pełną szerokość zwykle wystarczy100%. - Długość wiersza ogranicz, np.
max-width: 65ch. Wiersze mieszczące kilkadziesiąt znaków czyta się najwygodniej.
Powiązane hasła
#- calc()Wylicza wartość z działania matematycznego i pozwala łączyć różne jednostki, na przykład procenty z pikselami.
- clamp()Trzyma wartość w przedziale od minimum do maksimum, a pomiędzy pozwala jej płynnie rosnąć. Podstawa płynnej typografii.
- font-sizeUstawia rozmiar czcionki.
- widthUstawia szerokość elementu.
- @containerNakłada style zależnie od rozmiaru kontenera, a nie całego okna. Komponent dopasowuje się do miejsca, które dostał w układzie.
- repeat()Powtarza wzór kolumn lub wierszy siatki. Z auto-fill lub auto-fit i minmax() tworzy responsywną siatkę bez media queries.
Widzisz błąd albo brakuje przykładu? Napisz do nas.