• CSS
  • Image

Image pleine largeur

Casser le conteneur.

Publié le : September 15, 2020

Faire déborder une image de son conteneur sans tout casser

Image inline

On est parfois obligé d'utiliser des images dans des balises img plutôt que dans un background en css. Comment faire alors pour que l'image sorte de son conteneur pour en faire une bannière ? Exemple pratique à partir de ce même site.

Contexte

Considérons le html suivant :

<section class="container">
  <div class="hero">
    <img class="hero__image" src="hero.img" />
  </div>
</section>

Et le style suivant :

.container {
  padding: 0 14px;
  margin-left: auto;
  margin-right: auto;
  max-width: 1040px;
}
img {
  max-width: 100%;
  height: auto;
}

Déborder du conteneur

Afin de faire prendre à l'image toute la largeur, on agit sur son conteneur :

.hero {
  width: 100vw;
  position: relative;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
}

Faire une bannière

On peut alors réduire la hauteur du conteneur pour obtenir une bannière plutôt que l'image entière et faire correspondre la hauteur de l'image à la hauteur du conteneur :

.hero {
  height: 200px;
}
.hero__image {
  height: 100%;
}

Il faut ensuite forcer l'image à prendre toute la largeur du conteneur :

.hero__image {
  width: 100%;
}

Pas top…

J'ai cassé l'image…

ENFIN le code magique pour redonner son ratio à l'image sans la déformer :

.hero__image {
  object-fit: cover;
  object-position: center; /* à positionner comme on veut */
}

Cette technique s'apparente à l'utilisation d'une image de background mais en dur 😁

TL;DR

Le code complet :

.hero {
  width: 100vw;
  height: 200px;
  position: relative;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
}
.hero__image {
  width: 100%;
  height: 100%;
  -o-object-fit: cover;
  object-fit: cover;
  -o-object-position: center;
  object-position: center;
}