Je travaille sur une application web où je souhaite que le contenu remplisse la hauteur de tout l'écran.
La page a un en-tête, qui contient un logo et des informations de compte. Cela pourrait être une hauteur arbitraire. Je veux que la div de contenu remplisse le reste de la page vers le bas.
J'ai un en-tête div
et un contenu div
. En ce moment j'utilise un tableau pour la mise en page comme ceci:
CSS et HTML
#page {
height: 100%; width: 100%
}
#tdcontent {
height: 100%;
}
#content {
overflow: auto; /* or overflow: hidden; */
}
<table id="page">
<tr>
<td id="tdheader">
<div id="header">...</div>
</td>
</tr>
<tr>
<td id="tdcontent">
<div id="content">...</div>
</td>
</tr>
</table>
La hauteur entière de la page est remplie et aucun défilement n'est requis.
Pour tout ce qui se trouve à l'intérieur de la division de contenu, le paramètre le top: 0;
placera juste sous l'en-tête. Parfois, le contenu sera une vraie table, avec sa hauteur réglée à 100%. Mettre à l' header
intérieur content
ne permettra pas que cela fonctionne.
Existe-t-il un moyen d'obtenir le même effet sans utiliser le table
?
Mise à jour:
Les éléments à l'intérieur du contenu div
auront également des hauteurs définies en pourcentages. Donc, quelque chose à 100% à l'intérieur le div
remplira jusqu'au fond. De même que deux éléments à 50%.
Mise à jour 2:
Par exemple, si l'en-tête occupe 20% de la hauteur de l'écran, une table spécifiée à 50% à l'intérieur #content
occuperait 40% de l'espace d'écran. Jusqu'à présent, envelopper le tout dans une table est la seule chose qui fonctionne.
la source
display:table
les propriétés associées, voir cette réponse à une question très similaire.Réponses:
Mise à jour 2015: l'approche flexbox
Il y a deux autres réponses mentionnant brièvement Flexbox ; cependant, c'était il y a plus de deux ans, et ils ne fournissent aucun exemple. La spécification pour flexbox est définitivement établie.
Tous les principaux navigateurs et IE11 + prennent en charge Flexbox. Pour IE 10 ou une version antérieure, vous pouvez utiliser la cale FlexieJS.
Pour vérifier le support actuel, vous pouvez également voir ici: http://caniuse.com/#feat=flexbox
Exemple de travail
Avec flexbox, vous pouvez facilement basculer entre n'importe laquelle de vos lignes ou colonnes ayant des dimensions fixes, des dimensions de contenu ou des dimensions d'espace restant. Dans mon exemple, j'ai défini l'en-tête pour qu'il s'aligne sur son contenu (conformément à la question OP), j'ai ajouté un pied de page pour montrer comment ajouter une région à hauteur fixe, puis définir la zone de contenu pour remplir l'espace restant.
Dans le CSS ci-dessus, la propriété flex raccourcit les propriétés flex-grow , flex-shrink et flex- based pour établir la flexibilité des éléments flex. Mozilla a une bonne introduction au modèle des boîtes flexibles .
la source
flex: 0 1 30px;
attributbox .row
car il est prioritaire dans chaque div?overflow-y: auto
à.row.content
pour obtenir ce que vous devez cependant.Il n'y a vraiment pas de méthode saine et multi-navigateur pour le faire en CSS. En supposant que votre mise en page est complexe, vous devez utiliser JavaScript pour définir la hauteur de l'élément. L'essence de ce que vous devez faire est:
Une fois que vous pouvez obtenir cette valeur et définir la hauteur de l'élément, vous devez attacher des gestionnaires d'événements à la fois à la fenêtre onload et à onresize afin de pouvoir déclencher votre fonction de redimensionnement.
En outre, en supposant que votre contenu soit plus volumineux que la fenêtre d'affichage, vous devrez définir overflow-y pour faire défiler.
la source
Le message d'origine date de plus de 3 ans. Je suppose que de nombreuses personnes qui viennent à ce poste comme moi recherchent une solution de mise en page similaire à une application, par exemple un en-tête, un pied de page et un contenu pleine hauteur fixes occupant l'écran de repos. Si c'est le cas, ce message peut vous aider, il fonctionne sur IE7 +, etc.
http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/
Et voici quelques extraits de ce message:
la source
display: table
dans le corps, il semble déborder le corps. Faire ainsiheight: 100%
ne produit pas la bonne hauteur..col
n'est pas utilisé, n'est-ce pas?Au lieu d'utiliser des tables dans le balisage, vous pouvez utiliser des tables CSS.
Marquage
(Pertinent) CSS
FIDDLE1 et FIDDLE2
Certains avantages de cette méthode sont:
1) Moins de majoration
2) Le balisage est plus sémantique que les tableaux, car il ne s'agit pas de données tabulaires.
3) Le support du navigateur est très bon : IE8 +, tous les navigateurs et appareils mobiles modernes ( caniuse )
Juste pour être complet, voici les éléments Html équivalents aux propriétés css du modèle de table CSS
la source
html, body { height: 100%, width: 100% }
semblé critique dans mes tests.relative
positionnement sur l'table-row
élément, il prend donc la hauteur du premier ascendant qui n'est pas un élément de table.Approche CSS uniquement (si la hauteur est connue / fixe)
Lorsque vous souhaitez que l'élément du milieu s'étende verticalement sur toute la page, vous pouvez utiliser
calc()
ce qui est introduit dans CSS3.En supposant que nous ayons une hauteur
header
et desfooter
éléments fixes et que nous voulons que lasection
balise prenne toute la hauteur verticale disponible ...Démo
Le balisage supposé et votre CSS doivent être
Donc, ici, ce que je fais, c'est additionner la hauteur des éléments et déduire de l'
100%
utilisation de lacalc()
fonction.Assurez-vous simplement que vous utilisez
height: 100%;
pour les éléments parents.la source
Utilisé:
height: calc(100vh - 110px);
code:
la source
Une solution simple, utilisant flexbox:
Échantillon Codepen
Une solution alternative, avec un div centré dans le contenu div
la source
Que diriez-vous d'utiliser simplement
vh
ce qui signifieview height
en CSS ...Regardez l' extrait de code que j'ai créé pour vous ci-dessous et exécutez-le:
Regardez également l'image ci-dessous que j'ai créée pour vous:
la source
CSS3 Simple Way
tous les principaux navigateurs les prennent en charge de nos jours, alors allez-y si vous n'avez pas besoin de prendre en charge les navigateurs vintage.
la source
Cela pourrait être fait uniquement en
CSS
utilisantvh
:et le
HTML
Je l' ai vérifié, il fonctionne dans tous les principaux navigateurs:
Chrome
,IE
etFireFox
la source
vh
etvw
avant. Plus d'infos: snook.ca/archives/html_and_css/vm-vh-unitsheight: 100%
on a#content
fait en sorte que sa hauteur corresponde à celle de#page
, ignorant#tdcontent
complètement la hauteur de. Avec beaucoup de contenu, la barre de défilement s'étend au-delà du bas de la page.Aucune des solutions publiées ne fonctionne lorsque vous avez besoin que le div inférieur défile lorsque le contenu est trop grand. Voici une solution qui fonctionne dans ce cas:
Source d'origine: Remplir la hauteur restante d'un conteneur tout en gérant le débordement en CSS
Aperçu en direct de JSFiddle
la source
body-content-wrapper
, et les choses semblent bien fonctionner sans le double wrapper (sans aucuntable-cell
s). Y a-t-il un problème à le faire de cette façon?.body
hauteur finit par être la même hauteur que celle définie.container
. La barre de défilement verticale est toujours au bon endroit, mais les.container
extrémités deviennent plus grandes que nous le souhaitons. Lorsqu'il est en plein écran,.body
le bas de l'écran est en bas de l'écran.J'ai également cherché une réponse à cela. Si vous avez la chance de pouvoir cibler IE8 et versions ultérieures, vous pouvez utiliser
display:table
les valeurs associées pour obtenir les règles de rendu des tableaux avec des éléments de niveau bloc, y compris div.Si vous êtes encore plus chanceux et que vos utilisateurs utilisent des navigateurs de premier plan (par exemple, s'il s'agit d'une application intranet sur des ordinateurs que vous contrôlez, comme mon dernier projet), vous pouvez utiliser la nouvelle disposition de boîte flexible en CSS3!
la source
Ce qui a fonctionné pour moi (avec un div dans un autre div et je suppose dans toutes les autres circonstances) est de régler le rembourrage inférieur à 100%. Autrement dit, ajoutez ceci à votre feuille de style / CSS:
la source
HTML 5
CSS
La solution ci-dessus utilise des unités de fenêtre et une boîte flexible , et est donc IE10 +, à condition que vous utilisiez l'ancienne syntaxe pour IE10.
Codepen pour jouer avec: lien vers codepen
Ou celui-ci, pour ceux qui ont besoin que le conteneur principal défile en cas de contenu débordant: lien vers codepen
la source
Il y a une tonne de réponses maintenant, mais j'ai trouvé utile
height: 100vh;
de travailler sur l'élément div qui doit remplir tout l'espace vertical disponible.De cette façon, je n'ai pas besoin de jouer avec l'affichage ou le positionnement. Cela s'est avéré utile lors de l'utilisation de Bootstrap pour créer un tableau de bord dans lequel j'avais une barre latérale et une principale. Je voulais que le principal s'étire et remplisse tout l'espace vertical afin que je puisse appliquer une couleur d'arrière-plan.
Prend en charge IE9 et plus: cliquez pour voir le lien
la source
Dans tous les navigateurs sensés, vous pouvez placer le div "en-tête" avant le contenu, en tant que frère et sœur, et le même CSS fonctionnera. Cependant, IE7- n'interprète pas correctement la hauteur si le flottant est à 100% dans ce cas, donc l'en-tête doit être dans le contenu, comme ci-dessus. Le débordement: auto entraînera des barres de défilement doubles sur IE (qui a toujours la barre de défilement de la fenêtre visible, mais désactivée), mais sans cela, le contenu se coupera s'il déborde.
la source
div
... c'esttop: 0;
-à- dire mettre quelque chose juste en dessous de l'en-tête. Je vais encore modifier ma question, car vous y avez parfaitement répondu, et toujours pas ce que je veux! Je vais juste cacher le débordement car le contenu doit s'adapter.J'ai lutté avec cela pendant un certain temps et je me suis retrouvé avec ce qui suit:
Puisqu'il est facile de faire le contenu DIV de la même hauteur que le parent mais apparemment difficile de le faire la hauteur du parent moins la hauteur de l'en-tête, j'ai décidé de faire le contenu div pleine hauteur mais le positionner absolument dans le coin supérieur gauche et puis définir un rembourrage pour le haut qui a la hauteur de l'en-tête. De cette façon, le contenu s'affiche proprement sous l'en-tête et remplit tout l'espace restant:
la source
Si vous ne parvenez pas à prendre en charge les anciens navigateurs (c'est-à-dire MSIE 9 ou plus ancien), vous pouvez le faire avec Flexible Box Layout Module qui est déjà W3C CR. Ce module permet également d'autres astuces intéressantes, telles que la réorganisation du contenu.
Malheureusement, MSIE 9 ou moins ne prend pas en charge cela et vous devez utiliser le préfixe du fournisseur pour la propriété CSS pour chaque navigateur autre que Firefox. Espérons que d'autres fournisseurs abandonneront bientôt le préfixe également.
Un autre choix serait la disposition de grille CSS, mais qui a encore moins de support des versions stables des navigateurs. En pratique, seul MSIE 10 le prend en charge.
Mise à jour de l'année 2020 : tous les navigateurs modernes prennent en charge à la fois
display: flex
etdisplay: grid
. Le seul manquant est le support poursubgrid
lequel n'est pris en charge que par Firefox. Notez que MSIE ne prend pas en charge non plus la spécification, mais si vous êtes prêt à ajouter des hacks CSS spécifiques à MSIE, il peut être fait pour se comporter. Je suggérerais simplement d'ignorer MSIE car même Microsoft dit qu'il ne devrait plus être utilisé.la source
Solution de grille CSS
Il suffit de définir les propriétés
body
withdisplay:grid
etgrid-template-rows
usingauto
etfr
value.Un guide complet des grilles @ CSS-Tricks.com
la source
Pourquoi pas comme ça?
Vous donner une taille html et corps (dans cet ordre) et ensuite juste donner une hauteur à vos éléments?
Travaille pour moi
la source
Vous pouvez réellement utiliser
display: table
pour diviser la zone en deux éléments (en-tête et contenu), où l'en-tête peut varier en hauteur et le contenu remplit l'espace restant. Cela fonctionne avec la page entière, ainsi que lorsque la zone est simplement le contenu d'un autre élément positionné avecposition
défini surrelative
,absolute
oufixed
. Cela fonctionnera tant que l'élément parent aura une hauteur non nulle.Voir ce violon et aussi le code ci-dessous:
CSS:
HTML:
la source
résolu le problème pour moi. Dans mon cas, j'ai appliqué cela à la div requise
la source
Vincent, je répondrai à nouveau en utilisant vos nouvelles exigences. Comme vous ne vous souciez pas du contenu caché s'il est trop long, vous n'avez pas besoin de faire flotter l'en-tête. Mettez simplement le débordement caché sur les balises html et body, et réglez la
#content
hauteur à 100%. Le contenu sera toujours plus long que la fenêtre d'affichage par la hauteur de l'en-tête, mais il sera masqué et ne provoquera pas de barres de défilement.la source
table
ça parce que ça marche. Merci pour la mise à jour.Essaye ça
la source
J'ai trouvé une solution assez simple, car pour moi, c'était juste un problème de conception. Je voulais que le reste de la page ne soit pas blanc sous le pied de page rouge. J'ai donc mis la couleur d'arrière-plan des pages en rouge. Et la couleur de fond du contenu au blanc. Avec la hauteur du contenu réglée par ex. 20em ou 50% une page presque vide ne laissera pas la page entière rouge.
la source
J'ai eu le même problème mais je n'ai pas pu faire fonctionner la solution avec les flexbox ci-dessus. J'ai donc créé mon propre modèle, qui comprend:
J'ai utilisé des boîtes flexibles mais de manière plus simple, en utilisant uniquement les propriétés display: flex et flex-direction: row | column :
J'utilise angulaire et je veux que la taille de mes composants soit à 100% de leur élément parent.
La clé est de définir la taille (en pourcentage) pour tous les parents afin de limiter leur taille. Dans l'exemple suivant, la hauteur myapp a 100% de la fenêtre d'affichage.
Le composant principal a 90% de la fenêtre, car l'en-tête et le pied de page en ont 5%.
J'ai posté mon modèle ici: https://jsfiddle.net/abreneliere/mrjh6y2e/3
Html:
la source
Pour l'application mobile, j'utilise uniquement VH et VW
Démo - https://jsfiddle.net/u763ck92/
la source
Filer l'idée de M. Alien ...
Cela semble une solution plus propre que la boîte de flexion populaire pour les navigateurs compatibles CSS3.
Utilisez simplement min-height (au lieu de height) avec calc () pour le bloc de contenu.
Le calc () commence à 100% et soustrait les hauteurs des en-têtes et pieds de page (doit inclure des valeurs de remplissage)
L'utilisation de "min-height" au lieu de "height" est particulièrement utile pour pouvoir fonctionner avec du contenu rendu javascript et des frameworks JS comme Angular2. Sinon, le calcul ne poussera pas le pied de page vers le bas de la page une fois que le contenu rendu en javascript est visible.
Voici un exemple simple d'en-tête et de pied de page utilisant une hauteur de 50 pixels et un rembourrage de 20 pixels pour les deux.
Html:
Css:
Bien sûr, les calculs peuvent être simplifiés mais vous avez l'idée ...
la source
Dans Bootstrap:
Styles CSS:
1) Remplissez simplement la hauteur de l'espace d'écran restant:
2) remplissez la hauteur de l'espace d'écran restant et alignez le contenu au milieu de l'élément parent:
la source
Ceci est ma propre version minimale de la solution de Pebbl. Il a fallu une éternité pour trouver l'astuce pour le faire fonctionner dans IE11. (Également testé dans Chrome, Firefox, Edge et Safari.)
la source