Mobile First — správná filozofie

Existují dva přístupy k responzivitě. Mobile First je dnes standardem a z dobrých důvodů:

Desktop First ❌Mobile First ✅
Výchozí CSSPro velké obrazovkyPro malé obrazovky
Media queriesmax-width — zmenšujememin-width — rozšiřujeme
VýkonMobilní zařízení stahují zbytečné stylyMobil dostane jen co potřebuje
MyšleníOdebíráme funkce pro mobilPřidáváme funkce pro desktop
GooglePenalizuje v indexováníPreferuje (mobile-first indexing)
/* ❌ Desktop First — špatně */
.menu { display: flex; }          /* výchozí: flex (desktop) */
@media (max-width: 768px) {
  .menu { display: none; }        /* skryjeme na mobilu */
}

/* ✅ Mobile First — správně */
.menu { display: none; }          /* výchozí: skryté (mobil) */
@media (min-width: 768px) {
  .menu { display: flex; }        /* zobrazíme na desktopu */
}
Kapitola 1 / 8 Další: Viewport →

Viewport meta tag

Bez tohoto tagu mobilní prohlížeče simulují desktopovou šířku (obvykle 980px) a stránka vypadá zmenšeně. Toto je první řádek každého responzivního projektu:

<!-- POVINNÉ pro každý responzivní web -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

/* width=device-width  → šířka = skutečná šířka zařízení
   initial-scale=1.0   → výchozí zoom = 100%             */

/* Méně časté parametry (obecně nedoporučované): */
/* maximum-scale=1.0   → zakáže zoom (špatné pro a11y!) */
/* user-scalable=no    → zakáže zoom (NIKDY nepoužívat!) */
⚠️
Nikdy nezakazujte zoom! user-scalable=no nebo maximum-scale=1 znemožňuje přiblížení pro zrakově postižené uživatele. Je to porušení přístupnostních standardů (WCAG 1.4.4) a v EU od 2025 právně problematické.

Standardní breakpointy

📱
Mobile
< 640px
📱
SM
640px+
💻
MD
768px+
🖥️
LG
1024px+
🖥️
XL
1280px+

Tyto hodnoty odpovídají Tailwind CSS breakpointům — de facto standardu v moderním vývoji.

Media Queries

Media queries aplikují CSS podmíněně — na základě vlastností zařízení nebo viewportu.

/* Základní syntaxe */
@media (min-width: 768px) { /* tablet a výše */ }
@media (max-width: 767px) { /* pouze mobil */ }
@media (min-width: 768px) and (max-width: 1023px) { /* pouze tablet */ }

/* Typ média */
@media screen { /* obrazovky */ }
@media print  { /* tisk */ }

/* Moderní media features */
@media (orientation: landscape) { /* na šířku */ }
@media (prefers-color-scheme: dark) { /* tmavý režim! */ }
@media (prefers-reduced-motion: reduce) {
  /* Vypnout animace pro uživatele s epilepsií atd. */
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}
@media (hover: none) { /* dotykové zařízení, bez myši */ }
@media (min-resolution: 2dppx) { /* Retina displeje */ }

Tmavý režim (prefers-color-scheme)

:root {
  --bg: #ffffff;
  --text: #1a1a1a;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #1a1a1a;
    --text: #f0f0f0;
  }
  /* Ostatní CSS automaticky použije přepsané proměnné! */
}
MD 768px

🧠 Kvíz: V Mobile First přístupu — jaký typ media query používáme pro přidání desktopových stylů?

Kapitola 3 / 8 Další: Jednotky →

Responzivní CSS jednotky

Výběr správné jednotky je klíčový pro responzivní design. Každá má svůj účel:

JednotkaRelativní kTypické použití
pxPixel (absolutní)Borders, shadows, min-width breakpointy
%Rodičovský elementŠířky layoutu, fluid containers
emfont-size rodičePadding/margin relativní k textu, media queries komponent
remfont-size <html> (16px)Typografie, spacing systém — PREFEROVANÁ jednotka
vw1% šířky viewportuFull-width sekce, fluid typografie
vh1% výšky viewportuHero sekce (100vh), sticky layouts
vmin/vmaxMenší/větší viewport rozměrČtvercové elementy, responsivní ikony
chŠířka znaku "0"Omezení délky řádků textu (60–75ch)
svh/dvh/lvhViewport bez/s/large mobilní lištyMobil hero sections (100svh)
/* Zlatý tip: základní spacing systém v rem */
:root { font-size: 16px; } /* 1rem = 16px */

/* Spacing scale */
--space-1: 0.25rem;  /*  4px */
--space-2: 0.5rem;   /*  8px */
--space-3: 0.75rem;  /* 12px */
--space-4: 1rem;     /* 16px */
--space-6: 1.5rem;   /* 24px */
--space-8: 2rem;     /* 32px */
--space-12: 3rem;    /* 48px */

