How to use media queries for mobile & other devices?

Media Queries: Hvorfor Virker max-width Ikke i Chrome?

21/04/2022

Rating: 4.47 (11873 votes)

Det kan være utroligt frustrerende, når man arbejder med responsivt design, og ens CSS media queries ikke synes at virke som forventet. Især når max-width-regler driller, og måske endda opfører sig forskelligt på tværs af browsere som Chrome. Du er ikke alene om denne oplevelse. Mange udviklere støder på lignende udfordringer, og ofte skyldes det nogle få, men afgørende, detaljer i opsætningen. Lad os dykke ned i de mest almindelige årsager til, at din max-width media query muligvis ikke fungerer, og hvordan du effektivt kan løse dem.

What happens if a media query doesn't have a x px tag?
Without this tag, media queries just MATCH regardless of the condition. e.g. max-width: x px always returns true. Is your browser zoom -ed at different than 100% level ?

Media queries er en hjørnesten i moderne webudvikling, der gør det muligt for os at tilpasse layout og stil til forskellige skærmstørrelser, opløsninger og enhedstyper. De er essentielle for at skabe en god brugeroplevelse, uanset om brugeren besøger din hjemmeside på en stor computerskærm, en tablet eller en smartphone. Når de fejler, kan det ødelægge hele dit responsive design.

Indholdsfortegnelse

Den Afgørende viewport Meta-tag

En af de absolut mest almindelige årsager til, at max-width media queries ikke fungerer korrekt, især i mobilbrowsere eller når du tester i Chrome's udviklerværktøjer, er en manglende eller forkert konfigureret viewport meta-tag. Uden denne tag ved browseren ikke, hvordan den skal skalere indholdet korrekt, hvilket ofte resulterer i, at den gengiver siden med en standard 'desktop'-bredde (f.eks. 980px) og derefter skalerer den ned. Dette kan få dine media queries til at udløses på uventede tidspunkter eller slet ikke.

For at sikre, at browseren korrekt fortolker enhedens bredde, skal du altid inkludere følgende meta-tag i din HTML-fils <head>-sektion:

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

Denne tag fortæller browseren at indstille viewport-bredden til enhedens faktiske bredde (width=device-width) og at sætte den oprindelige zoomfaktor til 1 (initial-scale=1.0). Dette er afgørende for, at max-width og min-width media queries fungerer som tiltænkt og refererer til den faktiske, fysiske bredde af brugerens skærm.

Forstå max-width kontra min-width

En anden kilde til forvirring kan være den præcise forståelse af max-width og min-width. Selvom du siger, at du forstår, hvordan de virker, er det værd at gentage, for det er her, mange små fejl sniger sig ind.

  • @media only screen and (max-width: 1400px): Denne regel gælder, når skærmens bredde er 1400 pixels eller mindre. Den er designet til at målrette mindre skærme eller skærme, der er indsnævret til denne størrelse.
  • @media only screen and (min-width: 480px): Denne regel gælder, når skærmens bredde er 480 pixels eller mere. Den er designet til at målrette større skærme eller skærme, der er udvidet til denne størrelse.

Det er vigtigt at forstå, at media queries ikke er eksklusive. Hvis din skærmbredde f.eks. er 1000px, vil både en max-width: 1400px-regel og en min-width: 480px-regel være aktive. Når flere media queries gælder samtidigt, træder CSS'ens kaskadeprincip i kraft, hvilket fører os til næste punkt.

Sammenligning af max-width og min-width

Egenskabmax-widthmin-width
BetydningGælder for skærmbredder op til og med den angivne værdi.Gælder for skærmbredder fra og med den angivne værdi.
AnvendelseOfte brugt til mobile-first design (nedskalering) eller til at målrette mindre skærme.Ofte brugt til desktop-first design (opskalering) eller til at målrette større skærme.
Eksempel@media (max-width: 768px) { ... }@media (min-width: 769px) { ... }
Breakpoint logik'Alt under X''Alt over X'

CSS Specificitet og Kaskade

Selv hvis din viewport-tag er korrekt, og du forstår max-width, kan dine stilarter stadig blive overskrevet. CSS fungerer efter et sæt regler kaldet kaskaden, som bestemmer, hvilke stilarter der anvendes, når der er konflikter. De vigtigste faktorer er:

  1. Specificitet: Mere specifikke CSS-regler (f.eks. et ID-selector er mere specifikt end en klasse-selector, som er mere specifik end en element-selector) overskriver mindre specifikke regler.
  2. Rækkefølge: Hvis to regler har samme specificitet og gælder for det samme element, vil den sidst deklarerede regel i din stylesheet vinde.

I dit eksempel fra JSFiddle:

@media only screen and (max-width:1400px) { .heading-left { left: -0.5%; } }
@media only screen and (min-width:480px) { .heading-left { left: -0.5%; } }

Hvis din skærmbredde er f.eks. 1000px, vil begge disse media queries være aktive. Da de begge forsøger at sætte left: -0.5% for .heading-left, og de har samme specificitet (begge er klasseselektorer), vil den sidst deklarerede regel vinde. Det betyder, at hvis min-width:480px-reglen står efter max-width:1400px-reglen i din CSS, vil den overskrive left-egenskaben, selvom max-width-reglen også er aktiv.

