Fermer

octobre 25, 2021

Une plongée profonde dans l'ajustement des objets et la taille de l'arrièreplan en CSS —


Résumé rapide ↬

Dans cet article, nous verrons comment fonctionnent object-fit et background-sizequand nous pouvons les utiliser et pourquoi, ainsi que quelques cas d'utilisation pratiques et des recommandations. Plongeons-nous.

Nous ne sommes pas toujours en mesure de charger des images de tailles différentes pour un élément HTML. Si nous utilisons une largeur et une hauteur qui ne sont pas proportionnelles au rapport hauteur/largeur de l'image, l'image peut être compressée ou étirée. Ce n'est pas bon, et cela peut être résolu soit avec object-fit pour un élément img soit en utilisant background-size.

Tout d'abord, définissons le problème. Considérez la figure suivante :

Une belle photo et une image compressée en comparaison

Une belle photo qui se compresse lorsqu'elle est utilisée dans un composant de carte. ( Grand aperçu)

Pourquoi cela se produit-il ?

Une image aura un rapport hauteur/largeur et le navigateur remplira la boîte contenant cette image. Si le rapport hauteur/largeur de l'image est différent de la largeur et de la hauteur spécifiées, le résultat sera une image compressée ou étirée.

Nous le voyons dans la figure suivante :

Une belle photo et une image étirée image en comparaison

Le rapport hauteur/largeur de l'image est différent de celui de la boîte qui la contient et l'image est étirée. ( Grand aperçu)

La solution

Nous n'avons pas toujours besoin d'ajouter une image de taille différente lorsque le rapport hauteur/largeur de l'image ne correspond pas à la largeur et à la hauteur de l'élément conteneur. Avant de plonger dans les solutions CSS, je veux vous montrer comment nous faisions cela dans les applications de retouche photo :

Exemple d'une image avec des bords supérieur et inférieur recadrés dans un masque

Tout d'abord, nous centrerions l'image verticalement , puis insérer un masque. Cela conserve le rapport hauteur/largeur de l'image et l'empêche d'être comprimé. ( Grand aperçu)

