23/08/2023
I en verden, hvor hastighed og ydeevne er afgørende for brugeroplevelsen på nettet, står webudviklere ofte over for en række udfordringer. En af de mest almindelige syndere bag langsomme websites er store billedfiler, især når de indlæses unødvendigt. Forestil dig et scenarie, hvor du har et storslået hero-billede designet til store desktop-skærme, men på en mobiltelefon er det enten skjult via CSS eller skaleret ned til at være næsten usynligt. Selvom billedet ikke er synligt for brugeren på mobilen, vil browseren i mange tilfælde stadig downloade hele filen, hvilket spilder både båndbredde og værdifuld indlæsningstid. Dette er ikke blot frustrerende for brugeren, der måske betaler for data, men det påvirker også din hjemmesides SEO-rangering.

Traditionelle metoder, som at anvende display: none; i CSS, er desværre ikke den fulde løsning på dette problem. Browseren begynder nemlig at parse HTML-dokumentet og anmode om ressourcer, herunder billeder, før den fortolker og anvender CSS-reglerne. Dette betyder, at selv et skjult billede stadig vil blive hentet, før browseren overhovedet ved, at det skal skjules. Heldigvis tilbyder HTML5 en elegant og yderst effektiv løsning på dette problem: <picture>-tagget. Dette element giver dig mulighed for at definere flere billedkilder, og lade browseren intelligent vælge den mest passende baseret på skærmstørrelse, enhedstype og endda filformat. Lad os dykke ned i, hvordan du kan udnytte <picture> til at optimere din billedhåndtering og forbedre din hjemmesides ydeevne markant.
- Problemet med Skjulte Billeder og Browseradfærd
- HTML5's <picture>-element: Den Elegante Løsning
- Browserunderstøttelse og Fallbacks
- <img> vs. CSS Baggrundsbilleder
- Sammenligning: Skjulte Billeder vs. <picture>
- Ofte Stillede Spørgsmål (FAQ)
- Hvorfor er det vigtigt at forhindre skjulte billeder i at indlæse?
- Forhindrer display: none; virkelig billedindlæsning?
- Hvad er <picture>-tagget?
- Hvordan hjælper <picture> med ydeevnen?
- Hvad med ældre browsere som Internet Explorer?
- Kan jeg bruge <picture> til forskellige billedformater, ikke kun størrelser?
- Er et CSS-baggrundsbillede en bedre løsning?
Problemet med Skjulte Billeder og Browseradfærd
For at forstå, hvorfor <picture>-tagget er så revolutionerende, er det vigtigt først at erkende det grundlæggende problem med, hvordan browsere håndterer billeder, der skal skjules via CSS. Når du designer en responsiv hjemmeside, er det almindeligt at have elementer, der kun skal vises på bestemte skærmstørrelser. For eksempel kan et stort, detaljeret baggrundsbillede være perfekt til en desktop-skærm, men fuldstændig unødvendigt på en mobiltelefon, hvor det enten fylder for meget, er svært at se, eller blot forværrer indlæsningstiden.
Den umiddelbare tanke for mange udviklere er at bruge CSS-egenskaben display: none; (eller visibility: hidden;) i kombination med medieforespørgsler. For eksempel:
@media screen and (max-width: 767px) {
.desktop-image {
display: none;
}
}Mens denne CSS-regel effektivt skjuler billedet for brugeren på mobile skærme, løser den ikke det underliggende ydeevneproblem. Browsere er designet til at være utroligt hurtige til at indlæse websider. Som en del af denne proces scanner browseren HTML-dokumentet for ressourcer som billeder, stylesheets og JavaScript-filer, og begynder at downloade dem, så snart de opdages. Denne ressourceanmodning sker, før browseren fuldt ud har parset hele CSS-filen og anvendt alle stylingregler. Det betyder, at når browseren støder på en <img>-tag i HTML'en, vil den straks anmode om billedfilen fra serveren, uanset om der senere i CSS'en er en regel, der fortæller den at skjule billedet.
Du kan selv bekræfte denne adfærd ved at åbne udviklerværktøjerne i din browser (typisk F12), navigere til 'Netværk'-fanen, og derefter indlæse en side med et billede, der er skjult via display: none; på den aktuelle skærmstørrelse. Du vil se, at billedfilen stadig optræder i listen over netværksanmodninger, komplet med dens størrelse og indlæsningstid. For mobile brugere, især dem med langsomme internetforbindelser eller begrænset data, kan dette resultere i en unødvendig og kostbar oplevelse. Hvert uønsket download øger den samlede sidevægt og forlænger indlæsningstiden, hvilket kan føre til højere afvisningsrater og en dårligere brugeroplevelse. Dette er et kritisk punkt for webstedets ydeevne og brugertilfredshed.
HTML5's <picture>-element: Den Elegante Løsning
Indtil introduktionen af HTML5's <picture>-element var løsninger på dette problem ofte afhængige af JavaScript (f.eks. lazy loading-biblioteker som Picturefill) eller mere komplicerede CSS-baggrundsbilleder, som dog havde deres egne ulemper med hensyn til SEO og tilgængelighed. <picture>-tagget ændrer spillet ved at give webudviklere en indbygget, ren HTML-løsning til at håndtere responsiv billedindlæsning.
MDN Web Docs beskriver <picture>-elementet som en container, der bruges til at specificere flere <source>-elementer for et specifikt <img>-element, som det indeholder. Browseren vælger den mest passende kilde i henhold til sidens aktuelle layout (begrænsningerne for den boks, billedet vises i) og den enhed, det vises på (f.eks. en normal eller hiDPI-enhed).
Kernen i <picture>-tagget er dets evne til at give browseren information om forskellige billedversioner, og derefter lade browseren træffe en intelligent beslutning om, hvilken version der skal indlæses. Dette betyder, at browseren kun downloader det billede, der er mest relevant for brugerens aktuelle kontekst, og undgår at downloade unødvendige ressourcer.

