35 votes

CSS: hauteur automatique sur contenant div, 100% hauteur sur fond div à l'intérieur contenant div

Le problème, c'est que j'ai un div du contenu qui s'étend de son récipient qu'en hauteur-sage (contenant et contenu div automatique de la hauteur).

Je veux que le fond du conteneur, qui est un frère ou d'une div de la div du contenu de s'étirer pour remplir le récipient. L'arrière-plan du conteneur contient des divs pour briser l'arrière-plan en morceaux.

L'arrière-plan et le contenant divs ont 100% de largeur, le conteneur de contenu ne l'est pas.

HTML:

<div id="container">  
    <div id="content">  
        Some long content here ..  
    </div>  
     <div id="backgroundContainer">  
         <div id="someDivToShowABackground"/>  
         <div id="someDivToShowAnotherBackground"/>  
    </div>  
</div>

CSS:

#container {
    height:auto;
    width:100%;
}

#content {
    height: auto;
    width:500px;
    margin-left:auto;
    margin-right:auto;
}

#backgroundContainer {
    height:100%;??? I want this to be the same height as container, but 100% makes it the height of the viewport.
}

41voto

Andrew G.H. Points 1009

Il y a un certain nombre de solutions pour ce problème, y compris OneTrueLayout Technique, Faux Colonnes Technique, CSS Tableaux d'Affichage de la Technique et il y a aussi une Technique de Stratification.

Une solution à parts égales de la hauteur-ed colonnes est le CSS de tableau d'Affichage de la Technique que des moyens d'utiliser l' écran:table defonction. Il fonctionne pour Firefox 2+, Safari 3+, Opera 9+ et IE8.

Le code de la CSS de Tableaux d'Affichage:

Le HTML

<div id="container">
    <div id="rowWraper" class="row">
            <div id="col1" class="col">
                Column 1<br />Lorem ipsum<br />ipsum lorem
            </div>
            <div id="col2" class="col">
                Column 2<br />Eco cologna duo est!
            </div>
            <div id="col3" class="col">
                Column 3
            </div>
        </div>
</div>

Le CSS

<style>
#container{
    display:table;  
    background-color:#CCC;
    margin:0 auto;
}

.row{
    display:table-row;
}

.col{
    display: table-cell;
}

#col1{
    background-color:#0CC;
    width:200px;
}

#col2{
    background-color:#9F9;
    width:300px;
}

#col3{
    background-color:#699;
    width:200px;
}
</style>

Même si il y a un problème avec l'auto-expansion de la largeur de la table-cell il peut être résolu facilement par l'insertion d'une autre div à l'intérieur de la table-cell et de lui donner une largeur fixe. De toute façon, l'expansion de la largeur qui se passe dans le cas d'une utilisation extrêmement long termes (dont je doute que quiconque de l'utiliser a, disons, 600px long terme) ou du div qui est la largeur est supérieure à la table de la cellule de largeur.

La Fausse Colonne Technique est le plus populaire de la solution à ce problème, mais il a quelques inconvénients tels que, vous avez pour redimensionner l'arrière-plan en mosaïque de l'image si vous souhaitez redimensionner les colonnes et c'est pas non plus une solution élégante.

Le OneTrueLayout Technique consiste à créer un padding-bottom d'une extrême grande hauteur et la découper en apportant de la frontière réelle de la position "normal position logique" par l'application d'une marge négative-bas de la même valeur énorme et cacher la mesure créé par le rembourrage avec overflow:hidden appliquée au contenu wraper. Un exemple simplifié serait:

Le fichier HTML:

<html><head>
<style>
.wraper{
    background-color:#CCC;
    overflow:hidden;
}

.floatLeft{
    float:left; 
}

.block{
    padding-bottom:30000px;
    margin-bottom:-30000px;
    width:100px;
    background-color:#06F;
    border:#000 1px solid;
}
</style>
</head>
<body>
    <div class="wraper">
    <div class="block floatLeft">first col</div>
        <div class="block floatLeft">
                Second col<br />Break Line
        </div>
    <div class="block floatLeft">Third col</div>
</div>
</body>
</html>

La Technique de Stratification doit être très soigné solution qui implique un positionnement absolu de la div à l'intérieur d'un principal par rapport positionné wrapper div. Il se compose essentiellement d'un certain nombre des enfants les divs et la div principale. La div principale a impérativement position: relative à l'attribut css collection. Les enfants de cette div sont tous impérativement position:absolute. Les enfants doivent avoir des haut et des bas ensemble de 0 et de gauche à droite dimensions pour accueillir les colonnes avec chaque autre. Par exemple, si nous avons deux colonnes, l'une d'une largeur de 100px et l'autre de 200px, considérant que nous voulons le 100px dans le côté gauche et le 200px dans le côté droit de la colonne de gauche doit avoir {left:0; right:200px} et la colonne de droite {left:100px; right:0;}

À mon avis non implémentée 100% de la hauteur au sein d'un système automatisé de hauteur conteneur est un inconvénient majeur et le W3C devrait envisager la révision de cet attribut.

D'autres ressources: link1, link2, link3, link4, link5 (important)

9voto

Faire #container à display:inline-block

 #container {
height:auto;
width:100%;
display:inline-block;
}

#content {
height: auto;
width:500px;
margin-left:auto;
margin-right:auto;
}

#backgroundContainer {
height:200px; 200px is example, change to what you want
width:100%;
}
 

Voir aussi: W3Schools

5voto

Gabriel Points 5234

Bon alors quelqu'un va probablement me gifler pour cette réponse, mais j'utilise jQuery pour résoudre tous mes problèmes irritants et il s'avère que j'ai simplement utilisé de quelque chose aujourd'hui pour résoudre un problème similaire. En supposant que vous utilisez jquery:

$("#content").sibling("#backgroundContainer").css("height",$("#content").outerHeight());

ce n'est pas testée, mais je pense que vous pouvez voir ici, le concept. Fondamentalement, une fois chargée, vous pouvez obtenir la hauteur (outerHeight comprend un rembourrage + frontières, innerHeight pour le contenu uniquement). Espérons que cela aide.

Voici comment vous devez le lier à la fenêtre de l'événement de redimensionnement:

$(window).resize(function() {
  $("#content").sibling("#backgroundContainer").css("height",$("#content").outerHeight());
});

3voto

Tim Points 1899

Quelque part, vous devrez définir une hauteur fixe, au lieu d'utiliser auto partout. Vous constaterez que si vous définissez une hauteur fixe sur votre contenu et / ou conteneur, l'utilisation de l'auto pour les choses à l'intérieur fonctionnera.

De plus, vos boîtes se développeront toujours en hauteur avec plus de contenu, même si vous en avez défini une hauteur - alors ne vous inquiétez pas :)

 #container {
  height:500px;
  min-height:500px;
}
 

1voto

Wex Points 7757

Vous ne devriez pas avoir à définir height: 100% à tout moment si vous voulez que votre conteneur remplisse la page. Il y a de fortes chances que votre problème soit enraciné dans le fait que vous n'ayez pas nettoyé les flotteurs des enfants du conteneur. Il existe plusieurs façons de résoudre ce problème, en ajoutant principalement overflow: hidden au conteneur.

 #container { overflow: hidden; }
 

Cela devrait être suffisant pour résoudre le problème de hauteur que vous rencontrez.

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