Why are CSS media queries not working?

Proč nefungují CSS Media Queries a jak to opravit?

07/04/2023

Rating: 4.92 (16031 votes)

V dnešní době, kdy se webové stránky prohlížejí na nepřeberném množství zařízení – od malých obrazovek telefonů, přes tablety, až po širokoúhlé monitory stolních počítačů – je responzivní design naprostou nutností. CSS Media Queries jsou základním kamenem pro dosažení tohoto cíle, umožňující nám přizpůsobit vzhled webu specifickým vlastnostem zařízení, jako je šířka obrazovky, rozlišení nebo orientace. Když však tyto klíčové nástroje nefungují podle očekávání, může to být pro vývojáře nesmírně frustrující. Stránky se lámou, texty jsou nečitelné nebo se prvky překrývají. Tento článek se ponoří do nejčastějších příčin, proč se vaše CSS Media Queries nechovají, jak by měly, a poskytne vám ucelený přehled praktických řešení, jak tyto problémy efektivně odstranit a zajistit, aby se váš web zobrazoval bezchybně na každém zařízení.

Do media queries work in DevTools?
I’m using the following media queries, and they work fine in the Chrome iPhone8 & responsive modes in DevTools. But I just tested on Safari and the ios simulator and it fails.
Obsahový index

Kontrola syntaxe Media Query

Nejčastější příčinou nefunkčních Media Queries je paradoxně ta nejzákladnější: chybné zápisy neboli syntaxe. Jediný překlep, chybějící závorka nebo nesprávné použití operátoru může způsobit, že prohlížeč vaše pravidla zcela ignoruje. Je klíčové pečlivě zkontrolovat každý znak a ujistit se, že dodržujete správnou strukturu pro danou verzi CSS.

Základní syntaxe Media Query vždy začíná pravidlem @media, po němž následuje typ média (např. screen, print, all) a volitelně jeden nebo více výrazů pro vlastnosti média (tzv. media features), uzavřených v závorkách. Příklad:

@media screen and (min-width: 30em) and (orientation: landscape) { /* Zde jsou CSS pravidla */ p { font-size: 0.5rem; } }

V tomto příkladu je screen typ média a min-width: 30em a orientation: landscape jsou vlastnosti média. To znamená, že CSS pravidla uvnitř se aplikují pouze na obrazovky, které mají minimální šířku 30em a jsou v režimu na šířku (landscape).

Běžné chyby v syntaxi

  • Překlepy: I ta nejmenší chyba v názvu vlastnosti (např. min-widht místo min-width) znemožní fungování. Moderní vývojová prostředí jako VSCode nabízejí autokompletaci a zvýrazňování syntaxe, což výrazně pomáhá tyto chyby odhalit.
  • Použití čárek místo and: Čárka (,) v Media Query funguje jako logické OR, což znamená, že pokud je splněna kterákoli z podmínek, pravidla se aplikují. Pokud chcete, aby se pravidla aplikovala pouze tehdy, když jsou splněny všechny podmínky, musíte použít operátor and. Podívejte se na tento příklad:
/* Toto znamená: buď min-width 600px, NEBO max-width 601px */ @media only screen and (min-width: 600px), screen and (max-width: 601px) { li { display: inline; padding-left: 5%; padding-right: 5%; } }

Pokud vaším záměrem bylo cílit na rozsah šířek, kde jsou splněny obě podmínky (např. šířka mezi 600px a 601px včetně), správný zápis by měl být s and:

/* Toto znamená: min-width 600px A ZÁROVEŇ max-width 601px */ @media only screen and (min-width: 600px) and (max-width: 601px) { /* ... vaše CSS pravidla ... */ }

Důkladná kontrola syntaxe je prvním a nejdůležitějším krokem při odstraňování problémů s Media Queries.

Správné Breakpointy a Orientace

