Jak nadać stronie wygląd z arkusza egzaminacyjnego
Każdy arkusz INF.03 ma część „Styl CSS”: lista wymagań w rodzaju „nagłówki pierwszego stopnia: kolor SteelBlue, wyrównanie do środka”, „obraz: zaokrąglenie 10px”, „wiersz tabeli po najechaniu: tło LightGray”. Ten kurs uczy zamieniać takie zdania na reguły CSS.
/* wymaganie: „nagłówek h1: kolor SteelBlue, wyśrodkowany, rozmiar 30px” */
h1 {
color: SteelBlue;
text-align: center;
font-size: 30px;
}
Jak korzystać z kursu
- Lekcje idą po kolei: najpierw składnia i selektory, potem kolory i tekst, model pudełkowy, a na końcu odnośniki, listy, tabele, obrazy, formularze, przejścia i strona na telefonie.
- W wielu lekcjach są dema: wybierasz deklarację z listy i od razu widzisz zmianę na stronie.
- Każda lekcja ma ćwiczenie. HTML strony jest gotowy, ty piszesz CSS. Podgląd odświeża się w trakcie pisania, a „Sprawdź” mierzy wynik w przeglądarce. Pod zadaniem możesz rozwinąć listę potrzebnych właściwości.
- Ustawianie bloków obok siebie (float, flex, grid) jest w osobnym kursie „Układ strony: float i flex”.
- Postęp i twoje szkice zapisują się w tej przeglądarce.
Reguła CSS i dołączanie stylów
Arkusz stylów to lista reguł. Reguła ma selektor, czyli to, czego dotyczy, i blok deklaracji w klamrach. Deklaracja to para właściwość i wartość, zakończona średnikiem.
h1 { /* selektor: wszystkie nagłówki h1 */
color: DarkGreen; /* deklaracja: właściwość color, wartość DarkGreen */
text-align: center;
}
- Brak średnika między deklaracjami albo brak klamry psuje regułę i często kolejne reguły. Przeglądarka nie pokazuje błędu, styl po prostu nie działa.
- Komentarz w CSS ma postać
/* … */. Zapis//z JavaScriptu tu nie działa. - Wielkość liter w nazwach właściwości nie ma znaczenia, ale przyjęło się pisać małymi literami, ze słowami łączonymi myślnikiem:
font-size,background-color.
Trzy sposoby dołączenia stylów
| Sposób | Zapis | Kiedy |
|---|---|---|
| zewnętrzny arkusz | <link rel="stylesheet" href="styl.css"> w head | zawsze na egzaminie: arkusz każe utworzyć plik CSS i dołączyć go do strony |
| styl wewnętrzny | <style> … </style> w head | krótkie przykłady, jedna strona |
| styl w atrybucie | <p style="color: red"> | wyjątkowo; trudno go potem zmienić |
styl.css, a w link jest style.css, albo plik leży w innym folderze niż podaje ścieżka. Strona wtedy w ogóle nie ma stylów. Najpierw sprawdź, czy działa jedna prosta reguła, np. body { background: yellow; }.Selektory
Selektor mówi, do których elementów stosuje się reguła. Pięć rodzajów wystarcza do prawie każdego arkusza:
| Selektor | Wybiera | Przykład z arkusza |
|---|---|---|
p | każdy znacznik p | „akapity: rozmiar 14px” |
.wazne | elementy z class="wazne" | „elementy klasy wazne: kolor czerwony” |
#menu | element z id="menu" | „blok menu: tło Navy” |
h1, h2 | h1 i h2 (grupowanie przecinkiem) | „nagłówki pierwszego i drugiego stopnia: czcionka Georgia” |
nav a | odnośniki leżące gdziekolwiek w nav (spacja: potomek) | „odnośniki w menu: bez podkreślenia” |
ul > li | tylko bezpośrednie dzieci | rzadziej; gdy listy są zagnieżdżone |
- Klasa może być na wielu elementach, a element może mieć kilka klas:
class="karta wazne". - Id jest jedno na stronie. W CSS poprzedza go
#, w HTML piszesz samoid="menu". - Spacja ma znaczenie.
p.wazneto akapit z klasą wazne.p .wazneto element z klasą wazne wewnątrz akapitu.
Kaskada, waga selektora i dziedziczenie
Gdy kilka reguł ustawia tę samą właściwość tego samego elementu, wygrywa jedna. Przeglądarka rozstrzyga to w tej kolejności:
- Waga selektora. Id jest mocniejszy od klasy, klasa od znacznika.
#komunikatwygra z.info, a.infozp, niezależnie od kolejności w pliku. Selektor złożony sumuje wagi:nav .linkjest mocniejszy od samego.link. - Kolejność. Przy równej wadze wygrywa reguła zapisana później.
!importantwygrywa ze wszystkim. Używaj tylko w ostateczności, bo potem trudno coś zmienić.
p { color: black; }
.info { color: blue; } /* mocniejsza od p */
#komunikat { color: red; } /* mocniejsza od .info, nawet gdyby stała wyżej */
Dziedziczenie
Część właściwości przechodzi z rodzica na dzieci: kolor i czcionka tekstu, rozmiar, wyrównanie. Dlatego body { font-family: Verdana; } zmienia czcionkę całej strony. Nie dziedziczą się marginesy, dopełnienia, obramowania, tło ani wymiary.
Kolory
color to kolor tekstu, background-color kolor tła. Kolor można zapisać na kilka sposobów i wszystkie dają ten sam wynik:
| Zapis | Przykład | Uwagi |
|---|---|---|
| nazwa | SteelBlue, MistyRose | najczęściej w arkuszach; przepisz dokładnie |
| szesnastkowo | #4682B4, skrót #fa0 = #ffaa00 | dwie cyfry na składową: czerwony, zielony, niebieski |
rgb() | rgb(70, 130, 180) | składowe od 0 do 255 |
rgba() | rgba(0, 0, 0, 0.5) | czwarta liczba to krycie: 0 przezroczysty, 1 pełny |
hsl() | hsl(207, 44%, 49%) | barwa w stopniach, nasycenie, jasność |
Arkusz może podać kolor jako trzy liczby, np. „kolor tła: RGB 46, 139, 87”. Wtedy wpisujesz rgb(46, 139, 87) albo przeliczasz na #2E8B57.
rgba w tle robi przezroczyste samo tło, tekst zostaje wyraźny. opacity: 0.5 robi półprzezroczysty cały element razem z tekstem.Czcionki
| Właściwość | Przykład | Co robi |
|---|---|---|
font-family | Verdana, Tahoma, sans-serif | krój; kolejne to zapasowe, gdy pierwszego nie ma na komputerze; ostatni to ogólna rodzina |
font-size | 18px, 1.2em, 120% | rozmiar |
font-weight | bold, normal, 700 | pogrubienie |
font-style | italic, normal | kursywa |
line-height | 1.5, 24px | wysokość wiersza (interlinia); liczba bez jednostki mnoży rozmiar czcionki |
font-variant | small-caps | kapitaliki |
Nazwę kroju z kilku słów zapisz w cudzysłowie: font-family: "Times New Roman", serif;. Ogólne rodziny to serif (szeryfowa), sans-serif (bezszeryfowa), monospace (o stałej szerokości), cursive.
Jednostki rozmiaru
px: stała liczba pikseli. Najprostsza i najczęstsza w arkuszach.em: wielokrotność rozmiaru czcionki rodzica.2emw akapicie o 16px to 32px.rem: wielokrotność rozmiaru czcionki dokumentu (zwykle 16px), niezależnie od rodzica.%: procent rozmiaru rodzica, jakemrazy 100.
Tekst
| Właściwość | Wartości | Wymaganie w arkuszu |
|---|---|---|
text-align | left, center, right, justify | „wyrównanie do środka”, „wyjustowany” |
text-decoration | none, underline, line-through, overline | „odnośniki bez podkreślenia”, „cena przekreślona” |
text-transform | uppercase, lowercase, capitalize | „wielkie litery”, „każde słowo wielką literą” |
letter-spacing | 3px | „odstęp między literami 3px” |
word-spacing | 10px | „odstęp między wyrazami” |
text-indent | 30px | „wcięcie pierwszego wiersza” |
text-shadow | 2px 2px 4px gray | „cień tekstu”: przesunięcie w poziomie, w pionie, rozmycie, kolor |
text-align wyrównuje zawartość, nie sam blok. h1 { text-align: center; } stawia napis na środku szerokości nagłówka. Blok o ustalonej szerokości stawia się na środku marginesem auto (następna część).Marginesy i dopełnienia
Każdy element to prostokąt złożony z czterech warstw: treść, dopełnienie (padding, wewnętrzny odstęp, ma kolor tła elementu), obramowanie (border) i margines (margin, zewnętrzny odstęp, zawsze przezroczysty).
Skróty z 1–4 wartościami
| Zapis | Znaczenie |
|---|---|
padding: 10px; | wszystkie cztery strony |
padding: 10px 20px; | góra i dół 10px, lewa i prawa 20px |
padding: 10px 20px 30px; | góra 10px, boki 20px, dół 30px |
padding: 10px 20px 30px 40px; | góra, prawa, dół, lewa: zgodnie z ruchem wskazówek zegara |
margin-top: 10px; | jedna strona (także -right, -bottom, -left) |
margin: 0 auto; | blok o ustalonej szerokości na środku |
body ma 8px marginesu, a nagłówki i akapity marginesy u góry i u dołu. Gdy arkusz pokazuje baner przyklejony do krawędzi okna, dopisz body { margin: 0; }.Obramowania, zaokrąglenia i cienie
Obramowanie ma trzy cechy: grubość, styl i kolor. Najczęściej zapisuje się je razem: border: 3px solid DarkOrange;. Bez stylu ramka się nie pokaże, bo domyślny styl to none.
| Właściwość | Przykład | Uwagi |
|---|---|---|
border | 2px dashed Navy | style: solid, dashed, dotted, double, groove, ridge, inset, outset |
border-bottom | 1px solid gray | jedna krawędź; tak robi się linię pod nagłówkiem |
border-radius | 10px, 50% | zaokrąglenie rogów; 50% na kwadracie daje koło |
outline | 2px dashed Blue | obrys poza ramką; nie zajmuje miejsca i nie przesuwa elementów |
box-shadow | 0 4px 8px rgba(0,0,0,0.3) | cień pudełka: przesunięcie w poziomie, w pionie, rozmycie, kolor |
Wymiary i box-sizing
widthiheightustalają szerokość i wysokość. Procent liczy się od rodzica.min-width,max-width,min-height,max-heightograniczają wymiar z jednej strony.max-width: 600pxpozwala blokowi się zwężać, ale nie rozrasta go ponad 600px.height: autoprzy obrazie zachowuje proporcje, gdy ustawisz samą szerokość.vwivhto procent szerokości i wysokości okna:height: 100vhto cały ekran.
box-sizing
Domyślnie width to szerokość samej treści, a dopełnienie i ramka są doliczane. Blok z width: 300px i padding: 20px zajmuje 340px. Po box-sizing: border-box szerokość obejmuje dopełnienie i ramkę, więc blok ma dokładnie 300px. Wiele stron zaczyna arkusz od * { box-sizing: border-box; }.
Tło
| Właściwość | Przykład | Co robi |
|---|---|---|
background-color | LightYellow | kolor tła; widać go także wtedy, gdy obraz się nie wczyta |
background-image | url("gory.jpg") | obraz tła; ścieżka liczy się od pliku CSS |
background-repeat | no-repeat, repeat-x, repeat-y | domyślnie obraz powtarza się w obu kierunkach |
background-position | center, right top | położenie obrazu |
background-size | cover, contain, 100% auto | cover wypełnia cały blok (może przyciąć), contain pokazuje cały obraz |
background-attachment | fixed | obraz stoi w miejscu przy przewijaniu |
background | #1e3a5f url("gory.jpg") no-repeat center / cover | skrót wszystkiego naraz |
W ćwiczeniach kursu zamiast prawdziwych zdjęć pokazuje się plansza z nazwą pliku.
Odnośniki i pseudoklasy
Pseudoklasa wybiera element w określonym stanie albo miejscu. Zapisuje się ją po dwukropku: a:hover.
| Pseudoklasa | Kiedy działa |
|---|---|
:hover | kursor jest nad elementem; działa na każdym elemencie, nie tylko na odnośniku |
:link, :visited | odnośnik nieodwiedzony i odwiedzony |
:active | w chwili kliknięcia |
:focus | pole formularza, w którym jest kursor |
:first-child, :last-child | pierwsze, ostatnie dziecko rodzica |
:nth-child(2), :nth-child(even), :nth-child(odd) | drugie dziecko, parzyste, nieparzyste |
a { color: DarkBlue; text-decoration: none; }
a:hover { color: Orange; text-decoration: underline; }
li:nth-child(even) { background-color: #eeeeee; } /* paski co drugi wiersz */
:link, :visited, :hover, :active. Mają równą wagę, więc reguła niżej wygrywa. Gdy :visited stoi pod :hover, odwiedzony odnośnik nie zmieni koloru po najechaniu.Pseudoelementy
::before i ::after dodają treść przed elementem i po nim, np. .cena::after { content: " zł"; }. ::first-letter i ::first-line stylują pierwszą literę i pierwszy wiersz akapitu.
Listy
| Właściwość | Wartości |
|---|---|
list-style-type | none, disc, circle, square, decimal, lower-alpha, upper-roman |
list-style-image | url("kropka.png"): obrazek zamiast punktora |
list-style-position | inside: punktor wewnątrz bloku tekstu |
Menu z listy
Menu w arkuszach to często lista ul z odnośnikami. Żeby pozycje stanęły w rzędzie, usuń punktory i domyślne wcięcie, a pozycjom daj display: inline-block (więcej o display w lekcji „Wyświetlanie i widoczność”):
#menu { list-style-type: none; margin: 0; padding: 0; }
#menu li { display: inline-block; margin-right: 15px; }
Tabele
Tabela bez stylów nie ma żadnych linii. Typowe wymagania arkusza to ramki komórek, odstęp w komórkach, kolorowy nagłówek i paski co drugi wiersz.
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #999999; padding: 8px; }
th { background-color: SteelBlue; color: white; }
tr:nth-child(even) { background-color: #f0f0f0; }
tr:hover { background-color: LightYellow; }
border-collapse: collapsescala sąsiednie ramki w jedną linię. Bez tego każda komórka ma osobną ramkę z odstępem.paddingustawia się na komórkach (td,th), nie na tabeli.text-alignivertical-alignwyrównują zawartość komórek w poziomie i w pionie.
Obrazy
| Właściwość | Przykład | Co robi |
|---|---|---|
width, height: auto | 200px | rozmiar z zachowaniem proporcji |
max-width | 100% | obraz nie wychodzi poza rodzica |
border-radius | 8px, 50% | zaokrąglenie, koło |
filter | grayscale(100%), blur(3px), brightness(80%), sepia(100%) | filtry graficzne; arkusze lubią szarość, która znika po najechaniu |
opacity | 0.6 | przezroczystość od 0 do 1 |
object-fit | cover | przy stałych width i height obraz wypełnia ramkę bez zniekształcenia |
.miniatura { width: 200px; height: auto; filter: grayscale(100%); }
.miniatura:hover { filter: grayscale(0%); }
Formularze
Pola formularza mają własny, systemowy wygląd: inne czcionki i ramki w każdej przeglądarce. Arkusze często każą je ujednolicić. Kilka pól stylujesz naraz, grupując selektory.
input, select, textarea {
width: 100%;
padding: 8px;
border: 1px solid #aaaaaa;
border-radius: 4px;
font-family: inherit; /* czcionka strony zamiast systemowej */
}
input:focus { border-color: DodgerBlue; outline: none; }
button {
background-color: ForestGreen;
color: white;
border: none;
padding: 10px 20px;
cursor: pointer; /* rączka zamiast strzałki */
}
button:hover { background-color: DarkGreen; }
input[type="text"]to selektor atrybutu: tylko pola tekstowe, bez pól wyboru i przycisków.cursor: pointerpokazuje rączkę nad elementem; arkusze wymagają jej czasem przy przyciskach i obrazach.
Wyświetlanie i widoczność
| Wartość | Zachowanie | Domyślnie mają ją |
|---|---|---|
display: block | nowy wiersz, cała szerokość, działa width i height | div, p, h1, ul, section |
display: inline | w linii z tekstem, szerokość z treści, width nie działa | span, a, strong, img |
display: inline-block | w linii, ale z działającymi wymiarami i marginesami | button, input |
display: none | element znika i nie zajmuje miejsca |
visibility: hidden też ukrywa element, ale zostawia puste miejsce w układzie. opacity: 0 robi element przezroczystym, ale nadal można go kliknąć.
display między none i block, żeby pokazać albo schować blok. W CSS ustawiasz wtedy stan początkowy, np. #szczegoly { display: none; }.Przejścia i transformacje
transition sprawia, że zmiana wyglądu (np. po najechaniu) dzieje się płynnie, a nie skokowo. Ustawia się ją na elemencie w zwykłym stanie, nie w :hover.
.karta {
transition: transform 0.3s, box-shadow 0.3s; /* co i w jakim czasie */
}
.karta:hover {
transform: scale(1.1); /* powiększenie o 10% */
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3);
}
| Transformacja | Co robi |
|---|---|
scale(1.2) | powiększa (mniej niż 1 pomniejsza) |
rotate(45deg) | obraca o kąt |
translate(10px, 0) | przesuwa bez wpływu na inne elementy |
skew(10deg) | pochyla |
Animacje z wieloma krokami robi się regułą @keyframes i właściwością animation, np. animation: mruganie 1s infinite;. Na egzaminie wystarczają zwykle przejścia.
Strona na telefonie: media queries
Reguły wewnątrz @media działają tylko przy spełnionym warunku, najczęściej przy szerokości okna. Dzięki temu ta sama strona ma inny wygląd na telefonie i na komputerze.
h1 { font-size: 24px; }
#panel { display: none; } /* na telefonie ukryty */
@media (min-width: 768px) { /* od 768px w górę */
h1 { font-size: 36px; }
#panel { display: block; }
}
min-width: od tej szerokości w górę. Piszesz najpierw styl na telefon, potem zmiany dla większych ekranów.max-width: do tej szerokości.@media (max-width: 600px)działa tylko na wąskich ekranach.- Strona potrzebuje w
headznacznika<meta name="viewport" content="width=device-width, initial-scale=1">, inaczej telefon udaje szeroki ekran i warunki nie działają tak, jak się spodziewasz.
Wymagania arkusza a właściwości CSS
Arkusz opisuje wygląd słowami. Ta tabela tłumaczy najczęstsze sformułowania na CSS.
| W arkuszu | CSS |
|---|---|
| kolor tła | background-color |
| kolor czcionki, kolor tekstu | color |
| krój czcionki Arial | font-family: Arial, sans-serif |
| rozmiar czcionki 120% | font-size: 120% |
| pogrubienie, pochylenie | font-weight: bold, font-style: italic |
| wyrównanie tekstu do środka | text-align: center |
| wielkie litery | text-transform: uppercase |
| marginesy wewnętrzne | padding |
| marginesy zewnętrzne, odstępy od innych elementów | margin |
| obramowanie ciągłe 1px w kolorze X | border: 1px solid X |
| zaokrąglenie narożników | border-radius |
| cień | box-shadow (blok), text-shadow (tekst) |
| szerokość 50% | width: 50% |
| po najechaniu kursorem | :hover |
| co drugi wiersz tabeli | tr:nth-child(even) (albo odd) |
| styl punktora listy: kwadrat | list-style-type: square |
| obraz w skali szarości | filter: grayscale(100%) |
| przezroczystość 60% | opacity: 0.6 (zastanów się, czy chodzi o krycie 60%, czy przezroczystość 60%) |
| kursor w kształcie łapki | cursor: pointer |
Jak pisać arkusz na egzaminie
- Utwórz plik o nazwie z arkusza i podłącz go w
head. Sprawdź jedną regułą, że działa. - Przepisuj wymagania po kolei, każde jako osobną regułę albo deklarację. Selektor wybieraj taki, jak w treści: „blok o id menu” to
#menu, „elementy klasy cena” to.cena. - Po każdych kilku regułach odśwież stronę i porównaj z obrazem w arkuszu.
- Na koniec sprawdź w narzędziach przeglądarki (F12), czy żadna deklaracja nie jest przekreślona albo oznaczona jako błędna.
Quiz
Pytania w stylu części pisemnej egzaminu. Po kliknięciu odpowiedzi zobaczysz wyjaśnienie.
Ściąga
Selektory
p znacznik · .klasa · #id · h1, h2 kilka naraz · nav a potomek · ul > li dziecko · input[type="text"] atrybut · a:hover · tr:nth-child(even) · li:first-child · .cena::after
Waga: #id > .klasa, :hover > znacznik. Przy równej wadze wygrywa reguła niżej. Dziedziczą się m.in. kolor i czcionka, nie dziedziczą marginesy, ramki i tło.
Tekst i kolor
color, background-color | nazwa, #4682B4, rgb(70,130,180), rgba(0,0,0,0.5) |
font-family | Verdana, sans-serif; kilka słów w cudzysłowie |
font-size, font-weight, font-style, line-height | 18px, bold, italic, 1.5 |
text-align, text-decoration, text-transform | center/justify, none/underline, uppercase |
letter-spacing, text-indent, text-shadow | 3px, 30px, 2px 2px 4px gray |
Pudełko i tło
margin, padding | 1 wartość: wszystkie; 2: pion poziom; 4: góra prawa dół lewa; margin: 0 auto środek |
border, border-radius, outline | 2px solid Navy, 10px/50%, 2px dashed Blue |
box-shadow | 0 4px 8px rgba(0,0,0,0.3) |
width, height, max-width, box-sizing | 50%, 150px, 400px, border-box |
background | #1e3a5f url("gory.jpg") no-repeat center / cover |
Elementy strony
| lista | list-style-type: none/square/upper-roman; menu: li { display: inline-block; } |
| tabela | border-collapse: collapse; th, td { border; padding }; tr:nth-child(even) |
| obraz | width + height: auto; filter: grayscale(100%); opacity; object-fit: cover |
| formularz | input, select, textarea { width; padding; border }; input:focus; cursor: pointer |
| widoczność | display: block/inline/inline-block/none; visibility: hidden; opacity |
| przejście | transition: transform 0.3s + w :hover transform: scale(1.1) |
| telefon | @media (min-width: 768px) { … }, @media (max-width: 600px) { … } |