Hauteur div 100% et se développe pour s'adapter au contenu

172

J'ai un élément div sur ma page avec sa hauteur réglée à 100%. La hauteur du corps est également réglée à 100%. La div intérieure a un arrière-plan et tout cela et est différente de l'arrière-plan du corps. Cela fonctionne pour rendre la hauteur de div 100% de la hauteur de l'écran du navigateur, mais le problème est que j'ai du contenu à l'intérieur de cette div qui s'étend verticalement au-delà de la hauteur de l'écran du navigateur. Lorsque je fais défiler vers le bas, le div se termine au point où vous deviez commencer à faire défiler la page, mais le contenu déborde au-delà. Comment puis-je faire en sorte que le div aille toujours jusqu'en bas pour s'adapter au contenu interne?

Voici une simplification de mon CSS:

body {
    height:100%;
    background:red;
}

#some_div {
    height:100%;
    background:black;
}

Une fois que je fais défiler la page, la noirceur se termine et le contenu s'écoule sur le fond rouge. Peu importe que je règle la position relative ou absolue sur #some_div, le problème se produit dans les deux cas. Le contenu à l'intérieur de #some_div est principalement positionné de manière absolue et est généré dynamiquement à partir d'une base de données, de sorte que sa hauteur ne peut pas être connue à l'avance.

Edit: Voici une capture d'écran du problème: problème de div

Joey
la source
Cela a été demandé il y a quelques semaines. Je vais voir si je peux trouver cette question. Je crois que je l'ai commenté. modifier Je pense que votre question est similaire à celle-ci: stackoverflow.com/questions/9398313/…
jmbertucci
s'il vous plaît votre code pour une meilleure compréhension
sandeep
pouvez-vous poster votre code complet pls
Sven Bieder
23
Vous voulez tous mes milliers de lignes de code php, css et javascript? J'ai posté la partie de css qui était pertinente à la question ...
Joey
2
NECROPOST IS A GO: le réglage de la propriété overflow corrige des problèmes comme ceux - ci où le contenu dans un div est Stretching passé généralement il ( overflow: hidden;, overflow: scroll;, etc.).
AlbertEngelB

Réponses:

308

Voici ce que vous devez faire dans le style CSS, sur le div

display: block;
overflow: auto;

Et ne touche pas height

João Pimentel Ferreira
la source
4
A très bien fonctionné. J'avais besoin d'ajouter height: 100%à html, bodyet le conteneur div pour qu'il remplisse la hauteur quand il n'y avait pas assez de contenu.
Nico Huysamen
solution étonnante mais vous pouvez réellement toucher la hauteur si l'objectif est quelque chose comme une ferrure de fenêtre réactive
Alexis Rabago Carvajal
Est-ce display: block;nécessaire? Les divisions sont déjà des éléments de niveau bloc.
Max Heiber
il ajoute une barre de défilement intérieure pour moi (à la fois horizontale et verticale)
Nathan H
Si vous obtenez toujours l'élément parent un peu plus grand que les éléments enfants, vérifiez les espaces supplémentaires et / ou  supprimez-les. Essayez également d'ajuster la hauteur de la ligne. Par exemple, j'ai mis line-height: 0, parce que je n'avais pas besoin de texte, juste pour montrer une image.
Zorgatone
57

Réglez les heightà autoet min-heightà 100%. Cela devrait le résoudre pour la plupart des navigateurs.

body {
  position: relative;
  height: auto;
  min-height: 100% !important;
}
Matthew Sprankle
la source
3
OMI, cela répond à la question "Comment puis-je faire en sorte que le div aille toujours jusqu'en bas pour s'adapter au contenu interne?" mieux que la réponse actuellement marquée, qui active simplement le défilement par débordement plutôt que de s'assurer que le div / body se développe pour s'adapter à son contenu. +1
Jammerz858
A travaillé pour mon cas. THX!
Tyson Nero
Il est intéressant de noter que , pour une raison quelconque, il ne fonctionne pas si heightest 100%et min-heightest auto- j'attendre à ce qu'ils soient interchangeables dans ce cas, mais on dirait qu'ils ne sont pas.
PeaBrain
13

Habituellement, ce problème survient lorsque les éléments enfants d'une division parent sont flottants. Voici la dernière solution du problème:

Dans votre fichier CSS, écrivez la classe suivante appelée .clearfix avec le pseudo-sélecteur : after

.clearfix:after {
content: "";
display: table;
clear: both;
}

Ensuite, dans votre HTML, ajoutez la classe .clearfix à votre Div parente. Par exemple:

<div class="clearfix">
    <div></div>
    <div></div>
</div>

Cela devrait toujours fonctionner. Vous pouvez appeler le nom de la classe en tant que .group au lieu de .clearfix , car cela rendra le code plus sémantique. Notez que, il n'est pas nécessaire d'ajouter le point ou même un espace dans la valeur du contenu entre la double citation "". Aussi, débordement: auto; peut résoudre le problème, mais cela pose d'autres problèmes comme l'affichage de la barre de défilement et n'est pas recommandé.

Source: Blog de Lisa Catalano et Chris Coyier

Ifti Mahmud
la source
8

Si vous laissez simplement le height: 100%et utilisez display:block;le, divcela prendra autant d'espace que le contenu à l'intérieur du div. De cette façon, tout le texte restera dans le fond noir.