Váš web je navržen tak, aby se zobrazoval na široké škále zařízení, a proto je zásadní definovat správné breakpointy. Breakpointy jsou specifické šířky obrazovky, při kterých se mění rozvržení nebo styl vašeho webu. Použití nesprávných breakpointů nebo ignorování orientace zařízení může vést k tomu, že se váš design nebude na určitých zařízeních zobrazovat optimálně.

Responzivní design a breakpointy

Při návrhu responzivního webu je běžné začít s přístupem „mobile-first“, což znamená, že designujete nejprve pro nejmenší obrazovky (mobilní telefony) a postupně přidáváte styly pro větší obrazovky. Tento přístup často vede k čistšímu a efektivnějšímu CSS. V takovém případě budete používat primárně min-width pro vaše Media Queries.

Standardní breakpointy

Existují obecně přijímané standardní sady breakpointů, které pokrývají většinu běžných velikostí obrazovek. Tyto šířky jsou často používány v populárních CSS frameworkách jako Bootstrap a slouží jako dobrý výchozí bod:

  • X-Small zařízení (telefony na výšku, méně než 576px): Žádná Media Query, toto je základní styl (mobile-first).
  • Small zařízení (telefony na šířku, 576px a více):
    @media (min-width: 576px) { /* ... */ }
  • Medium zařízení (tablety, 768px a více):
    @media (min-width: 768px) { /* ... */ }
  • Large zařízení (desktopy, 992px a více):
    @media (min-width: 992px) { /* ... */ }
  • X-Large zařízení (velké desktopy, 1200px a více):
    @media (min-width: 1200px) { /* ... */ }
  • XX-Large zařízení (ještě větší desktopy, 1400px a více):
    @media (min-width: 1400px) { /* ... */ }

Kromě šířky je důležité zvážit i orientaci zařízení (orientation: landscape pro na šířku, orientation: portrait pro na výšku), zvláště u tabletů a telefonů.

Specifické breakpointy pro zařízení

Někdy je užitečné znát konkrétní šířky obrazovek populárních zařízení, abyste mohli ladit svůj design. Následující tabulka uvádí některé běžné šířky zařízení (v pixelech) v portrétním režimu a jejich poměr pixelů, který ovlivňuje, jak se pixely CSS mapují na skutečné pixely zařízení.

ZařízeníŠířka zařízení (na výšku)Výška zařízení (na šířku)Pixel ratio
HTC One3606403
Samsung Galaxy S23205341.5
Samsung Galaxy S33206402
Samsung Galaxy S43206403
Samsung Galaxy S53606403
LG Nexus 43845922
LG Nexus 53605923
Asus Nexus 76019061.33
iPad 1 a 276810241
iPad Air, iPad Mini, iPad Pro 9"76810241
iPad 3 a 476810242
iPad Air, iPad Mini, iPad Pro 9"76810241
iPad Pro 10"83411121
iPad Pro 12"102413661
iPhone 3G3204801
iPhone 43204802
iPhone 53205682
iPhone SE3205682
iPhone 6, 7, 8, X3756672
iPhone 6 Plus4147363
Huawei Ascend P63605922
Huawei Ascend P73605923
OnePlus One3606403
HD laptopy1366
13" MacBook Pro1440

(Poznámka: Hodnoty v tabulce jsou v pixelech. Pixel ratio označuje poměr fyzických pixelů k CSS pixelům.)

Znalost těchto hodnot vám může pomoci při ladění specifických problémů s rozvržením na konkrétních zařízeních. Vždy však pamatujte, že je lepší navrhovat pro rozsahy šířek (breakpointy) než pro konkrétní zařízení, protože trh se neustále vyvíjí a objevují se nová zařízení s různými rozměry.

Pořadí Media Queries

Jedním z často přehlížených, ale kriticky důležitých aspektů CSS je kaskáda a priorita pravidel. To platí i pro Media Queries. Pořadí, ve kterém jsou vaše Media Queries definovány v CSS souboru, má přímý vliv na to, která pravidla se aplikují. Obecně platí, že byste měli umístit nejméně specifické styly (základní styly pro mobilní zařízení v případě mobile-first přístupu) na začátek souboru a postupně přidávat specifické styly pro větší obrazovky s použitím min-width.

