web-dev-qa-db-fra.com

Comment faire en sorte que div height s’adapte automatiquement à la taille de l’arrière-plan?

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

220
JohnIdol

Une autre solution, peut-être inefficace, consisterait à inclure l'image sous un élément img défini sur visibility: hidden;. Ensuite, associez le background-image de la div environnante à l’image.

Cela va définir la div environnante à la taille de l'image dans l'élément img mais l'afficher en tant qu'arrière-plan. 

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

Il existe un moyen très agréable et sympa de faire en sorte qu'une image d'arrière-plan fonctionne comme un élément img afin qu'elle ajuste sa height automatiquement. Vous devez connaître les ratios image width et height. Définissez la height du conteneur sur 0 et définissez le padding-top sous forme de pourcentage basé sur le rapport de l'image.

Cela ressemblera à ceci:

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 de recevoir une image d’arrière-plan à hauteur automatique qui fonctionnera comme un élément img. Voici un prototype fonctionnel (vous pouvez redimensionner et vérifier la hauteur div): http://jsfiddle.net/TPEFn/2/

470
Hasanavi

Il n'y a aucun moyen de régler automatiquement la taille de l'image d'arrière-plan à l'aide de CSS.

Vous pouvez le pirater en mesurant l'image de fond sur le serveur, puis en appliquant ces attributs à la div, comme d'autres l'ont mentionné.

Vous pouvez également pirater du code javascript pour redimensionner la div en fonction de la taille de l'image (une fois l'image téléchargée) - il s'agit en gros de la même chose.

Si vous avez besoin que votre div s'adapte automatiquement à l'image, je pourrais vous demander pourquoi vous ne mettez pas simplement une balise <img> dans votre div?

31
Orion Edwards

Cette réponse est semblable aux autres, mais est globalement la meilleure pour la plupart des applications. Vous devez connaître la taille de l'image à l'avance, ce que vous faites habituellement. Cela vous permettra d'ajouter du texte de surimpression, des titres, etc. sans remplissage négatif ni positionnement absolu de l'image. Leur clé consiste à définir le pourcentage de remplissage pour qu'il corresponde au format de l'image, comme indiqué dans l'exemple ci-dessous. J'ai utilisé cette réponse et je viens d'ajouter un fond d'image.

.wrapper {
  width: 100%;
  /* whatever width you want */
  display: inline-block;
  position: relative;
  background-size: contain;
  background: url('https://upload.wikimedia.org/wikipedia/en/thumb/6/67/Wiki-llama.jpg/1600px-Wiki-llama.jpg') top center no-repeat;
  margin: 0 auto;
}
.wrapper:after {
  padding-top: 75%;
  /* this llama image is 800x600 so set the padding top % to match 600/800 = .75 */
  display: block;
  content: '';
}
.main {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  color: black;
  text-align: center;
  margin-top: 5%;
}
<div class="wrapper">
  <div class="main">
    This is where your overlay content goes, titles, text, buttons, etc.
  </div>
</div>

18
horsejockey

Peut-être que cela 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>
13
Luca Matteis

Je suis sûr que cela n'aura jamais été vu jusqu'ici. Mais si votre problème était le même que le mien, voici ma solution:

.imaged-container{
  background-image:url('<%= asset_path("landing-page.png") %> ');
  background-repeat: no-repeat;
  background-size: 100%;
  height: 65vw;
}

Je voulais avoir une div au centre de l'image, et cela me le permettra.

9
Carpk

Il existe une solution CSS pure que les autres réponses ont manquée.

La propriété "content:" est principalement utilisée pour insérer du contenu texte dans un élément, mais peut également être utilisée pour insérer du contenu image.

.my-div:before {
    content: url("image.png");
}

Cela fera redimensionner la hauteur de la div à la taille de pixel réelle de l’image. Pour redimensionner aussi la largeur, ajoutez:

.my-div {
    display: inline-block;
}
7
Bernie Sumption

J'ai eu ce problème et j'ai trouvé la réponse de Hasanavi, mais j'ai eu un petit bug lors de l'affichage de l'image d'arrière-plan sur un écran large. L'image d'arrière-plan ne s'est pas étendue sur toute la largeur de l'écran.

