332 votes

Comment faire en sorte que la hauteur d'un div s'adapte automatiquement à la taille de l'arrière-plan ?

Comment faire en sorte qu'une division s'adapte automatiquement à la taille de l'arrière-plan que je lui ai défini sans lui imposer une hauteur spécifique (ou une hauteur minimale) ?

0 votes

Veuillez voir ma réponse ici : stackoverflow.com/a/62262990/8508777

641voto

Hasanavi Points 938

Il existe un moyen très agréable et très cool de faire fonctionner une image d'arrière-plan comme une carte de crédit. img pour qu'il ajuste son height automatiquement. Vous devez connaître l'image width y height ratio. Réglez le height du conteneur à 0 et définissez le padding-top en pourcentage, en fonction du ratio de l'image.

Il ressemblera à ce qui suit :

div {
    background-image: url('http://www.pets4homes.co.uk/images/articles/1111/large/feline-influenza-all-about-cat-flu-5239fffd61ddf.jpg');
    background-size: contain;
    background-repeat: no-repeat;
    width: 100%;
    height: 0;
    padding-top: 66.64%; /* (img-height / img-width * container-width) */
                /* (853 / 1280 * 100) */
}

Vous venez d'obtenir une image de fond avec une hauteur automatique qui fonctionnera comme un élément img. Voici un prototype fonctionnel (vous pouvez redimensionner et vérifier la hauteur de la div) : http://jsfiddle.net/8m9ur5qj/

25 votes

En effet, c'est génial ! Juste pour les générations futures qui regardent cette réponse, si vous utilisez compass (scss), j'ai créé un mixin à partir de cela en utilisant leurs fonctions d'aide pour faire les calculs pour vous : @mixin div-same-size-as-background-img($url) { background-image: url($url); background-size: contain; background-repeat: no-repeat; width: 100%; height: 0; padding-top: percentage(image-height($url) / image-width($url)); }

20 votes

Pour info, pour ceux qui se posent la question, le padding-top ne crée pas d'espace blanc car il ajoute simplement de la hauteur à l'élément. L'image est une image d'arrière-plan, elle s'affiche donc avec un positionnement et un espacement corrects. C'est assez stupide de devoir inventer des astuces comme celles-ci pour les CSS.

0 votes

Ça a très bien marché pour moi aussi ! Je l'adore. Le seul inconvénient est que si vous voulez mettre un titre dans l'élément contenant l'image d'arrière-plan, il est poussé vers le bas et vous devez donc positionner négativement cet élément pour qu'il revienne dans les limites de l'image. Pas défaisable :)

295voto

Tmac Points 599

Une autre solution, peut-être inefficace, consisterait à inclure l'image sous une rubrique img défini comme visibility: hidden; . Ensuite, faites le background-image de la div environnante identique à celle de l'image.

La division qui l'entoure aura la même taille que l'image contenue dans le champ img mais l'affiche comme arrière-plan.

<div style="background-image: url(http://your-image.jpg);">
 <img src="http://your-image.jpg" style="visibility: hidden;" />
</div>

19 votes

Pas vraiment utile, car l'image utilisera l'espace et le contenu aura l'air d'avoir une grande marge en haut.

1 votes

Désolé, je ne peux pas modifier mon commentaire précédent, alors je veux juste le compléter : J'arrive à redimensionner l'image en fixant la taille de fond de la division à 100% et la largeur maximale de l'image (cachée) à 100%.

50 votes

Peut-être que j'ai raté quelque chose, mais si vous mettez un img dans votre balisage de toute façon, pourquoi ne pas simplement no cacher la réalité <img> et ne pas s'embêter avec un background-image non plus ? Quel avantage y a-t-il à faire les choses de cette façon ?

37voto

Orion Edwards Points 54939

Il n'existe aucun moyen d'ajuster automatiquement la taille de l'image d'arrière-plan à l'aide de CSS.

Vous pouvez contourner ce problème en mesurant l'image d'arrière-plan sur le serveur, puis en appliquant ces attributs à la division, comme d'autres l'ont mentionné.

Vous pouvez également modifier le javascript pour redimensionner la division en fonction de la taille de l'image (une fois que l'image a été téléchargée), ce qui revient au même.

Si vous avez besoin que votre div s'adapte automatiquement à l'image, je vous demande pourquoi vous ne mettez pas simplement une balise <img> à l'intérieur de votre div ?

0 votes

Merci - mais j'en ai besoin comme arrière-plan, donc le truc de l'image ne marchera pas. Je suppose que je vais bidouiller du javascript comme tu le dis dans le pire des cas, mais ça ne vaut probablement pas la peine.

4 votes

^^ Ce n'est probablement pas une bonne idée. Le navigateur peut prendre plusieurs secondes avant que votre image ne soit téléchargée, et vous ne pouvez pas la mesurer avant cela, donc votre div va rester à la mauvaise taille pendant un certain temps !

2 votes

Il pourrait alors simplement exécuter le JavaScript lorsque le document est prêt.

16voto

Luca Matteis Points 19338

Peut-être que ceci peut aider, ce n'est pas exactement un fond, mais vous avez l'idée :

<style>
div {
    float: left;
    position: relative;
}
div img {
    position: relative;
}

div div {
    position: absolute;
    top:0;
    left:0;
}
</style>

<div>
    <img src="http://antwrp.gsfc.nasa.gov/apod/image/0903/omegacen_davis.jpg" />
    <div>Hi there</div>
</div>

0 votes

Veuillez expliquer pourquoi vous avez gardé la position de l'img comme relative ?

1 votes

Probablement parce que le float: left; a cassé son positionnement

6voto

Itay Moav -Malimovka Points 17977

Vous pouvez le faire côté serveur : en mesurant l'image et en définissant ensuite la taille de la division, OU en chargeant l'image avec JS, en lisant ses attributs et en définissant ensuite la taille de la division.

Et voici une idée, mettez la même image à l'intérieur de la div comme une balise IMG, mais donnez-lui une visibilité : hidden + jouez avec la position relative + donnez à cette div l'image comme fond.

0 votes

Lol pourquoi exiger le côté serveur ? Il devrait être possible de l'implémenter avec des CSS.

2 votes

@GTHell hahaha - vérifiez l'année où j'ai répondu.

0 votes

@ItayMoav-Malimovka hehe, je n'avais pas remarqué ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X