FINÁLNY VÝPREDAJ KREDITOV na ITnetwork je tu. Využi poslednú šancu a získaj až 80 % extra kreditov ZADARMO na náš interaktívny e-learning. Zisti viac:
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

2. diel - Responzívny webdesign pomocou Media Queries v CSS3

V minulej lekcii, Úvod do responzívneho webdesignu, sme si predstavili responzívny webdesign.

V tomto tutoriáli responzívneho webdesignu sa naučíme používať media queries, čo sú podmienky v CSS, ktoré umožňujú aplikovať rôzne štýly podľa veľkosti obrazovky zariadenia.

Desktop-first vs. mobile-first prístup

K responzívnemu webdesignu môžeme pristupovať pomocou dvoch základných prístupov.

Desktop-first

Keď sa povie responzívny web, väčšina z nás si predstaví web vytvorený pre desktopy, ktorý sa následne upraví pre mobilné zariadenia. Takto začínal každý – je to ľahké a pomerne efektívne. V podstate tvoríme normálnu stránku, tak ako sme sa to učili, a prenastavujeme elementy podľa pravidiel pre menšie šírky.

Metóda má však jeden zásadný problém. Zmena rozloženia webu pre rôzne zariadenia je dosť zložitá a vyžaduje prepisovanie veľkej časti kódu – a my určite nechceme písať veľa kódu, však? Navyše často dochádza k nekorektnému zobrazeniu. Veď to poznáme – niečo sa zobrazí dobre, niečo zase nie – des a hrôza. Je to okrem iného tým, že blokové elementy majú v predvolenom stave šírku auto a v bežnom toku zvyčajne využijú dostupnú šírku svojho kontajnera. Pri desktop-first prístupe ich často najprv zúžime a na menších zariadeniach potom ich šírku znovu prepisujeme.

Mobile-first

Mobile-first je metóda tvorby webu, ktorá vyžaduje trochu iné myslenie. Metóda využíva v podstate opačný postup ako desktop-first. Z toho teda vyplýva, že sa začína od zobrazenia pre mobily. A verte či nie, je to paráda.

Mnoho ľudí, najmä začiatočníkov, môže mobile-first spočiatku odrádzať, pretože vyžaduje premýšľať od najmenšej obrazovky a postupne štýly rozširovať pre väčšie.

Mobile-first je výhodný prístup, ktorý ušetrí veľa času a hlavne napíšeme oveľa menej kódu, ktorý sa tak stane aj výrazne prehľadnejším.

Breakpointy a media queries

CSS umožňuje definovať podmienky pomocou tzv. media queries, kedy sa daný štýl aplikuje podľa typu zariadenia alebo rozmerov obrazovky. Pomocou tzv. breakpointov určujeme, od akej šírky alebo výšky obrazovky sa má štýl aktivovať. Najčastejšie sa testuje šírka zobrazenia stránky v prehliadači (viewportu):

@media (min-width: 768px) {
  /* Styles for tablets and larger screens */
}

Okrem šírky môžeme dnes reagovať tiež na:

  • výšku (min-height, max-height),
  • orientáciu displeja (orientation: landscape),
  • hustotu pixelov (min-resolution),
  • používateľské preferencie (prefers-color-scheme: dark).

Viewport

Aby sa web na mobilných zariadeniach vykresľoval v šírke zariadenia a breakpointy fungovali správne, musíme nastaviť viewport. Ten nastavíme meta tagom, ktorý vložíme do HTML hlavičky – ideálne čo najskôr. Ten v podstate nastaví reálnu šírku displeja, ktorú si internetové prehliadače v mobilných zariadeniach rady upravujú podľa seba.

Odporúčané nastavenie je nasledujúce:

<meta name="viewport" content="width=device-width, viewport-fit=cover, initial-scale=1.0">

Poďme si tento meta tag vysvetliť:

  • width=device-width – nastaví šírku viewportu na skutočnú šírku displeja,
  • viewport-fit=cover – zabezpečí správne zobrazenie na zariadeniach s výrezom displeja (napr. iPhone),
  • initial-scale=1.0 – zabráni automatickému zoomovaniu pri načítaní stránky.

Box-sizing

Budeme využívať vlastnosť box-sizing. Najčastejšie sa používa s hodnotou border-box, čo nám mení rozpätie šírky elementu a počíta do neho aj padding a border. Môžeme teda napríklad nastaviť šírku na 500px, pridať padding či border a element bude mať konečne šírku naozaj len 500px.

Odporúčané nastavenie na začiatku projektu:

*,
*::before,
*::after {
  box-sizing: border-box;
}

Porovnanie

Poďme si teda ukázať krátke porovnanie prístupov desktop-first a mobile-first. Budeme mať jednoduché rozloženie blokov (predstavujúcich napríklad galériu, články...), ktoré budú na počítači zobrazené v dvoch stĺpcoch a na mobile v jednom stĺpci.

Je dôležité uvedomiť si, že blokové elementy majú v HTML v predvolenom stave šírku auto a v bežnom toku zvyčajne využijú dostupnú šírku svojho kontajnera. To znamená, že rozloženie do jedného stĺpca je prirodzené predvolené správanie.

Metódou desktop-first by sme napísali asi tento kód:

.blocks {
  display: flex;
  flex-wrap: wrap;
}

.block {
  flex: 1 1 50%;
  background: lightblue;
  text-align: center;
  padding: 20px;
  min-height: 100px;
}

@media (max-width: 700px) {
  .block {
    flex-basis: 100%;
  }
}

