Styl elementów
Zachęcam do wypróbowania poniższych przykładów na przykładowym projekcie, który można pobrać za pomocą polecenia:
git clone https://github.com/Kwasow/startowa-examples.git
Używane w przykładach biblioteki są już zdefiniowane w pliku package.json w
przykładowym projekcie.
Domyślne znaczniki HTML nie wyglądają zwykle zbyt elegancko i są bardzo proste.
Ma tego świadomość każdy, kto kiedyś robił w szkole stronę w HTMLu. Żeby
modyfikować wygląd znaczników korzystamy z CSS (ang. cascading style sheet),
który pozwala nadawać specjalne atrybuty elementom, które spełniają pewne
warunki. W poniższym przykładzie zmieniamy kolor tekstu w każdym znaczniku
<p> na niebieski:
p {
color: blue;
}
Być może nie chcemy, żeby wszystkie znaczniki <p> miały kolor niebieski,
tylko jeden, wtedy możemy stworzyć nową klasę CSS i przypisać ją do znacznika:
/* Plik CSS */
.niebieski_tekst {
color: blue;
}
<p class="niebieski_tekst">Ten tekst będzie niebieski!</p>
<p>A to będzie normalny, czarny tekst</p>
CSS pozwala na bardzo zaawansowane zmiany stylów komponentów, a nawet animacje i reagowanie na parametry urządzenia (np. rozmiar ekranu) i obszerny opis wszystkich możliwości można znaleźć na stronie W3schools lub Mozilli.
W Reactcie zwykle jednak nie będziemy pisać stylów CSS bezpośrednio, tylko będziemy korzystali z odpowiednich bibliotek.
Styled components
Najbardziej podstawową biblioteką do stylowania znaczników jest
styled-components.
Pozwala ona na stworzenie nowego elementu przy użyciu funkcji styled i znanej
nam już składni CSS. Nowe komponenty będziemy zwyczajowo nazywać z wielkiej
litery. Przyjrzyjmy się poniższemu przykładowi:
const Card = styled.div`
background-color: blue;
border-radius: 3vh;
padding: 1vh;
`
const WhiteText = styled.p`
color: white
`
const BoldWhiteText = styled(WhiteText)`
font-weight: bold;
font-size: 1.5rem;
`
export default function Home() {
return <Card>
<BoldWhiteText>Nagłówek</BoldWhiteText>
<WhiteText>Mniejszy tekst</WhiteText>
</Card>
}
Stworzyliśmy trzy nowe komponenty: Card, WhiteText oraz BoldWhiteText.
Pierwsze dwa są bezpośrednią modyfikacją znaczników HTML, na które nakładamy
atrybuty CSS. Możemy potem korzystać z nowych komponentów w komponencie Home(),
tak samo jakby były to standardowe znaczniki HTML. Komponent BoldWhiteText
jest modyfikacją innego, już zmodyfikowanego komponentu. Zauważmy, że nie musimy
po raz kolejny definiować koloru tekstu, ponieważ jest on dziedziczony z komponentu
WhiteText.
Dzieje się tak zgodnie z nazwą CSS, czyli cascading style sheet - style nakładane są kaskadowo. Jeśli w komponencie "niższym" nadpiszemy któryś atrybut z komponentu "wyższego", to zostanie zastosowany ten niższy. Jeśli komponent "niższy" nie ma jakiegoś atrybutu, to dziedziczy go z komponentu "wyższego".
MUI
Najczęściej nie będziemy jednak korzystać także z biblioteki styled-components
i tworzyć komponentów ręcznie, tylko skorzystamy z gotowej biblioteki, która
utrzymuje wszystkie elementy w tym samym stylu. Jednym z popularnych styli
interfejsów graficznych jest Material UI wymyślony przez firmę Google i popularny
w aplikacjach na system Android (wersja 2,
wersja 3), która w Reactcie jest zaimplementowana
w bibliotece MUI.
Poniższy przykład realizuje podobny interfejs co poprzedni, ale z wykorzystaniem biblioteki MUI.
export default function Home() {
return <Card variant="outlined">
<CardContent>
<Typography variant="h1">Nagłówek</Typography>
<Typography variant="subtitle1">Mniejszy tekst</Typography>
</CardContent>
</Card>
}
Zauważmy, że kod tego komponentu jest dużo prostszy i krótszy. Dodatkowo biblioteka MUI utrzyma taki sam styl dla wszystkich komponentów w całym projekcie, dopasuje kolory i pozwoli też na łatwą implementację trybu ciemnego. Każdy komponent został też przygotowany w kilku wariantach, żeby można go było dopasować do potrzeb. Pełną listę dostępnych komponentów można znaleźć w dokumentacji.
Inne
Bibliotek pozwalających na budowanie ciekawych interfejsów graficznych w Reactcie jest mnóstwo i nie sposób je tu wszystkie wymienić. Łatwo wyszukać wiele artykułów porównujących je pod hasłem "React UI library". Warto pamiętać, że jeden projekt nie powinien korzystać z więcej niż jednej biblioteki, żeby ułatwić zachowanie spójnego stylu.