Pokud používáte desktop-first přístup, pak byste měli mít základní styly pro desktop a pro mobilní zařízení používat max-width. V takovém případě by vaše Media Queries s max-width měly být umístěny níže v souboru, aby přepsaly základní styly pro menší obrazovky.

Příklad:

.test { font-size: 180px; /* Toto je výchozí velikost písma */ } @media screen and (max-width: 350px) { .test { font-size: 120px; /* Toto se aplikuje, když je šířka menší než 350px */ } }

V tomto případě se na element s třídou .test nejprve aplikuje font-size: 180px. Pokud je však šířka obrazovky menší nebo rovna 350px, pak se pravidlo uvnitř Media Query přepíše a velikost písma bude 120px. Toto funguje správně, protože Media Query je umístěna níže a má tedy vyšší prioritu v rámci kaskády, když je její podmínka splněna.

Co by se stalo, kdyby bylo pořadí obrácené?

@media screen and (max-width: 350px) { .test { font-size: 120px; } } .test { font-size: 180px; /* Toto by přepsalo předchozí pravidlo, pokud by nebyla splněna podmínka Media Query */ }

V tomto scénáři, pokud by šířka obrazovky byla například 300px, aplikovalo by se font-size: 120px z Media Query. Nicméně, pokud by následně v CSS souboru bylo definováno pravidlo .test { font-size: 180px; }mimo Media Query, a to po definici Media Query, pak by se toto pravidlo aplikovalo vždy, bez ohledu na šířku obrazovky, protože by mělo vyšší prioritu v rámci kaskády (je definováno později a není vázáno na Media Query). Je tedy klíčové, aby vaše obecnější pravidla byla definována před těmi specifickými, které se nacházejí uvnitř Media Queries, nebo aby pravidla uvnitř Media Queries měla dostatečnou specificitu pro přepsání předchozích pravidel.

Vždy si představte CSS jako kaskádu, kde pravidla definovaná později a s vyšší specificitou přepisují ta dříve definovaná. Media Queries dodávají další vrstvu k této logice, aplikující se pouze za specifických podmínek.

Why are CSS media queries not working?
CSS media queries are an incredibly useful tool for targeting specific devices, resolutions, and other factors when creating a website. This is good for overall responsive design. However, when they don’t work, it can be incredibly frustrating. 1.Check your media query syntax The most common cause of media queries not working is incorrect syntax.

Konfliktní Styly a Logické Operátory

CSS Media Queries umožňují vytvářet složité logické výrazy pomocí operátorů jako and, not a only. Ačkoliv jsou tyto operátory mocné, mohou také snadno vést ke konfliktním stylům nebo neintuitivnímu chování, pokud nejsou správně pochopeny a použity.

Příklady konfliktů

  • Konfliktní rozsahy šířek: Jednou z nejčastějších chyb je definování Media Query s logickým rozporem v podmínkách.
/* ❌ Nefunguje, protože min-width bude v konfliktu s max-width */ @media all and (min-width: 300px) and (max-width: 200px) { /* ... vaše styly ... */ }

Tato Media Query nikdy nebude splněna, protože šířka obrazovky nemůže být zároveň minimálně 300px a zároveň maximálně 200px. Takové logicky nemožné podmínky jsou častým zdrojem frustrace. Vždy se ujistěte, že vaše rozsahy jsou smysluplné (např. min-width: 200px a max-width: 300px).

  • Nesprávné použití operátoru not: Operátor not se aplikuje na celou Media Query, nikoliv pouze na jednotlivé vlastnosti uvnitř. To je důležité si uvědomit, aby nedocházelo k neočekávanému chování. Představte si, že chcete cílit na všechny typy médií (obrazovka, tisk atd.), ale pouze pro monochromatické prohlížeče:
@media all and (monochrome) { /* ... styly pro monochromatické zobrazení ... */ }

Nyní, pokud přidáte operátor not, aplikuje se na celou podmínku:

