Cztery warstwy każdego elementu strony: treść, margines wewnętrzny padding, obramowanie border i margines zewnętrzny margin. Jak policzyć szerokość całkowitą bloku, co zostaje na treść i co zmienia box-sizing: border-box. Lekcja 4.5 kursu INF.03.
Model pudełkowy (box model) to sposób, w jaki przeglądarka liczy miejsce zajmowane przez element: w środku stoi treść, wokół niej wypełnienie, dalej obramowanie, a na zewnątrz margines odsuwający element od sąsiadów. Każdy element strony jest takim prostokątem, więc bez tego rachunku nie da się przewidzieć, ile miejsca zajmie panel ani dlaczego dwie kolumny przestały mieścić się obok siebie. W części pisemnej wracają pytania rachunkowe („jaką szerokość strony pozostawiono na jej treść", „jaka jest całkowita szerokość bloku"), pytania o nazwy („margines wewnętrzny to padding", „obramowanie o szerokości 2 px oraz marginesy wewnątrz tego obramowania") oraz rysunek z tłem Teal i kropkowaną ramką, do którego trzeba dobrać kod. W zadaniu praktycznym arkusz podaje marginesy zewnętrzne i wewnętrzne, szerokości paneli w procentach, wysokości w pikselach, brak obramowania i zaokrąglenie narożników 5 px, czyli same właściwości z tej lekcji.
Cztery warstwy pudełka
Warstwa to jeden z czterech pierścieni, z których zbudowany jest każdy element. Idąc od środka na zewnątrz: content (treść) to obszar zajęty przez tekst albo obraz, opisany właściwościami width (szerokość) i height (wysokość). padding (wypełnienie, margines wewnętrzny) to odstęp między treścią a obramowaniem. border (obramowanie) to linia rysowana wokół wypełnienia. margin (margines zewnętrzny) to pusty odstęp poza obramowaniem, oddzielający element od sąsiadów.
Cztery warstwy pudełka od środka: treść 200 na 100 px, padding 20 px, obramowanie 4 px i margines 10 px, razem 248 px, a przy border-box treść ma 152 px
Tło elementu, ustawiane właściwością background-color, sięga pod treść, pod wypełnienie i pod obramowanie, ale pod margines już nie: margines jest zawsze przezroczysty i widać przez niego tło elementu nadrzędnego. Stąd praktyczna różnica między dwiema warstwami, które mylą się najczęściej: zwiększenie padding powiększa kolorowy prostokąt, bo tło rośnie razem z nim, a zwiększenie margin tylko odsuwa ten prostokąt od reszty strony. Poza obramowaniem da się narysować jeszcze jedną linię, właściwością outline (obrys), która nie zajmuje miejsca w pudełku i nie przesuwa sąsiadów, więc kolor widoczny NA ZEWNĄTRZ obramowania pochodzi właśnie z niej.
Obramowanie opisują trzy właściwości: border-width (szerokość linii, zwykle w pikselach), border-style (styl linii) i border-color (kolor linii). Bez podanego stylu obramowanie w ogóle się nie pokaże, choćby szerokość była ustawiona.
Wartość border-style
Jak wygląda linia
double
podwójna, dwie cienkie linie z przerwą
none
brak obramowania, także brak zajętego miejsca
Skrót border: 4px dotted Teal; podaje wszystkie trzy w jednym wierszu i w tej właśnie kolejności: szerokość, styl, kolor. Pojedynczą krawędź ustawia się osobno właściwościami border-left, border-right, border-top i border-bottom, więc zapis border-left: 3px solid Tomato; rysuje pasek tylko przy lewej krawędzi. Margines zewnętrzny ma jedną wartość specjalną: margin: auto każe przeglądarce wyliczyć marginesy boczne tak, żeby blok o ustalonej szerokości stanął pośrodku elementu nadrzędnego. Bez podanej szerokości nie ma czego centrować, bo blok i tak zajmuje całą dostępną przestrzeń.
Skróty z jedną, dwiema, trzema i czterema wartościami
Skrót to zapis, w którym jedna właściwość ustawia wszystkie cztery krawędzie naraz. Liczba podanych wartości decyduje o tym, którą krawędź opisuje która liczba, a kolejność jest zawsze zgodna z ruchem wskazówek zegara od góry: góra, prawo, dół, lewo.
Skrót
Kolejność wartości
Znaczy
padding: 20px;
wszystkie krawędzie
20 px z każdej strony
margin: 10px 20px;
pion, poziom
10 px góra i dół, 20 px lewo i prawo
padding: 10px 20px 30px;
góra, poziom, dół
10 px góra, 20 px boki, 30 px dół
padding: 50px 20px 40px 30px;
góra, prawo, dół, lewo
50 px góra, 20 px prawo, 40 px dół, 30 px lewo
Cztery liczby to zapis, na którym najczęściej wykłada się pytanie pisemne. Polecenie „margines górny 50 px, dolny 40 px, prawy 20 px i lewy 30 px" wymienia krawędzie w innej kolejności niż CSS, więc trzeba je najpierw ułożyć według zegara, a dopiero potem zapisać padding: 50px 20px 40px 30px;. Wartości rozdziela się spacjami, nigdy przecinkami. Gdy w grę wchodzi jedna krawędź, prościej i bezpieczniej użyć pełnej nazwy: margin-top, margin-right, margin-bottom, margin-left oraz te same cztery dla padding.
Liczenie szerokości całkowitej
Szerokość całkowita to miejsce, jakie element zajmuje w poziomie razem ze wszystkimi warstwami. Domyślnie width opisuje samą treść, więc pudełko na stronie jest szersze niż podana liczba: szerokość całkowita to width powiększona o dwa marginesy wewnętrzne i dwie linie obramowania. Marginesy zewnętrzne dokładają jeszcze dwa razy margin, ale to już odległość od sąsiadów, a nie rozmiar samego prostokąta z tłem. Rachunek prowadzi się w trzech krokach. Wypisz width, padding, border i margin dla jednej strony. Pomnóż trzy ostatnie przez dwa, bo każda warstwa występuje po lewej i po prawej. Dodaj albo odejmij, zależnie od tego, o co pyta polecenie.
.panel {
width: 500px;
padding: 30px 10px;
border: none;
}
Skrót padding: 30px 10px daje 30 px u góry i na dole oraz 10 px po bokach, a obramowania nie ma. W poziomie liczy się tylko druga liczba, więc szerokość całkowita wynosi 500 plus 10 plus 10, czyli 520 px. Wysokość rośnie o 30 px z góry i 30 px z dołu.
Drugi kształt pytania jest odwrotny: arkusz podaje szerokość CAŁEGO bloku i pyta, ile zostaje na treść. Wtedy się odejmuje.
.strona {
box-sizing: border-box;
width: 640px;
padding: 20px;
border: 2px solid #222222;
}
Od 640 px odchodzą dwa marginesy wewnętrzne po 20 px i dwie linie obramowania po 2 px: 640 minus 40 minus 4 daje 596 px na treść. Liczby w arkuszu bywają inne i odpowiedź wychodzi wtedy na przykład 560 px, ale metoda zostaje ta sama: najpierw podwój wypełnienie i obramowanie, potem odejmij od szerokości zewnętrznej. Gotowy rachunek dla własnych liczb pokazuje narzędzie model pudełkowy CSS. box-sizing: content-box kontra border-box
box-sizing (sposób liczenia rozmiaru) to właściwość, która rozstrzyga, co dokładnie opisuje liczba podana w width i height. Ma dwie wartości i to od nich zależy, czy w zadaniu dodajesz, czy odejmujesz.
Wartość
Co obejmuje width
Blok z width: 200px, padding: 20px, border: 4px
content-box
samą treść, wartość domyślna
zajmuje 248 px, treść ma 200 px
border-box
treść razem z wypełnieniem i obramowaniem
zajmuje 200 px, treść ma 152 px
Domyślne content-box psuje układy budowane na procentach. Panel boczny z width: 30% i blok główny z width: 70% wypełniają dokładnie sto procent szerokości elementu nadrzędnego, ale wystarczy dodać im po 20 px wypełnienia, żeby suma przekroczyła dostępne miejsce i drugi blok zjechał pod pierwszy. Przy border-box obie liczby zostają szerokościami całkowitymi, wypełnienie zjada miejsce od środka i kolumny nadal mieszczą się obok siebie. Dlatego arkusz stylów zaczyna się zwykle od jednej reguły z selektorem uniwersalnym, która włącza ten tryb dla wszystkich elementów:
* {
box-sizing: border-box;
}
Zaokrąglenia, cienie i łączenie marginesów
border-radius (zaokrąglenie narożników) zaokrągla rogi pudełka razem z obramowaniem i tłem. Arkusz CKE pisze wprost „zaokrąglenie narożników 5 px", co zapisuje się jako border-radius: 5px. Wartość w procentach liczy się od rozmiaru elementu, więc border-radius: 50% robi z kwadratu koło. box-shadow dokłada cień pod pudełkiem i nie zajmuje miejsca w układzie, a jego składnię opisuje osobna lekcja o tłach, cieniach i animacjach. Gdy treść nie mieści się w pudełku o ustalonej wysokości, o tym, czy ma wystawać, zostać przycięta czy dostać pasek przewijania, decyduje overflow z lekcji o układzie strony. Łączenie marginesów (margin collapsing, składanie marginesów) to reguła, według której dwa stykające się marginesy pionowe nie sumują się: zostaje z nich większy. Akapit z margin-bottom: 30px stojący nad akapitem z margin-top: 20px daje odstęp 30 px, a nie 50 px, i to samo dzieje się między marginesem elementu nadrzędnego a marginesem pierwszego dziecka. Marginesy poziome nie łączą się nigdy, więc dwa bloki obok siebie dzieli zawsze suma ich marginesów. Składanie znika, gdy między marginesami stanie obramowanie albo wypełnienie. Marginesy ujemne, na przykład margin-top: -10px, wciągają element na sąsiada i stosuje się je rzadko, do drobnych korekt położenia.
Pudełka strony sklepu
Panele sklepu komputerowego dostają wypełnienie, zaokrąglone rogi i odstęp od krawędzi, a każdy produkt w bloku głównym własną ramkę. Selektory odwołują się do znaczników sekcji ze strony zbudowanej w lekcji o znacznikach sekcji. aside, main {
padding: 15px;
margin: 10px;
border: none;
border-radius: 5px;
background-color: #ffffff;
}
article {
padding: 10px;
margin-bottom: 10px;
border: 2px solid Tomato;
border-radius: 5px;
}
Panel boczny i blok główny mają białe tło sięgające pod całe wypełnienie, nie mają obramowania i odsuwają się o 10 px od krawędzi oraz od siebie nawzajem. Każdy artykuł z produktem otacza ramka w kolorze akcentu, a margin-bottom zostawia odstęp do następnego produktu. Ponieważ sąsiadujące marginesy pionowe artykułów się łączą, odstęp między dwoma produktami wynosi 10 px, a nie 20 px.
Na egzaminie
Pytania pisemne o model pudełkowy mają kilka stałych kształtów. Pierwszy to nazwa: właściwość definiująca marginesy wewnętrzne to padding, a nie margin, width ani height, i tak samo „wewnętrzny górny margines, czyli odstęp między elementem a otaczającym go obramowaniem" to padding-top, nie border-top ani outline-top. Drugi kształt to rachunek: blok z width: 500px i padding: 30px 10px ma całkowitą szerokość 520 px, a definicja z podaną szerokością strony i marginesami wewnętrznymi każe odjąć, żeby powiedzieć, ile miejsca pozostawiono na treść. Trzeci to opis stylu słowami: „obramowanie o szerokości 2 px oraz marginesy wewnątrz tego obramowania" znaczy border: 2px razem z padding, a „marginesy na zewnątrz tego obramowania" znaczyłoby margin. Czwarty to rysunek: obrazek z tłem Teal, kropkowaną ramką grubości 4 px, wypełnieniem 50 px i marginesem 20 px odpowiada zapisowi border: 4px dotted Teal; razem z padding: 50px; i margin: 20px;, a od odpowiedzi z solid albo dashed odróżnia go sam wygląd linii. Piąty to kolor widoczny poza obramowaniem, którego nie daje ani border, ani margin: rysuje go outline. Wraca też margin: auto z odpowiedzią „marginesy wyliczane przez przeglądarkę tak, aby element został wyśrodkowany w poziomie" oraz skrót z czterema wartościami, gdzie prawy margines zewnętrzny 200 px daje tylko zapis margin: 100px 200px 150px 80px.
Pułapka: padding powiększa sam element razem z jego tłem, margin niczego nie powiększa, tylko odsuwa element od sąsiadów.
W zadaniu praktycznym projektuje się wygląd strony z listy poleceń i każde z nich ma dokładny odpowiednik w kodzie. „Brak obramowania" to border: none, „zaokrąglenie narożników 5 px" to border-radius: 5px, „marginesy zewnętrzne 10 px" to margin: 10px, „marginesy wewnętrzne 15 px" to padding: 15px, a „marginesy wyliczane automatycznie" to margin: auto dla bloku z ustaloną szerokością. Style muszą trafić do zewnętrznego pliku dołączonego znacznikiem <link>, bo zapis w atrybucie style kosztuje punkt. Gdy arkusz podaje szerokości paneli w procentach, a przy tym marginesy wewnętrzne, dopisz na początku arkusza regułę z box-sizing: border-box: bez niej suma 30 procent i 70 procent przekroczy szerokość okna i panele rozjadą się na dwa wiersze, co widać od razu po otwarciu strony w przeglądarce.
Ściąga
width, height
szerokość i wysokość samej treści
padding: 15px;
margines wewnętrzny, odstęp od treści do obramowania
padding: 50px 20px 40px 30px;
góra, prawo, dół, lewo, zgodnie z ruchem wskazówek zegara
border: 4px dotted Teal;
szerokość, styl i kolor obramowania w jednym zapisie
border-style
solid, dashed, dotted, double, none
border: none;
brak obramowania
border-radius: 5px;
zaokrąglenie narożników 5 px
margin: 10px;
margines zewnętrzny, odstęp od sąsiadów
margin: auto;
marginesy wyliczane automatycznie, blok wyśrodkowany w poziomie
outline
linia poza obramowaniem, nie zajmuje miejsca w pudełku
box-sizing: content-box;
domyślne, width to sama treść
box-sizing: border-box;
width obejmuje treść, wypełnienie i obramowanie
szerokość całkowita
width plus dwa razy padding plus dwa razy border
Pobierz ściągę PDF