Sådan Bruges <picture>-tagget
Den grundlæggende syntaks for <picture>-tagget er som følger:
<picture>
<source srcset="billede-bred.webp" media="(min-width: 900px)" type="image/webp">
<source srcset="billede-bred.jpg" media="(min-width: 900px)">
<source srcset="billede-smal.webp" type="image/webp">
<img src="billede-smal.jpg" alt="En beskrivende alt-tekst">
</picture>Lad os nedbryde de vigtigste elementer:
<picture>: Dette er container-elementet, der omslutter alle de potentielle billedkilder.<source>: Du kan have et eller flere<source>-elementer. Hvert<source>definerer en potentiel billedkilde og de betingelser, under hvilke den skal bruges.srcset: Dette attribut angiver URL'en til billedfilen. Du kan også angive flere billeder med forskellige opløsninger eller pixel-densiteter (f.eks. for Retina-skærme).media: Dette attribut indeholder en medieforespørgsel (ligesom dem, du bruger i CSS). Browseren vil kun overveje denne<source>, hvis medieforespørgslen matcher.type: (Valgfrit, men anbefalet) Dette attribut angiver MIME-typen for billedfilen (f.eks.image/webpellerimage/avif). Dette er yderst nyttigt for at tilbyde moderne, optimerede billedformater til browsere, der understøtter dem, mens ældre browsere falder tilbage til mere traditionelle formater som JPEG eller PNG.<img>: Dette element er obligatorisk og skal altid være det sidste element inde i<picture>-tagget. Det fungerer som en fallback. Hvis ingen af<source>-elementerne matcher medieforespørgslen, eller hvis browseren slet ikke understøtter<picture>-tagget (f.eks. ældre browsere som Internet Explorer), vil billedet angivet i<img>-taggetssrc-attribut blive indlæst. Det er god praksis at bruge den mindste eller mest kompatible billedversion her.
Browseren evaluerer <source>-elementerne i den rækkefølge, de vises. Den vælger den første<source>, hvis media-attribut matcher den aktuelle visningskontekst. Hvis ingen <source> matcher, eller hvis browseren ikke forstår <picture>, falder den tilbage til <img>-tagget.
Forhindring af Indlæsning på Mindre Skærme
Nu kommer vi til kernen i, hvordan <picture> kan forhindre unødvendig indlæsning. Hvis du vil have et billede til kun at blive indlæst på store skærme (f.eks. desktop) og helt undgå indlæsning på mobile enheder, kan du bruge en lille, gennemsigtig Base64-kodet GIF som pladsholder for mobilvisningen. Denne GIF er så lille, at den praktisk talt ikke kræver nogen netværksanmodning.
Her er et eksempel på, hvordan du kan gøre det:
<picture>
<source srcset="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" media="(max-width: 999px)">
<img src="https://eksempel.com/store-desktop-billede.jpg" alt="Et stort billede til desktop">
</picture>I dette eksempel:
<source srcset="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" media="(max-width: 999px)">: Denne<source>er den første, browseren evaluerer. Hvis skærmbredden er 999px eller mindre, vil browseren vælge denne kilde.data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=er en yderst lille (1x1 pixel) gennemsigtig GIF, der er indlejret direkte i HTML'en (Base64-kodet). Da den er så lille, og indlejret, kræver den ingen ekstern netværksanmodning. Effektivt forhindrer dette, at det store billede bliver hentet.<img src="https://eksempel.com/store-desktop-billede.jpg" alt="Et stort billede til desktop">: Dette er fallback-billedet. Hvis skærmbredden er over 999px (og altså ikke matcher den første<source>), eller hvis browseren ikke understøtter<picture>, vil dette store desktop-billede blive indlæst.
Denne metode sikrer, at det store billede kun indlæses, når det er nødvendigt, og fuldstændigt undgår unødvendige downloads på mobile enheder. Det er en kraftfuld teknik til at forbedre din hjemmesides indlæsningstid og spare data for dine brugere.
Browserunderstøttelse og Fallbacks
Den gode nyhed er, at <picture>-elementet har fremragende understøttelse i moderne browsere, herunder Chrome, Firefox, Safari, Edge og Opera, både på desktop og mobile enheder. Dette gør det til en robust løsning for de fleste brugere i dag.
For ældre browsere, især Internet Explorer, som ikke understøtter <picture>-elementet, er det vigtigt at huske på <img>-tagget som en fallback. Da <img>-tagget er det eneste, ældre browsere vil "se" inde i <picture>, vil de blot indlæse billedet specificeret i src-attributten. Dette er grunden til, at det er vigtigt at placere den mest grundlæggende eller mindste version af billedet i <img>-tagget, hvis du ønsker at minimere ydeevnepåvirkningen for disse ældre brugere, selvom de ikke får den fulde optimering fra <picture>.
Det er vigtigt at understrege, at selvom <picture>-tagget giver dig kontrol over, hvilket billede der indlæses, så er <picture>-elementet i sig selv ikke et display-element. Det viser ikke noget; det giver blot en kontekst for dets indeholdte <img>-element, som gør det i stand til at vælge mellem flere URL'er. Du kan stadig bruge CSS til at skjule <picture>-elementet, men pointen er, at billedet inde i det allerede er valgt og potentielt indlæst baseret på <source>-reglerne, før CSS anvendes.
<img> vs. CSS Baggrundsbilleder
Inden <picture>-tagget blev bredt understøttet, var en almindelig workaround for at forhindre indlæsning af billeder på bestemte skærmstørrelser at bruge CSS-baggrundsbilleder. Argumentet var, at browsere kun ville downloade et baggrundsbillede, hvis det faktisk var nødvendigt for at rendere elementet. Mens dette i visse scenarier kan forhindre unødvendig indlæsning, har det flere ulemper sammenlignet med <picture>:
- SEO-venlighed: Billeder defineret via
<img>-tagget kan havealt-attributter, som er afgørende for søgemaskineoptimering (SEO) og tilgængelighed. Søgemaskiner kan forstå indholdet af billedet gennemalt-teksten. Baggrundsbilleder har ikke en direktealt-attribut, hvilket gør dem mindre tilgængelige for søgemaskiner og skærmlæsere. - Tilgængelighed: For brugere med synshandicap, der anvender skærmlæsere, er
alt-teksten i et<img>-tag afgørende for at forstå billedets indhold. Baggrundsbilleder er rent dekorative og er ikke beregnet til at bære meningsfuldt indhold, og de vil derfor ikke blive læst op af skærmlæsere. - Fleksibilitet:
<picture>giver mere finmasket kontrol over billedvalg baseret på forskellige kriterier (bredde, tæthed, format) og er designet specifikt til responsiv billedhåndtering. CSS-baggrundsbilleder er mere begrænsede i deres responsivitet uden yderligere JavaScript.
Selvom CSS-baggrundsbilleder stadig har deres plads til rent dekorative elementer, er <picture>-tagget den foretrukne løsning for indholdsbærende billeder, hvor både ydeevne, SEO og tilgængelighed er vigtige.

