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.