Metódou mobile-first by sme napísali tento kód:

.blocks {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.block {
  background: lightblue;
  text-align: center;
  padding: 20px;
  min-height: 100px;
}

@media (min-width: 700px) {
  .blocks {
    flex-direction: row;
    flex-wrap: wrap;
  }

  .block {
    flex: 1 1 48%;
  }
}

Všimnime si, že pri desktop-first často musíme niektoré vlastnosti pre menšie šírky prepísať späť na prirodzené predvolené správanie (napr. roztiahnutie cez dostupnú šírku). Pri zložitejších štýloch to môže byť náročné a dizajn sa potom môže "rozsypať" kvôli zabudnutému prepisu. Pri mobile-first naopak typicky nechávame základný (mobilný) stav jednoduchší a zmeny pridávame až pre väčšie viewporty.

Ukážka mobile-first

Ukážeme si ešte jeden príklad, teraz iba s metódou mobile-first, pretože je to zatiaľ najefektívnejšia metóda na štýlovanie responzívnych stránok. Preto sa tiež ostatnými metódami už zaoberať nebudeme.

Vytvoríme si jednoduché štýly pre stránku s elementmi pre jeden článok a dva bočné panely. V priečinku responsive_website/ otvoríme vo VS Code súbor index.html a upravíme ho do tejto podoby:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, viewport-fit=cover, initial-scale=1.0">
    <title>Mobile-first layout example</title>
    <link rel="stylesheet" href="style.css" />
</head>

<body>
    <div class="layout">
        <article class="article">Article</article>
        <aside class="side-panel">Panel 1</aside>
        <aside class="side-panel">Panel 2</aside>
    </div>
</body>

</html>

Následne vytvoríme nový súbor style.css, ktorého obsah bude s využitím mobile-first vyzerať nasledovne:

/* Reset box-sizing for all elements */
*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: Arial, sans-serif;
  line-height: 1.6;
}

.layout {
  display: flex;
  flex-direction: column;
  gap: 20px;
  padding: 20px;
  max-width: 1000px;
  margin: 0 auto;
}

.article,
.side-panel {
  min-height: 100px;
  padding: 15px;
  color: white;
  border-radius: 6px;
}

.article {
  background: #0077b6;
}

.article h2 {
  margin-top: 0;
}

.side-panel {
  background: #ef476f;
}

.side-panel h3 {
  margin-top: 0;
}

/* From 900 px width - place elements side by side */
@media (min-width: 900px) {
  .layout {
    flex-direction: row;
    align-items: flex-start;
  }

  .article {
    flex: 2;
  }

  .side-panel {
    flex: 1;
  }
}

Vždy sa budeme snažiť vytvárať samostatné komponenty, ktoré nie sú závislé od konkrétneho elementu či pozície v HTML stránke, ale to už trochu predbiehame a viac si o tom povieme v článku o objektovom CSS.

Pri malej obrazovke dostaneme nasledujúci efekt:

Vzhľad stránky na malých displejoch - Responzívny webdesign

Rozloženie na malých displejoch.

A pri väčšej obrazovke dostaneme inak rozmiestnené elementy:

Vzhľad stránky na veľkých displejoch - Responzívny webdesign

Rozloženie na veľkých displejoch.

Flexibilnosť

V ére responzívnych webov metódou desktop-first sme mohli vidieť skôr fixné hodnoty pre šírku v každom @media rozmedzí. V metóde mobile-first sa však často využíva kombinácia responzívnosti a flexibilnosti, teda nenastavujeme pevné hodnoty (px), ale používame flexibilné jednotky, ako sú percentá (%), relatívne (em, rem) alebo viewportové (vw, vh). Tieto jednotky umožňujú, aby sa prvky prirodzene prispôsobovali veľkosti obrazovky a zachovali použiteľnosť na všetkých zariadeniach.

Bavíme sa predovšetkým o šírke a rozložení elementov, ktoré sa vďaka tomu plynulo menia podľa dostupného priestoru. Napríklad:

p {
  font-size: clamp(1rem, 2vw, 1.5rem);
}

Tento zápis zabezpečí, že veľkosť textu sa plynulo mení podľa šírky obrazovky, ale nikdy neklesne pod 1rem a neprekročí 1.5rem.

Snažíme sa stránky robiť flexibilné od najmenších displejov až po najväčšie. Ak na webe samozrejme chceme pevné hodnoty, tak ich použijeme.

Záver

Tvorba naozaj dobre responzívnej stránky fungujúcej naprieč prehliadačmi rozhodne nie je prechádzka ružovou záhradou. Snažíme sa teda využívať efektívne riešenia a vyhýbať sa veciam, ktoré nás obmedzujú a sťažujú nám prácu.

Existujú tiež takzvané CSS/front-end frameworky, ako napr. Bootstrap, ktoré nám (okrem iného) môžu pomôcť k ľahkému responzívnemu dizajnu – hľadajme grid systém.

V ďalšej lekcii, Responzívne menu, si vytvoríme jednoduché responzívne menu metódou mobile-first. Povieme si, na čo si dávať pozor a akým spôsobom zaistiť čo najlepší chod.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 2x (1.37 kB)
Aplikácia je vrátane zdrojových kódov v jazyku HTML a CSS

 

Predchádzajúci článok
Úvod do responzívneho webdesignu
Všetky články v sekcii
Responzívny webdesign
Preskočiť článok
(neodporúčame)
Responzívne menu
Článok pre vás napísal Honza Bittner
Avatar
Užívateľské hodnotenie:
19 hlasov
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Aktivity