Lekcja 35
Logical properties
Logical properties pozwalają opisywać odstępy, rozmiary, obramowania i pozycjonowanie przez kierunek treści, a nie przez fizyczne strony ekranu. Dzięki temu komponenty lepiej działają w layoutach LTR, RTL i w bardziej elastycznych systemach UI.
Cele lekcji
Po ukończeniu tej lekcji będziesz umieć:
- wyjaśnić różnicę między osiami
inlineiblock, - zamienić fizyczne właściwości typu
margin-leftna logiczne odpowiedniki, - stosować
margin-inline,padding-blockiborder-inline-start, - używać
inline-sizeiblock-sizezamiast sztywnegowidthiheight, - pozycjonować elementy przez
inset-inline-startiinset-block-start, - projektować komponenty, które nie zakładają, że „start” zawsze oznacza lewą stronę.
Kontekst praktyczny
W klasycznym CSS często piszemy left, right, top i bottom. To działa, dopóki interfejs ma jeden kierunek tekstu i jeden sposób układania treści. Logical properties opisują intencję: początek tekstu, koniec tekstu, początek bloku albo koniec bloku.
inline-start zwykle jest po lewej stronie, ale w językach RTL będzie po prawej. Komponent napisany logicznie dostosuje się bez dopisywania osobnego CSS.Osie inline i block
Oś inline biegnie zgodnie z kierunkiem pisania tekstu w linii. Oś block biegnie w kierunku układania kolejnych bloków treści. W typowym polskim dokumencie inline to lewo-prawo, a block to góra-dół.
/* Zamiast myśleć: lewa i prawa strona */
.card {
margin-inline: auto;
padding-block: 1rem;
padding-inline: 1.25rem;
}
/* inline: początek i koniec linii tekstu
block: początek i koniec przepływu bloków */
To zmienia sposób myślenia z „ekran ma lewą i prawą stronę” na „treść ma początek i koniec”.
Physical vs logical
Physical properties odnoszą się do fizycznych stron: margin-left, padding-top, border-right. Logical properties odnoszą się do osi i kierunku pisania: margin-inline-start, padding-block-start, border-inline-end.
/* Physical */
.alert {
padding-top: 1rem;
padding-right: 1.25rem;
padding-bottom: 1rem;
padding-left: 1.25rem;
border-left: .25rem solid #2563eb;
}
/* Logical */
.alert {
padding-block: 1rem;
padding-inline: 1.25rem;
border-inline-start: .25rem solid #2563eb;
}
Drugi zapis jest krótszy i lepiej opisuje intencję: akcent ma być na początku treści, nie zawsze po lewej stronie ekranu.
Margin i padding
Najłatwiej zacząć od odstępów. margin-inline obejmuje początek i koniec osi inline, a padding-block obejmuje początek i koniec osi block.
.section {
padding-block: clamp(2rem, 6vw, 5rem);
padding-inline: 1rem;
}
.section__inner {
max-inline-size: 68rem;
margin-inline: auto;
}
.card + .card {
margin-block-start: 1rem;
}
margin-inline: auto to logiczny odpowiednik centrowania kontenera w osi poziomej w typowym dokumencie LTR.
Border i sizing
Logical properties obejmują także obramowania i rozmiary. inline-size odpowiada rozmiarowi w osi inline, a block-size w osi block. W wielu komponentach to czytelniejsze niż width i height.
.timeline-item {
max-inline-size: 42rem;
min-block-size: 8rem;
padding-block: 1rem;
padding-inline: 1.25rem;
border-inline-start: .25rem solid #22c55e;
}
To szczególnie przydatne w komponentach dokumentacyjnych, alertach, timeline'ach i układach, które mogą kiedyś działać w innym kierunku pisania.
Pozycjonowanie
Logical properties mają też odpowiedniki dla pozycjonowania. Zamiast top i left możesz użyć inset-block-start i inset-inline-start.
.card {
position: relative;
}
.card__badge {
position: absolute;
inset-block-start: .75rem;
inset-inline-end: .75rem;
}
Badge pozostaje przy początku bloku i końcu linii tekstu. W LTR będzie w prawym górnym rogu, a w RTL przeniesie się na lewą stronę.
Kierunki tekstu
Nie każdy projekt od razu obsługuje wiele języków, ale dobre komponenty nie powinny niepotrzebnie blokować takiej możliwości. Właściwość dir w HTML może zmienić kierunek tekstu, a logical properties dopasują spacing i akcenty bez osobnych wyjątków.
<article class="notice" dir="rtl">
<h3>Komunikat</h3>
<p>Ten komponent używa border-inline-start.</p>
</article>
W CSS nie musisz wtedy pisać osobnej reguły [dir="rtl"] .notice, jeśli używasz logicznych stron komponentu.
Demo logical properties
Dwie karty używają tej samej klasy i tej samej reguły border-inline-start. W wariancie LTR akcent jest po lewej stronie, a w wariancie RTL automatycznie przenosi się na prawą stronę.
Panel aktualizacji
Akcent startowy, odstępy i pozycja badge'a są opisane przez inline i block, nie przez left i right.
Przejdź do ćwiczeniaلوحة التحديث
Ten sam CSS przenosi akcent i badge na logiczny początek lub koniec tekstu.
Przejdź do ćwiczeniaNajczęstsze błędy początkujących
- Mechaniczne mieszanie
left/rightzinline-start/inline-endw tym samym komponencie. - Zakładanie, że
inlinezawsze oznacza poziomą oś od lewej do prawej. - Używanie logical properties tylko dla marginesów, ale pozostawianie fizycznych borderów i pozycji badge'y.
- Zapominanie, że
widthiheightnadal są poprawne, gdy projekt faktycznie opisuje fizyczny wymiar. - Przepisywanie całego CSS naraz zamiast zaczynania od komponentów, które realnie zyskają na logice kierunku.
- Brak testu z
dir="rtl"nawet w prostym demo komponentu.
Mini zadanie
Przepisz komponent alertu z fizycznych właściwości na logical properties.
- Zamień
padding-top,padding-right,padding-bottomipadding-leftnapadding-blockipadding-inline. - Zamień
border-leftnaborder-inline-start. - Zamień
widthograniczające komponent namax-inline-size. - Dodaj badge z
position: absolute,inset-block-startiinset-inline-end. - Przetestuj alert w dwóch wariantach HTML:
dir="ltr"idir="rtl". - Sprawdź, czy komponent nadal wygląda poprawnie bez dopisywania klas wariantów dla RTL.
Checklista
- Rozumiem różnicę między osiami
inlineiblock. - Potrafię zastąpić
margin-leftprzezmargin-inline-start, gdy opisuję początek treści. - Używam
padding-blockipadding-inlinedo skracania powtarzalnych odstępów. - Wiem, kiedy
border-inline-startjest lepsze niżborder-left. - Potrafię pozycjonować badge przez
inset-block-startiinset-inline-end. - Testuję komponent z innym kierunkiem tekstu, jeśli ma wspierać wiele języków.
Podsumowanie lekcji
Logical properties pomagają pisać CSS bliżej znaczenia layoutu. Zamiast kodować fizyczną lewą i prawą stronę, opisujesz początek i koniec treści, co poprawia elastyczność komponentów oraz przygotowuje projekt na różne kierunki pisania.
Kolejny krok roadmapy to CSS nesting i nowoczesna składnia.
Przejdź do Lekcji 36