Maintenant que nous comprenons comment cela fonctionne, voyons comment cela fonctionne dans le navigateur. (Alerte spoiler : C'est plus facile !)

CSS object-fit

La propriété object-fit définit comment le contenu d'un élément remplacé tel as img ou video doit être redimensionné pour s'adapter à son conteneur. La valeur par défaut pour object-fit est fillce qui peut entraîner un écrasement ou un étirement d'une image.

Passons en revue les valeurs possibles.

Plus après le saut ! Continuez à lire ci-dessous ↓

Possible Values ​​for object-fit

object-fit : contain

Dans ce cas, l'image sera redimensionné pour s'adapter au rapport hauteur/largeur de son conteneur. Si le rapport hauteur/largeur de l'image ne correspond pas à celui du conteneur, elle sera mise en boîte aux lettres.

object-fit:contain

Lors de l'utilisation de object-fit:containl'image sera soit en boîte aux lettres, soit redimensionnée par conséquent. ( Grand aperçu)

object-fit: cover

Ici, l'image sera également redimensionnée pour s'adapter au rapport hauteur/largeur de son conteneur, et si le rapport hauteur/largeur de l'image ne correspond pas à celui du conteneur, elle sera alors découpée pour s'adapter.[19659028]object-fit: cover »/>

Lors de l'utilisation de object-fit: coverl'image sera soit coupée pour s'adapter, soit redimensionnée en conséquence. ( Grand aperçu)

object-fit: fill

Avec cela, l'image sera redimensionnée pour s'adapter au rapport hauteur/largeur de son conteneur, et si le rapport hauteur/largeur de l'image ne correspond pas à celui du conteneur, elle sera soit comprimée soit étirée. Nous ne voulons pas de cela.

object-fit: fill

Lorsque vous utilisez object-fit: filll'image sera compressée, étirée ou redimensionnée en conséquence. ( Grand aperçu)

object-fit : none

Dans ce cas, l'image ne sera pas du tout redimensionnée, ni étirée ni comprimée. Il fonctionne comme la valeur covermais il ne respecte pas le rapport hauteur/largeur de son conteneur.

object-fit: none

Lors de l'utilisation de object-fit: nonele l'image ne sera pas redimensionnée si ses dimensions ne sont pas les mêmes. ( Grand aperçu)

Outre object-fitnous avons également la propriété object-positionqui est responsable du positionnement d'une image dans son conteneur.

Valeurs possibles pour object-position

La propriété object-position fonctionne de manière similaire à la propriété CSS background-position :

object-position center, left, right

La plupart du temps, la valeur par défaut est utilisée (c'est-à-dire `center` ou `50% 50%`). ( Grand aperçu)

Les mots-clés top et bottom fonctionnent également lorsque le rapport hauteur/largeur de la boîte conteneur est verticalement plus grand :

object-position top and bottom

Comparaison object-position : top (gauche) et object-position : bottom (droite). ( Grand aperçu)

CSS background-size

Avec background-sizela première différence est que nous avons affaire à l'arrière-plan, pas à un HTML (img).

Valeurs possibles pour background-size

Les valeurs possibles pour background-size sont autocontain et cover.

background-size: auto

Avec autol'image restera à sa taille par défaut :

background-size: auto

Keep in n'oubliez pas que la taille par défaut peut parfois entraîner une image floue (si elle est trop petite). ( Grand aperçu)

background-size: cover

Ici, l'image sera redimensionnée pour tenir dans le conteneur. Si les proportions ne sont pas les mêmes, l'image sera masquée pour s'adapter. d'une image. ( Grand aperçu)

background-size:contain

Dans ce cas, l'image sera redimensionnée pour tenir dans le conteneur. Si les proportions sont désactivées, l'image sera en boîte aux lettres comme indiqué dans l'exemple suivant :

background-size : contain

background-size :contain redimensionne l'image pour qu'elle tienne dans le conteneur. ( Grand aperçu)

Quant à background-positionil est similaire au fonctionnement de object-position. La seule différence est que la position par défaut de object-position est différente de celle de background-position.

Quand ne pas utiliser object-fit ou background-size

Si l'élément ou l'image a une hauteur fixe et a soit background-size: cover ou object-fit: cover appliqué à cela, il y aura un point où l'image sera trop large, perdant ainsi des détails importants qui pourraient affecter la façon dont l'utilisateur perçoit l'image.

Considérez l'exemple suivant dans lequel l'image reçoit une hauteur fixe :

 .card__thumb {
    hauteur : 220px ;
}

Un exemple où une image est trop large car elle a une hauteur fixe, et le conteneur de la carte est trop large

L'image affichée à droite est trop large car elle a une hauteur fixe alors que le conteneur de la carte est trop large. ( Grand aperçu)

Si le conteneur de la carte est trop large, cela donnera ce que nous voyons à droite (une image trop large). C'est parce que nous ne spécifions pas de rapport hauteur/largeur.

Il n'y a qu'un des deux correctifs pour cela. La première consiste à utiliser le hack de remplissage pour créer un ratio intrinsèque.

.card__thumb {
    position : relative ;
    rembourrage en bas : 75 % ;
    hauteur : 0 ;
}

.card__thumb img {
    position : absolue ;
    à gauche : 0 ;
    haut : 0 ;
    largeur : 100 % ;
    hauteur : 100 % ;
    ajustement à l'objet : couverture ;
}

Le deuxième correctif consiste à utiliser la nouvelle propriété CSS aspect-ratio. En l'utilisant, nous pouvons effectuer les opérations suivantes :

.card__thumb img {
    rapport d'aspect : 4/3 ;
}

Remarque : J'ai déjà écrit sur la propriété aspect-ratio en détail au cas où vous voudriez en savoir plus : « Let's Learn About Ratio d'aspect dans CSS".

Cas d'utilisation et exemples

Avatars d'utilisateurs

Un cas d'utilisation parfait pour object-fit : cover sont les avatars d'utilisateurs. Le rapport hauteur/largeur autorisé pour un avatar est souvent carré. Placer une image dans un conteneur carré pourrait déformer l'image.

Un avatar d'utilisateur sans object-fit et avec object-fit : cover

Une comparaison d'un avatar d'utilisateur sans object-fit et avec object-fit : couvercle. ( Grand aperçu)
.c-avatar {
    ajustement à l'objet : couverture ;
}

Liste des logos

Répertorier les clients d'une entreprise est important. Nous utiliserons souvent des logos à cette fin. Étant donné que les logos auront des tailles différentes, nous avons besoin d'un moyen de les redimensionner sans les déformer.

Heureusement, object-fit:contain est une bonne solution pour cela.

.logo__img {
    largeur : 150px ;
    hauteur : 80px ;
    ajustement de l'objet : contenir ;
}

Une liste de logos : Airbnb, Domino's Pizza, Apple Pay, Amazon

L'utilisation de object-fit :contain peut nous aider à redimensionner les logos des clients sans les déformer. ( Grand aperçu)

Vignette d'article

Il s'agit d'un cas d'utilisation très courant. Le conteneur d'une vignette d'article peut ne pas toujours avoir une image avec le même rapport hauteur/largeur. Ce problème devrait être résolu par le système de gestion de contenu (CMS) en premier lieu, mais ce n'est pas toujours le cas.

.article__thumb {
    ajustement à l'objet : couverture ;
}

Vignette d'article

Ajustement des vignettes d'article avec un peu d'aide de object-fit: cover. ( Grand aperçu)

Hero Background

Dans ce cas d'utilisation, la décision d'utiliser un élément img ou un arrière-plan CSS dépendra des éléments suivants :

  • L'image est-elle importante ? Si CSS est désactivé pour une raison quelconque, voudrions-nous que l'utilisateur voie l'image ?
  • Ou le but de l'image est-il simplement décoratif ?

En fonction de notre réponse, nous pouvons décider quelle fonctionnalité utiliser. Si l'image est importante :

Cas d'utilisation avec un arrière-plan de héros

Supposons que l'image est importante, car il s'agit d'un site Web sur l'alimentation. 😉 ( Grand aperçu)
.héros {
    position : relative ;
}

.hero__thumb {
    position : absolue ;
    à gauche : 0 ;
    haut : 0 ;
    largeur : 100 % ;
    hauteur : 100 % ;
    ajustement à l'objet : couverture ;
}

Si l'image est décorativenous pouvons utiliser background-image:

.hero {
    position : relative ;
    background-image: linear-gradient(to top, #a34242, rgba(0,0,0,0), url("http://www.smashingmagazine.com/thumb.jpg");
    background-repeat : pas de répétition ;
    taille de l'arrière-plan : couverture ;
}

Le CSS est plus court dans ce cas. Assurez-vous que tout texte placé sur l'image est lisible et accessible.

Ajout d'un arrière-plan à une image avec object-fit:contain

Saviez-vous que vous pouvez ajouter un arrière-plan couleur vers img ? Nous en tirerions profit en utilisant également object-fit:contain.

Dans l'exemple ci-dessous, nous avons une grille d'images. Lorsque les proportions de l'image et du conteneur sont différentes, la couleur d'arrière-plan apparaît.

img {
    ajustement de l'objet : contenir ;
    couleur d'arrière-plan : #def4fd ;
}

Ajout d'une couleur d'arrière-plan à une image avec object-fit :contain

Nous pouvons utiliser object-fit:contain pour ajouter une couleur d'arrière-plan à une image. ( Grand aperçu)

Élément vidéo

Avez-vous déjà eu besoin d'une vidéo comme arrière-plan ? Si c'est le cas, vous vouliez probablement qu'il occupe toute la largeur et la hauteur de son parent.

.hero {
    position : relative ;
    couleur d'arrière-plan : #def4fd ;
}

.hero__video {
    poste : absolu ;
    à gauche : 0 ;
    haut : 0 ;
    largeur : 100 % ;
    hauteur : 100 % ;
}

Un chiffre où la vidéo ne couvre pas l'arrière-plan du héros

La valeur par défaut object-fit pour l'élément video est contain. Comme vous pouvez le voir ici, la vidéo ne couvre pas l'arrière-plan du héros, même s'il a position : absolulargeur : 100% et hauteur : 100%. ( Grand aperçu)

Pour qu'il couvre entièrement la largeur et la hauteur de son parent, nous devons remplacer la valeur par défaut object-fit :

.hero__video {
    /* autres styles */
    ajustement à l'objet : couverture ;
}

Une figure où la vidéo couvre toute la largeur et la hauteur de son parent.

Maintenant, la vidéo couvre toute la largeur et la hauteur de son parent. ( Grand aperçu)

Conclusion

Comme nous l'avons vu, object-fit et background-size sont très utiles pour gérer différents formats d'image. Nous n'aurons pas toujours le contrôle sur la définition des dimensions parfaites pour chaque image, et c'est là que ces deux fonctionnalités CSS brillent.

Un rappel amical sur les implications d'accessibilité du choix entre un élément img et un CSS background : Si l'image est purement décorative, optez pour un arrière-plan CSS. Sinon, un img est plus approprié.

J'espère que vous avez trouvé cet article utile. Merci d'avoir lu.

Smashing Editorial" width="35" height="46" loading="lazy" decoding="async(vf, yk, il, al)




Source link