RonnieVDPoel
la source
Où avez-vous utilisé display: block? Je ne vois pas cela dans votre question.
Courses de légèreté en orbite
Je l'ai ajouté à #some_div après que Ronnie l'ait suggéré, mais cela n'a pas résolu le problème.
Joey
1
Pourriez-vous essayer d'ajouter float: none; au même #some_div css
RonnieVDPoel
Au lieu de float: none;, utilisez clear:both;. Il fait la même chose mais est plus cross-browser, @RonnieVDPoel
Cannicide
7

Cette question est peut-être ancienne, mais elle mérite une mise à jour. Voici une autre façon de faire cela:

#yourdiv {
    display: flex;
    width:100%;
    height:100%;
}
user9459537
la source
1
Si vous souhaitez publier sur une ancienne question, il est recommandé d'utiliser les valeurs actuelles (AKA pas de préfixes sur flex).
jhpratt
Désolé, je ne sais pas de quoi vous parlez.
user9459537
1
Les préfixes Flex ne sont plus nécessaires depuis un certain temps maintenant.
jhpratt
Et lesquels sont-ils?
user9459537
5

Essaye ça:

body { 
    min-height:100%; 
    background:red; 
} 

#some_div {
    min-height:100%; 
    background:black; 
} 

IE6 et les versions antérieures ne prennent pas en charge la propriété min-height.

Je pense que le problème est que lorsque vous dites au corps d'avoir une hauteur de 100%, son arrière-plan ne peut être aussi grand que la hauteur d'une "fenêtre" du navigateur (la zone de visualisation qui exclut les barres d'outils et les barres d'état et les barres de menus du navigateur et les bords de fenêtre). Si le contenu est plus grand qu'une fenêtre, il dépassera la hauteur consacrée à l'arrière-plan.

Cette propriété min-height sur le corps doit FORCER l'arrière-plan à être au moins aussi haut qu'une fenêtre si votre contenu ne remplit pas une page entière vers le bas, mais il doit également le laisser croître vers le bas pour englober plus de contenu intérieur.

Ace Frahm
la source
3

Ancienne question, mais dans mon cas, j'ai trouvé que l'utilisation l'avait position:fixedrésolue pour moi. Ma situation aurait pu être un peu différente cependant. J'avais un semi-transparent superposé divavec une animation de chargement que j'avais besoin d'afficher pendant le chargement de la page. Donc, utiliser height:auto / 100%ou les min-height: 100%deux remplissait la fenêtre mais pas la zone hors écran. L'utilisation de position:fixedcette superposition a fait défiler avec l'utilisateur, de sorte qu'elle couvrait toujours la zone visible et gardait mon animation de préchargement centrée sur l'écran.

Thomas Smart
la source
1

Ajoutez simplement ces deux lignes dans votre identifiant css #some_div

display: block;
overflow: auto;

Après cela, vous obtiendrez ce que vous recherchez!

singhviku
la source
0

Je ne suis pas tout à fait sûr d'avoir compris la question car c'est une réponse assez simple, mais voici ... :)

Avez-vous essayé de définir la propriété de débordement du conteneur sur visible ou automatique?

#some_div {
    height:100%;
    background:black; 
    overflow: visible;
    }

L'ajout de cela devrait pousser le conteneur noir à la taille requise par votre conteneur dynamique. Je préfère le visible à l'automobile car l'auto semble venir avec des barres de défilement ...

Jlisham
la source
0

Les navigateurs modernes prennent en charge l'unité "hauteur de la fenêtre". Cela étendra le div à la hauteur de la fenêtre disponible. Je la trouve plus fiable que toute autre approche.

#some_div {
    height: 100vh;
    background: black;
}
devdrc
la source
0

Même toi, tu peux faire comme ça

display:block;
overflow:auto;
height: 100%;

Cela inclura votre chaque div dynamique selon le contenu. Supposons que si vous avez un div commun avec la classe, cela augmentera la hauteur de chaque div dynamique en fonction du contenu

ahmed sharief
la source
0

Vous pouvez aussi utiliser

 display: inline-block;

le mien a travaillé avec ça

Parthan_akon
la source
0

RECOUVREMENT SANS POSITION: FIXE

Une façon vraiment cool de comprendre cela pour un menu récent était de régler le corps sur:

position: relative

et définissez votre classe wrapper comme ceci:

#overlaywrapper {
    position: absolute;
    top: 0;
    width: 100%;
    height: 100%;
    background: #00000080;
    z-index: 100;
}

Cela signifie que vous n'avez pas à définir la position fixe et que vous pouvez toujours permettre le défilement. J'ai utilisé ceci pour superposer des menus qui sont VRAIMENT grands.

Benjamin Vaughan
la source
0

utiliser flex

.parent{
    display: flex
}

.fit-parent{
    display: flex;
    flex-grow: 1
}
Nagibaba
la source
0

Ok, j'ai essayé quelque chose comme ça:

corps (normal)

#MainDiv { 
  /* where all the content goes */
  display: table;
  overflow-y: auto;
}

Ce n'est pas la manière exacte de l'écrire, mais si vous faites afficher le div principal sous forme de tableau, il se développe et j'ai implémenté des barres de défilement.

Alex
la source