/* ✔️ Toto se aplikuje, když NENÍ splněna podmínka 'all and (monochrome)' */ @media not all and (monochrome) { /* ... styly ... */ } /* ✔️ Toto je totéž jako výše, explicitně uzavřené v závorkách */ @media not (all and (monochrome)) { /* ... styly ... */ } /* ❌ Toto NENÍ totéž jako výše, 'not' se vždy aplikuje na celou query */ @media (not all) and (monochrome) { /* ... styly ... */ }

Poslední příklad je syntakticky nesprávný, protože not nelze aplikovat pouze na typ média all tímto způsobem. Vždy pamatujte, že not neguje celou podmínku Media Query, ke které je přidán. Důkladné pochopení a testování složitých logických operátorů je nezbytné pro předvídatelné chování vašeho responzivního designu.

HTML Meta Tag Viewport

I když máte bezchybnou syntaxi a správně definované breakpointy, vaše Media Queries stále nemusí fungovat, pokud ve vašem HTML dokumentu chybí klíčový meta tag: viewport. Bez tohoto tagu se mobilní prohlížeče často pokoušejí zobrazit webovou stránku v jakémsi „desktopovém“ režimu, což znamená, že simulují širší obrazovku (např. 980px) a poté ji zmenší, aby se vešla na skutečnou obrazovku zařízení. To vede k tomu, že vaše Media Queries, které se spoléhají na skutečnou šířku zařízení, nefungují správně.

Správný meta tag viewport vypadá takto a měl by být umístěn v sekci <head> vašeho HTML souboru:

<meta name="viewport" content="width=device-width, initial-scale=1" />

Pojďme si rozebrat, co jednotlivé části znamenají:

  • width=device-width: Tato vlastnost říká prohlížeči, aby nastavil šířku viewportu na šířku zařízení v nezávislých pixelech (CSS pixelech). Tím se zajistí, že 1 CSS pixel odpovídá 1 CSS pixelu na zařízení, což je nezbytné pro správné fungování responzivního designu a Media Queries.
  • initial-scale=1: Tato vlastnost nastavuje počáteční úroveň zoomu, když se stránka poprvé načte. Hodnota 1 znamená, že stránka se zobrazí bez jakéhokoli počátečního zoomu, v měřítku 1:1.

Bez tohoto meta tagu může prohlížeč interpretovat šířku stránky jinak, než jak ji vnímá CSS. Například iPhone v režimu na výšku má sice fyzickou šířku 375px (CSS pixely), ale bez viewport tagu by si mohl myslet, že je to 980px široká desktopová stránka, a zmenšil by ji. Vaše Media Queries pro max-width: 400px by se pak nikdy neaktivovaly. Proto je meta tag viewport naprosto nezbytný pro funkční responzivní design.

💡 Tip: Při emulaci zařízení v Chrome DevTools se ujistěte, že máte také přidán minimum-scale=1 do viewport meta tagu, což může pomoci s konzistentnějším chováním zoomu při testování:

<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />

Tato drobná úprava může zabránit některým neočekávaným problémům se zoomem, které se mohou objevit během vývoje a ladění.

Často Kladené Otázky (FAQ)

Zde najdete odpovědi na nejčastější dotazy týkající se CSS Media Queries a souvisejících témat.

Fungují Media Queries v DevTools?

Ano, absolutně! Vývojářské nástroje (DevTools) ve většině moderních prohlížečů (jako je Chrome, Firefox, Edge) nabízejí vynikající funkce pro testování a ladění responzivního designu, včetně Media Queries. Můžete aktivovat režim emulace zařízení, který vám umožní měnit šířku a výšku viewportu, přepínat orientaci (na výšku/na šířku) a dokonce simulovat různá zařízení s jejich specifickými rozlišeními a pixelovými poměry. To je neocenitelný nástroj pro rychlé zjištění, zda se vaše Media Queries aplikují správně a jak váš design reaguje na různé velikosti obrazovek. Můžete také přímo v DevTools upravovat CSS a okamžitě vidět změny, což výrazně urychluje proces ladění.

