Eller: Hvor skal jeg putte media queriene mine?
Nesten alle nettlesere forstår media queries. Men det er fortsatt en hel del stakkars jævler der ute som bruker IE 8. Hvem skal tenke på dem når du strør inline media queries i css-filene?
Hva er galt med inline media queries?
Nei, altså, det fungerer greit hvis du bare
bruker max-width
.
En nettleser som ikke skjønner media queries ignorerer alt inne i en media query-blokk. Så hvis du starter med CSS for desktop, og serverer media queries som tilpasser for mobil, så har du noe som funker.
.grid-unit { float: left; } @media screen and (max-width: 660px) { .grid-unit { float: none; } }
Ulempene er:
- Det er hinsides klønete å fjerne CSS-regler fra elementer.
- Mobil-klienter har som oftest langt dårligere ytelse enn desktop, og det er de som ender opp med å måtte prosessere mest CSS.
- Totalt sett ender du opp med mer CSS, hvor en god porsjon er negering av tidligere regler.
Dette er noen tekniske grunner til å gå mobile first. Hvis du bruker min-width
inline, så vil IE ignorere
regler ment for desktop, og få en mobil-lignende versjon av siten
spredt over et enormt kanvas. Alle som har besøkt
en m.
-side vet hvor bedrøvelig det er.
Hah, jeg bruker bare en polyfill!
Sier du det, du?
Rask levering av all CSS er særdeles viktig for opplevd ytelse. Fram til nettleseren har hentet all CSSen, så viser den bare en blank, hvit side. Dette for å unngå det fryktede flash of unstyled content.
Når du bruker en polyfill, så kaster du ytelse på båten:
- Først lastes all CSS ned av nettleseren.
- Så må JavaScript lastes ned. De som ikke har JS er som vanlig ekstra kjørt.
- JavaScriptet parses og kjøres.
- Så laster scriptet ned CSS-filene på nytt. Alle sammen.
- Deretter leser scriptet CSS-filene dine som strings, og parser dem for å skrive om.
- De genererte CSS-filene blir plassert inn i DOMen.
- Og omsider blir nettsiden din rendret.
Gitt tallene vi har på hvordan ytelse påvirker bunnlinja, vil jeg kalle bruken av en slik polyfill som grov tjenesteforsømmelse. Der fikk du den!
Ok, så plasserer vi media queries på link-taggen?
Joda, det er hakket bedre. Det funker i hvert fall med mobile first. Du kan bruke IE sine conditional comments til å servere den alle CSS-filene, mens andre nettlesere får se link-tagger med media queries på.
Ulempen er at du nå har en teknisk løsning som krever at brukerne må laste ned X individuelle CSS-filer, hvor X er antall breakpoints pluss én. Det begrenser din frihet til å lage en best mulig responsiv design, samtidig som det går ut over ytelsen fordi det blir flere requests for å laste ned all CSS.
Men, hvor kan man ellers ha media queries?
På @import
…
Vent, vent, ikke skyt meg!
Du skal selvfølgelig ikke bruke CSS imports i produksjonskoden din. Det er hårreisende dårlig for ytelsen, av samme grunner som at du ikke bør bruke en polyfill. Men heng med et øyeblikk, så skal jeg forklare.
Her er en `responsive.css` fra et av mine prosjekter:
@import "reset.css"; @import "base.css"; @import "off-canvas-menu.css" screen and (max-width: 459px); @import "460up.css" screen and (min-width: 460px); @import "660up.css" screen and (min-width: 660px); @import "730up.css" screen and (min-width: 730px); @import "810up.css" screen and (min-width: 810px); @import "960up.css" screen and (min-width: 960px); @import "space.css";
Og her er en `unresponsive.css` fra samme prosjekt:
@import "reset.css"; @import "base.css"; @import "460up.css"; @import "660up.css"; @import "730up.css"; @import "810up.css"; @import "960up.css"; @import "space.css"; #main {width: 960px;}
Ved hjelp av conditional comments kan jeg nå
servere responsive.css
til de fleste browsere,
og unresponsive.css
til IE. Slik:
<!--[if (gt IE 8) | (IEMobile)]><!--> <link rel="stylesheet" href="responsive.css"> <!--<![endif]--> <!--[if (lte IE 8) & (!IEMobile)]> <link rel="stylesheet" href="unresponsive.css"> <![endif]-->
Som du ser så er ikke lenger HTMLen min knyttet til hvor mange
breakpoints eller CSS-filer jeg har. Men på grunn
av @import
blir det fortsatt lastet ned en haug med
filer.
Det siste som mangler er noe du allerede antagelig gjør: Minifisering og konkatenering av CSS-filene. Byggeverktøyet drar da imports inn i filene.
Du ender opp med:
- én CSS-fil til nettlesere som skjønner media queries, med inline blocks.
- én CSS-fil til nettlesere som ikke skjønner filla, uten media queries, men med alle reglene for desktop.
Nydelig.
Hvordan gjør du responsiv? Syns du jeg overdriver ulempene med noen av de andre løsningene? Har du en bedre framgangsmåte? Hør fra deg i kommentarene. :-)