Sammenligning: Skjulte Billeder vs. <picture>
| Funktion | <img style="display: none;"> | <picture> med Pladsholder |
|---|---|---|
| Billedindlæsning | Indlæses altid, selvom det er skjult. | Indlæses kun, hvis det matcher medieforespørgslen (eller fallback). |
| Ydeevne | Negativ indvirkning pga. unødvendige downloads. | Positiv indvirkning pga. målrettet indlæsning. |
| Dataforbrug | Højere, især på mobile enheder. | Markant lavere, især på mobile enheder. |
| SEO | God, da alt-tekst er tilgængelig. | God, da alt-tekst er tilgængelig. |
| Tilgængelighed | God, da alt-tekst er tilgængelig. | God, da alt-tekst er tilgængelig. |
| Kompleksitet | Meget lav, men ineffektiv. | Moderat, men yderst effektiv. |
| Browserstøtte | Universel. | Fremragende i moderne browsere, fallback til <img>. |
Ofte Stillede Spørgsmål (FAQ)
Hvorfor er det vigtigt at forhindre skjulte billeder i at indlæse?
Det er vigtigt for at forbedre din hjemmesides ydeevne og brugeroplevelse. Unødvendig indlæsning af store billeder, der alligevel er skjult, spilder brugerens data, forlænger indlæsningstiden og kan føre til en højere afvisningsrate. For mobile brugere er dette særligt kritisk, da de ofte har langsommere forbindelser og betaler for deres dataforbrug.
Forhindrer display: none; virkelig billedindlæsning?
Nej, desværre ikke for <img>-elementer. Browsere begynder at downloade billeder, så snart de støder på <img>-tagget i HTML'en, før de anvender CSS-regler. Selvom billedet skjules visuelt, er filen allerede downloadet.
Hvad er <picture>-tagget?
<picture>-tagget er et HTML5-element, der fungerer som en container for et <img>-element og et eller flere <source>-elementer. Det giver browseren mulighed for at vælge den mest passende billedkilde baseret på definerede kriterier som skærmbredde, pixel-densitet eller billedformat. Dette giver dig fuld kontrol over responsiv billedvisning og -indlæsning.
Hvordan hjælper <picture> med ydeevnen?
<picture> forbedrer ydeevnen ved at sikre, at browseren kun indlæser den mest relevante billedfil. Ved at bruge media-attributtet på <source>-elementer kan du specificere, hvilke billeder der skal indlæses under hvilke forhold. Dette forhindrer unødvendig download af store billeder på små skærme (f.eks. ved at indsætte en minimal Base64-pladsholder), hvilket reducerer båndbreddeforbrug og fremskynder sidens indlæsning.
Hvad med ældre browsere som Internet Explorer?
Ældre browsere, der ikke understøtter <picture>-tagget, vil ignorere <source>-elementerne og falde tilbage til at indlæse billedet specificeret i <img>-taggets src-attribut. Derfor er det vigtigt at placere den mest grundlæggende eller mindste version af billedet i <img>-tagget som en robust fallback.
Kan jeg bruge <picture> til forskellige billedformater, ikke kun størrelser?
Ja, absolut! Udover media-attributtet kan du bruge type-attributtet i <source>-elementet til at angive forskellige billedformater (f.eks. image/webp eller image/avif). Dette giver dig mulighed for at servere moderne, mere komprimerede formater til browsere, der understøtter dem, og falde tilbage til ældre formater som JPEG for dem, der ikke gør. Browseren vil automatisk vælge det første understøttede format.
Er et CSS-baggrundsbillede en bedre løsning?
Ikke for indholdsbærende billeder. Mens CSS-baggrundsbilleder kan bruges til at forhindre indlæsning under visse forhold, mangler de den SEO- og tilgængelighedsfordel, som <img>-tagget (og dermed <picture>) tilbyder via alt-tekst. For rent dekorative billeder kan CSS-baggrundsbilleder være acceptable, men for billeder, der bidrager til sidens indhold eller budskab, er <picture> den overlegne løsning.
Hvis du vil læse andre artikler, der ligner Undgå Billedindlæsning på Mobil: HTML5 Picture-tagget, kan du besøge kategorien Teknologi.