Proč je důležitý responzivní design?

Responzivní design je klíčový, protože zajišťuje, že vaše webové stránky budou přístupné a použitelné pro co nejširší publikum, bez ohledu na zařízení, které používají. S rostoucím počtem uživatelů přistupujících k internetu prostřednictvím mobilních telefonů a tabletů je nezbytné, aby se váš web správně zobrazoval a fungoval na těchto menších obrazovkách. Dobře navržený responzivní web zlepšuje uživatelskou zkušenost, snižuje míru okamžitého opuštění, zvyšuje SEO pozice (Google preferuje mobilně optimalizované weby) a v konečném důsledku může vést k vyšší konverzi a spokojenosti uživatelů. Bez responzivního designu by se váš web mohl na mobilních zařízeních jevit jako zlomený, nečitelný nebo obtížně ovladatelný, což by odradilo potenciální návštěvníky.

Co je to "mobile-first" přístup?

„Mobile-first“ je přístup k responzivnímu webdesignu, kde se nejprve navrhuje a vyvíjí pro nejmenší obrazovky (mobilní telefony) a poté se postupně rozšiřuje design pro větší obrazovky (tablety, desktopy). V praxi to znamená, že základní CSS styly jsou napsány pro mobilní zařízení a teprve poté se přidávají Media Queries s min-width pro úpravy stylů pro větší viewporty. Tento přístup má několik výhod: nutí vás soustředit se na nejdůležitější obsah a funkce, vede k menšímu a efektivnějšímu CSS kódu (protože se začíná s minimem stylů a přidává se jen to, co je potřeba pro větší obrazovky) a často výsledkem je lepší výkon na mobilních zařízeních.

Jaký je rozdíl mezi min-width a max-width?

  • min-width: Tato Media Feature se používá k aplikování stylů, když je šířka viewportu alespoň daná hodnota. Je ideální pro přístup "mobile-first". Například @media (min-width: 768px) se aplikuje na obrazovky široké 768px a více.
  • max-width: Tato Media Feature se používá k aplikování stylů, když je šířka viewportu maximálně daná hodnota. Je ideální pro přístup "desktop-first", kde začínáte s desktopovým designem a snižujete složitost pro menší obrazovky. Například @media (max-width: 767px) se aplikuje na obrazovky široké 767px a méně.

Často se používají dohromady pro cílení na konkrétní rozsahy, například @media (min-width: 768px) and (max-width: 991px) by cílilo na zařízení mezi těmito šířkami (typicky tablety na šířku).

Jaké jednotky použít pro breakpointy?

Pro breakpointy v Media Queries se doporučuje používat relativní jednotky, jako jsou em nebo rem, namísto absolutních jednotek jako px. Důvodem je, že em a rem se skalují s velikostí písma uživatele nebo s výchozí velikostí písma prohlížeče. To zajišťuje větší flexibilitu a lepší přístupnost. Pokud uživatel změní velikost písma ve svém prohlížeči, vaše rozvržení se přizpůsobí, což je pro uživatelskou zkušenost výhodnější. Nicméně, px jsou stále široce používány a jsou zcela funkční, jen je dobré si být vědom jejich absolutní povahy.

Doufáme, že vám tyto tipy pomohly zprovoznit vaše CSS Media Queries. Vždy si pamatujte, že je klíčové dvakrát zkontrolovat syntaxi, ujistit se, že neexistují konfliktní CSS styly (zvláště s min-width a max-width breakpointy), ověřit správné použití HTML meta tagu viewport a zkontrolovat, zda používáte správné breakpointy pro vaše cílová zařízení. Responzivní design je základem moderního webu a s těmito znalostmi budete schopni vytvářet robustní a uživatelsky přívětivé zážitky na všech zařízeních. Hodně štěstí!

Chceš-li si přečíst další články podobné jako Proč nefungují CSS Media Queries a jak to opravit?, navštiv kategorii iPhone.

Go up