For at debugge dette, skal du bruge browserens udviklerværktøjer (F12 i Chrome). Vælg det element, du forsøger at style (f.eks. .heading-left), og se i 'Styles'-panelet. Her kan du se, hvilke CSS-regler der anvendes, hvilke der er overskrevet, og hvorfor (f.eks. på grund af specificitet eller rækkefølge). Dette er et uvurderligt værktøj til at finde konflikter.

Brug af !important (med forsigtighed)

I sjældne tilfælde, hvor specificitetsproblemer er særligt genstridige, kan du bruge !important-flagget for at tvinge en stilregel igennem:

@media only screen and (max-width:1400px) {
.heading-left {
left: -0.5% !important;
}
}

Brugen af !important frarådes dog generelt, da det kan gøre din CSS sværere at vedligeholde og debugge. Forsøg altid at løse specificitetsproblemer med en bedre CSS-struktur først.

Do media queries work?

Almindelige Fejlkilder og Løsninger

1. Manglende eller Forkert viewport Meta-tag

  • Problem: Browseren fortolker ikke skærmbredden korrekt.
  • Løsning: Tilføj altid <meta name="viewport" content="width=device-width, initial-scale=1.0"> i din HTML <head>.

2. CSS Specificitet og Rækkefølge

  • Problem: Andre CSS-regler overskriver din media query-stil.
  • Løsning: Brug browserens udviklerværktøjer til at undersøge, hvilke regler der anvendes. Omarranger din CSS, så de mest generelle regler kommer først, og media queries kommer senere, eller brug mere specifikke selektorer inden for dine media queries.

3. Browser Caching

  • Problem: Browseren bruger en ældre version af din CSS-fil.
  • Løsning: Tving en genindlæsning (Ctrl+F5 eller Cmd+Shift+R) eller ryd din browsers cache. I udviklerværktøjerne kan du ofte deaktivere cache, mens panelet er åbent.

4. Media Query Uden 'x px' Tag (Uspecifikke Queries)

Du spurgte, hvad der sker, hvis en media query ikke har en 'x px' tag. Der er to fortolkninger af dette:

  • Gyldig uspecifik query: Hvis du skriver @media only screen { .my-class { color: blue; } }, så gælder denne stil for alle skærme, uanset deres bredde eller højde. Det er en gyldig syntax, men den vil ikke give dig responsiv adfærd baseret på størrelse.
  • Ugyldig syntax: Hvis du mener @media only screen and (max-width:) { ... } uden en værdi, er dette en ugyldig CSS-syntax og vil simpelthen blive ignoreret af browseren. Media features (som max-width) kræver altid en værdi.

For at målrette specifikt under en vis bredde, er det essentielt at inkludere en værdi, f.eks. max-width: 1400px.

Sådan Tester Du Korrekt

For at sikre, at dine media queries fungerer som tiltænkt, skal du bruge Chrome's indbyggede udviklerværktøjer:

  1. Åbn udviklerværktøjerne (F12 eller højreklik > Inspicer).
  2. Klik på ikonet for "Toggle device toolbar" (det ligner en mobiltelefon og en tablet).
  3. Dette åbner en responsiv visning, hvor du kan trække i kanterne for at ændre viewport-bredden og -højden manuelt. Du kan også vælge foruddefinerede enheder eller indtaste specifikke bredder/højder.
  4. Mens du justerer bredden, skal du holde øje med dine elementer og se, om de ændrer sig som forventet. Brug 'Elements'- og 'Styles'-panelerne til at se, hvilke regler der er aktive.

Praktiske Eksempler

Lad os antage, at du vil anvende en stil, når browserstørrelsen er mindre end 1400px, og din max-width ikke virker. Her er et komplet eksempel, der tager højde for viewport-tag og korrekt CSS:

<!DOCTYPE html>
<html lang="da">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Media Query Test</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f4f4f4;
}
.container {
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
max-width: 1200px; /* Standard maks-bredde for store skærme */
margin: 0 auto;
}
h2 {
color: #333;
}
p {
color: #666;
line-height: 1.6;
}

/* Standard stil for .heading-left */
.heading-left {
position: relative; /* Eller absolute, som i dit eksempel */
width: 150px;
height: 100px;
background-color: #ff6347; /* Tomat rød */
color: white;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
left: 0; /* Standard position */
transition: left 0.3s ease-in-out, background-color 0.3s ease-in-out;
}

/* Media query: Anvend stil når skærmbredden er 1400px eller mindre */
@media only screen and (max-width: 1400px) {
.heading-left {
left: -0.5%; /* Flyt lidt til venstre */
background-color: #4682b4; /* Stålblå, når max-width er aktiv */
}
.container {
padding: 15px;
}
p {
font-size: 0.95em;
}
}

