Achtergrondafbeeldingen zijn slecht

Leer waarom u achtergrondafbeeldingen op uw website moet vermijden, hoe u snel achtergrondafbeeldingen kunt vinden en hoe u dit probleem kunt oplossen

Arjen Karel Core Web Vitals Consultant
Arjen Karel - linkedin
Last update: 2024-11-27

Achtergrondafbeeldingen zijn slecht

Degenen onder jullie die mij kennen of mij hebben horen spreken, hebben mij misschien over achtergrondafbeeldingen horen praten. Degenen onder jullie die dat niet hebben: ik hou echt niet van achtergrondafbeeldingen. In dit artikel zal ik snel uitleggen waarom ik achtergrondafbeeldingen niet leuk vind, hoe u snel pagina's met achtergrondafbeeldingen kunt vinden en hoe u ze kunt oplossen!

Waarom achtergrondafbeeldingen slecht zijn voor de Core Web Vitals

Bij het laden van een webpagina heeft elk element zijn tijd en zijn plaats. Met sommige moderne technieken zoals deferring, preloading, async loading, scheduling, het definiëren van de fetchpriority enz enz kunnen we alle kritieke bronnen vrijwel onder controle krijgen. Behalve achtergrondafbeeldingen! 

Overweeg dit praktijkvoorbeeld:

Dagelijks zie ik dit patroon, vooral op WordPress-sites. Alle normale afbeeldingen worden lazy geladen en sommige afbeeldingen (in dit geval de sociale iconen in de footer) zijn achtergrondafbeeldingen Kun u raden wat er gebeurt?

<html>
<head>
    <style>
        footer {
            /* een marge van 100 vh zorgt ervoor dat de footer off-screen is !*/
            margin-top: 100vh;
            >.social {
                >.facebook {background-image: url('img/facebook.jpg');}
                >.instagram {background-image: url('img/instagram.jpg');}
                >.linkedin {background-image: url('img/linkedin.jpg');}
                >.email {background-image: url('img/email.jpg');}
            }
        }
    </style>
</head>
<body>
    <!-- ja deze afbeelding is lazy loaded, want kleine foutjes gebeuren! -->
    <img loading="lazy" src="img/hero.jpg"></img>
    <footer>
        <div class="social">
            <span class="facebook"></span>
<span class="instagram"></span>
<span class="linkedin"></span>
<span class="email"></divspan
</div> </footer> </body> </html>

U raadt het misschien al: de offscreen achtergrondafbeeldingen worden eerder in de wachtrij geplaatst voor download dan de veel belangrijkere 'hero.jpg' afbeelding die meestal het largest contentful paint element op de pagina zal worden.

Maar dat is niet alles!

Zoals ik al zei, achtergrondafbeeldingen zijn slecht! Dat komt omdat, afgezien van de rare prioriteit die ze soms krijgen, achtergrondafbeeldingen de coole functies missen die normale afbeeldingen krijgen!

  • Geen lazy loading: er is geen loading attribuut voor achtergrondafbeeldingen
  • Geen async decoding: er is geen decoding attribuut voor achtergrondafbeeldingen
  • Geen fetchpriority: er is geen fetchpriority attribuut voor achtergrondafbeeldingen
  • Responsieve afbeeldingsbronnen: Het image-set() attribuut voor achtergrondafbeeldingen heeft niet dezelfde kracht van functies die u krijgt met goed responsief ontwerp.
  • Geen width en height attribuut. Door niet het eenvoudige width en height attribuut in te kunnen stellen, zult u workarounds gebruiken die code vereisen (meer code is altijd langzamer dan minder code met dezelfde complexiteit!)
  • Geen alt tekst: terwijl dit niet

Vind snel alle achtergrondafbeeldingen op een pagina

Dus hoe komen we erachter of een webpagina achtergrondafbeeldingen bevat? Nou u zou de netwerk inspector kunnen bekijken, filteren op afbeeldingen, met de rechtermuisknop op de menubalk klikken, de initiator kolommen inschakelen en de initiator controleren maar het is veel gemakkelijker om deze code in de devconsole te plakken.

Open eenvoudig de dev console met Ctrl-Shift-I, navigeer naar het console tabblad en plak deze code. Het zal u alle achtergrondafbeeldingen op de pagina tonen
let bgimg = performance.getEntriesByType('resource')
  .filter(rs => rs.initiatorType == 'css')
  .map(rs => {
  return {
    name: rs.name,
    initiator: rs.initiatorType
  }
}) || [];

(bgimg.length > 0)?
    console.table(bgimg):
    console.log('Geen achtergrondafbeeldingen op deze pagina!');

Dit toont u een netjes geformatteerde tabel met alle namen van de achtergrondafbeeldingen en de initiators

Hoe achtergrondafbeeldingen te vermijden

Achtergrondafbeeldingen zijn gemakkelijk te vermijden. Hoe u dit doet, hangt af van de afbeelding zelf. Er zijn grofweg 2 methoden.

In het geval van 'normale afbeeldingen'

U zou het niet geloven als ik u vertelde, maar in de meeste gevallen waar ik achtergrondafbeeldingen vind, heeft het achtergrondgedeelte van de afbeelding niet eens een doel. De afbeeldingen moeten gewoon 'ergens op de pagina staan' en de background-image:url() wordt misbruikt voor dit doel.
Als dit het geval is, voeg dan gewoon een normale afbeeldingstag toe en verwijder de achtergrondafbeelding uit de stylesheet.

In het geval van cover afbeeldingen:

Cover afbeeldingen zijn afbeeldingen die een oudercontainer volledig bedekken. Het gebruik van achtergrondafbeeldingen als cover afbeeldingen is logisch omdat dit lange tijd de enige manier was om cover afbeeldingen te krijgen en ik denk dat mensen gewoon vasthouden aan wat ze weten. Gelukkig zijn er betere opties voor ons beschikbaar. Dus laten we het oplossen!
In het geval van cover afbeeldingen verwijdert u gewoon de stijl   background-image: url(hero.jpg); background-size: cover;en plaatst u een normale afbeelding in diezelfde container en bewerkt u de CSS zodat deze er als volgt uitziet:

<style>
.img-container {
    position: relative;
    > img {
       width: 100%;
       height: 100%;
       object-fit: cover;
       position: absolute;
       z-index: 1;
   }
}
<style>

<div class="img-container">
  <img 
       height="500" 
       width="300" 
       decoding="async" 
       loading="lazy" 
       src="hero.jpg"
       srcset="hero-320w.jpg, hero-480w.jpg 1.5x"
       alt="alt text"
       fetchpriority="low"
  >
</div>


Ask AI why your INP spiked.

CoreDash is the only RUM tool with MCP support. Connect it to your AI agent and query your Core Web Vitals data in natural language. No more clicking through dashboards.

See How It Works
Achtergrondafbeeldingen zijn slechtCore Web Vitals Achtergrondafbeeldingen zijn slecht