/* max-width pro čitelnost textu */
.article-content { max-width: 65ch; }

🧠 Kvíz: Jakou jednotku použijete pro omezení délky řádku textu na čitelnou délku?

Fluid Typography s clamp()

Funkce clamp(min, preferred, max) je nejelegantnější způsob, jak vytvořit typografii, která plynule škáluje s šířkou viewportu — bez media queries:

/* clamp(minimum, ideální, maximum) */
font-size: clamp(1rem, 2.5vw, 1.5rem);
/* = nejméně 16px, ideálně 2.5% šířky, nejvýše 24px */

/* Praktická typografická škála */
:root {
  --text-sm:   clamp(0.75rem,  1.5vw, 0.875rem);
  --text-base: clamp(1rem,     2vw,   1.125rem);
  --text-lg:   clamp(1.125rem, 2.5vw, 1.25rem);
  --text-xl:   clamp(1.25rem,  3vw,   1.5rem);
  --text-2xl:  clamp(1.5rem,   4vw,   2rem);
  --text-3xl:  clamp(1.875rem, 5vw,   2.5rem);
  --text-4xl:  clamp(2.25rem,  6vw,   3.5rem);
}

/* Fluid spacing */
padding: clamp(1rem, 5vw, 3rem);
gap: clamp(0.75rem, 2vw, 1.5rem);
Živý editor — clamp() typografie
Kapitola 5 / 8 Další: Obrázky →

Responzivní obrázky

Obrázky jsou největší zátěž stránky. Správná implementace zlepšuje výkon a vizuální kvalitu na všech zařízeních.

Základní responzivní obrázek

/* Zlatý základ — obrázek nikdy nepřeteče kontejner */
img {
  max-width: 100%;
  height: auto;
  display: block;
}

srcset — různé rozlišení

<!-- Prohlížeč vybere nejlepší velikost automaticky -->
<img
  src="foto-800.jpg"
  srcset="foto-400.jpg 400w,
          foto-800.jpg 800w,
          foto-1600.jpg 1600w"
  sizes="(max-width: 600px) 100vw,
         (max-width: 1200px) 50vw,
         33vw"
  alt="Popis obrázku"
  loading="lazy"
  width="800" height="600"
>

picture — různé formáty a art direction

<picture>
  <!-- Moderní formáty (menší velikost, lepší kvalita) -->
  <source type="image/avif" srcset="foto.avif">
  <source type="image/webp" srcset="foto.webp">

  <!-- Art direction: jiný výřez na mobilu -->
  <source media="(max-width: 600px)" srcset="foto-mobile.jpg">
  <source media="(min-width: 601px)" srcset="foto-desktop.jpg">

  <!-- Fallback pro starší prohlížeče -->
  <img src="foto.jpg" alt="Popis" loading="lazy">
</picture>

object-fit pro obrázky v kontejnerech

.card-img {
  width: 100%;
  height: 200px;
  object-fit: cover;   /* ořízne, zachová poměr */
  object-fit: contain; /* celý obrázek, s mezerami */
  object-position: center top; /* zaměření na horní část */
}

🧠 Kvíz: Atribut loading="lazy" na obrázku znamená:

Kapitola 6 / 8 Další: Cvičení →

Praktické cvičení

Vytvořte Mobile First responzivní stránku: na mobilu jednosloupec (karty přes celou šířku, hamburger menu), od 640px dvousloupcové karty, od 1024px třísloupcové karty a viditelná navigace. Použijte clamp() pro typografii.

📋
Checklist: viewport meta, Mobile First výchozí styly, @media (min-width: 640px) a @media (min-width: 1024px), clamp() pro nadpisy, max-width: 100%; height: auto; pro obrázky.
Vaše řešení
🏅

Odznak: Responzivní Designér

Zvládáte Mobile First, Media Queries, fluid typografii a responzivní obrázky.

Kapitola 7 / 8 Další: Taháček →

Taháček — rychlá reference

Mobile First šablona

/* Výchozí: mobil */
.element { font-size: 1rem; }

/* Tablet (640px+) */
@media (min-width: 640px)  { .element { font-size: 1.1rem; } }

/* Desktop (1024px+) */
@media (min-width: 1024px) { .element { font-size: 1.2rem; } }

/* Tmavý režim */
@media (prefers-color-scheme: dark) { :root { --bg: #111; } }

/* Bez animací */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}

Fluid hodnoty s clamp()

font-size: clamp(1rem, 2.5vw, 1.5rem);
padding:   clamp(1rem, 5vw,   3rem);
gap:       clamp(0.75rem, 2vw, 1.5rem);

Obrázky

img { max-width: 100%; height: auto; display: block; }
.card-img { width: 100%; height: 200px; object-fit: cover; }
<img loading="lazy" width="800" height="600" alt="...">
Lekce 5 dokončena! Lekce 6: JavaScript základy →