Voici donc ma solution - basée sur le code de Hasanavi mais en mieux ... et cela devrait fonctionner à la fois sur des écrans extra-larges et mobiles.

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

/*MOBILE SUPPORT*/
@media screen and (max-width: 768px) {
    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) */
    }
}

Comme vous l'avez peut-être remarqué, la propriété background-size: contain; ne s'adapte pas bien aux écrans extra larges, et la propriété background-size: cover; ne s'adapte pas bien aux écrans mobiles. J'ai donc utilisé cet attribut @media pour jouer avec les tailles d'écran et résoudre ce problème.

5
martin schwartz

Vous pouvez le faire côté serveur: en mesurant l’image puis en définissant la taille du div, OR en chargeant l’image avec JS, lisez ses attributs, puis définissez la taille DIV.

Et voici une idée, placez la même image à l'intérieur du div en tant que balise IMG, mais donnez-lui de la visibilité: hidden + play with position relative + donnez cette div en arrière-plan.

5

Que dis-tu de ça :)

.fixed-centered-covers-entire-page{
    margin:auto;
    background-image: url('https://i.imgur.com/Ljd0YBi.jpg');
    background-repeat: no-repeat;background-size:cover;
    background-position: 50%;
    background-color: #fff;
    left:0;
    right:0;
    top:0;
    bottom:0;
    z-index:-1;
    position:fixed;
}
<div class="fixed-centered-covers-entire-page"></div>

Démo:http://jsfiddle.net/josephmcasey/KhPaF/

3
JosephMCasey

S'il s'agit d'une seule image d'arrière-plan prédéterminée et que vous souhaitez que la div soit réactive sans altérer le rapport de format de l'image d'arrière-plan, vous pouvez d'abord calculer le rapport de format de l'image, puis créer un div qui conserve son rapport de format en procédant comme suit : 

Supposons que vous souhaitiez un format d'image de 4/1 et que la largeur de la div soit de 32%: 

div {
  width: 32%; 
  padding-bottom: 8%; 
}

Cela résulte du fait que le remplissage est calculé en fonction de la largeur de l'élément conteneur. 

2
Headache

Tu peux faire quelque chose comme ça

<div style="background-image: url(http://your-image.jpg); position:relative;">
 <img src="http://your-image.jpg" style="opacity: 0;" />
<div style="position: absolute;top: 0;width: 100%;height: 100%;">my content goes here</div>
</div>
1
Mas

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

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

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

<div>
    <img src="http://www.planwallpaper.com/static/images/recycled_texture_background_by_sandeep_m-d6aeau9_PZ9chud.jpg" />
    <div>Hello</div>
</div>
1
Engr

Si vous aviez ce problème avec le CMS Umbraco et dans ce scénario, vous pouvez ajouter l'image à la div en utilisant quelque chose comme ceci pour l'attribut 'style' de la div:

style="background: url('@(image.mediaItem.Image.umbracoFile)') no-repeat scroll 0 0 transparent; height: @(image.mediaItem.Image.umbracoHeight)px"
0
Chris Halcrow

La meilleure solution à laquelle je puisse penser consiste à spécifier votre largeur et votre hauteur en pourcentage. Cela vous permettra de redimensionner votre écran en fonction de la taille de votre moniteur. son plus de mise en page réactive .. 

Par exemple, vous avez

<br/>
<div> . //This you set the width percent to %100
    <div> //This you set the width percent to any amount . if you put it by 50% , it will be half
    </div>
 </div>

C'est la meilleure option si vous souhaitez une mise en page réactive, je ne recommanderais pas float, dans certains cas, float est correct à utiliser. mais dans la plupart des cas, nous évitons d'utiliser float, car cela affectera un grand nombre de choses lorsque vous testez plusieurs navigateurs.

J'espère que cela t'aides :)

0
FaridAvesko

Je traite ce problème depuis un moment et j'ai décidé d'écrire un plugin jquery pour résoudre ce problème ... Ce plugin trouvera tous les éléments avec la classe "show-bg" (ou vous pourrez le passer avec votre propre sélecteur) et calculer leurs dimensions d'image d'arrière-plan ... tout ce que vous avez à faire est d'inclure ce code, marquez les éléments souhaités avec class = "show

Prendre plaisir!

https://bitbucket.org/tomeralmog/jquery.heightfrombg

0
Tomer Almog