/* Et andet breakpoint for endnu mindre skærme */
@media only screen and (max-width: 768px) {
.heading-left {
left: -1%; /* Flyt mere til venstre på små skærme */
background-color: #32cd32; /* Limegrøn på små skærme */
width: 100%;
}
.container {
border-radius: 0;
box-shadow: none;
}
body {
padding: 0;
}
}

/* Dit min-width eksempel (for at vise rækkefølgen) */
@media only screen and (min-width: 480px) {
/* Hvis denne regel placeres efter max-width:1400px, og skærmen er f.eks. 1000px, vil denne regel vinde for 'left' */
/* For at undgå konflikter, organiser dine breakpoints logisk. */
/* Her overskriver den ikke farven, da de andre er mere specifikke pga. max-width */
.heading-left {
/* left: 0; */ /* Hvis du ville nulstille 'left' her, ville det overskrive */
}
}

</style>
</head>
<body>
<div class="container">
<div class="heading-left">
<p>Element</p>
</div>
<h2>Velkommen til en Verden af Responsive Designs</h2>
<p>Dette er en demonstration af, hvordan media queries fungerer. Prøv at ændre bredden af dit browservindue, eller brug Chrome's 'Toggle device toolbar' for at se effekten af de forskellige breakpoints. Bemærk, hvordan farven på 'Element'-boksen og dens position ændrer sig, når du krydser 1400px-mærket og 768px-mærket.</p>
<p>Når skærmbredden er over 1400px, vil boksen være tomatrød. Når den er 1400px eller derunder, men over 768px, vil den være stålblå. Og når skærmbredden er 768px eller derunder, vil den blive limegrøn og strække sig over hele bredden. Dette viser den dynamiske natur af media queries og vigtigheden af en korrekt opsætning, inklusive den essentielle viewport meta-tag.</p>
<p>Husk altid at tjekke din CSS' specificitet og rækkefølge. Hvis en regel ikke anvendes, er det ofte fordi en anden regel med højere specificitet eller en senere erklæret regel overskriver den. Brug udviklerværktøjerne til at analysere kaskaden og identificere eventuelle konflikter. Systematisk fejlfinding er nøglen til at mestre responsivt design.</p>
</div>
</body>
</html>

Ofte Stillede Spørgsmål (FAQ)

Hvorfor virker min media query ikke i Chrome, men i andre browsere?

Den mest sandsynlige årsag er en manglende eller forkert <meta name="viewport" content="width=device-width, initial-scale=1.0">-tag i din HTML-kode. Chrome kan være mere følsom over for dette og fortolke skærmbredden anderledes uden den. Andre årsager kan være browsercaching eller subtile forskelle i, hvordan browsere håndterer CSS-specificitet eller kaskade.

Hvad sker der, hvis en media query ikke har en 'x px' tag?

Hvis en media query slet ikke specificerer en bredde (f.eks. @media only screen { ... }), vil den gælde for alle skærme, uanset deres dimensioner. Den vil altså ikke være responsiv i forhold til skærmstørrelse. Hvis den har en feature som max-width, men mangler en værdi (f.eks. max-width:), er det en ugyldig syntax, og reglen vil blive ignoreret.

Hvordan kan jeg kun anvende en stil, når browserstørrelsen er mindre end 1400px?

Du skal bruge @media only screen and (max-width: 1399.98px) { ... } eller @media only screen and (max-width: 1400px) { ... }. Hvis du ønsker, at den skal gælde strengere mindre end 1400px (dvs. ikke inklusiv 1400px), er det bedst at bruge en værdi som 1399.98px for at undgå float-point-fejl i nogle browsere, selvom 1399px også ofte bruges.

Hvad er forskellen på max-width og min-width?

max-width anvender stilarter, når skærmbredden er lig med eller mindre end den angivne værdi. Den bruges typisk til at nedskalere designet fra større til mindre skærme. min-width anvender stilarter, når skærmbredden er lig med eller større end den angivne værdi. Den bruges typisk til at opskalere designet fra mindre til større skærme.

Hjælper !important med media query-problemer?

Ja, !important kan tvinge en stilregel til at blive anvendt, selvom den ellers ville blive overskrevet af en mere specifik eller senere deklareret regel. Det bør dog bruges med stor forsigtighed og kun som en sidste udvej, da det kan gøre CSS sværere at vedligeholde og debugge på længere sigt. Det er altid bedre at løse underliggende specificitets- eller kaskadeproblemer.

Konklusion

At få dine max-width media queries til at fungere problemfrit i Chrome og andre browsere kræver en systematisk tilgang. Start altid med at sikre, at din viewport meta-tag er korrekt opsat. Dernæst skal du omhyggeligt gennemgå din CSS for at forstå specificitet og rækkefølgen af dine regler. Brug browserens udviklerværktøjer aktivt til at debugge og identificere konflikter. Med disse værktøjer og en solid forståelse af CSS' kaskadeprincip vil du hurtigt kunne løse de fleste problemer med media queries og skabe et robust responsivt design.

Hvis du vil læse andre artikler, der ligner Media Queries: Hvorfor Virker max-width Ikke i Chrome?, kan du besøge kategorien Teknologi.

Go up