div avec min-height dynamique basé sur la hauteur de la fenêtre du navigateur

J'ai trois div Éléments: un en-tête, un en pied de page et un contenu Central div.
le div au centre doit se développer automatiquement avec le contenu, mais je voudrais un min-height tel que le fond div atteint toujours au moins le bas de la fenêtre, mais n'est pas fixé là sur des pages plus longues.

Par exemple:

<div id="a" style="height: 200px;">
  <p>This div should always remain at the top of the page content and should scroll with it.</p>
</div>
<div id="b">
  <p>This is the div in question. On longer pages, this div needs to behave normally (i.e. expand to fit the content and scroll with the entire page). On shorter pages, this div needs to expand beyond its content to a height such that div c will reach the bottom of the viewport, regardless of monitor resolution or window size.
</div>
<div id="c" style="height: 100px;">
  <p>This div needs to remain at the bottom of the page's content, and scroll with it on longer pages, but on shorter pages, needs to reach the bottom of the browser window, regardless of monitor resolution or window size.</p>
</div>
28
demandé sur Hakam Fostok 2011-09-23 13:50:43

7 réponses

Il suffit de chercher ma solution sur jsfiddle , elle est basée sur csslayout

html,
body {
  margin: 0;
  padding: 0;
  height: 100%; /* needed for container min-height */
}
div#container {
  position: relative; /* needed for footer positioning*/
  height: auto !important; /* real browsers */
  min-height: 100%; /* real browsers */
}
div#header {
  padding: 1em;
  background: #efe;
}
div#content {
  /* padding:1em 1em 5em; *//* bottom padding for footer */
}
div#footer {
  position: absolute;
  width: 100%;
  bottom: 0; /* stick to bottom */
  background: #ddd;
}
<div id="container">

  <div id="header">header</div>

  <div id="content">
    content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>content<br/>
  </div>

  <div id="footer">
    footer
  </div>
</div>
21
répondu huston007 2015-04-10 13:26:16

J'ai trouvé cette courtoisie de ryanfait.com. C'est en fait très simple.

Pour faire flotter un pied de page vers le bas de la page lorsque le contenu est plus court que la hauteur de la fenêtre, ou au bas du contenu lorsqu'il est plus long que la hauteur de la fenêtre, utilisez le code suivant:

Structure HTML de base:

<div id="content">
  Place your content here.
  <div id="push"></div>
</div>
<div id="footer">
  Place your footer information here.
</footer>

remarque: rien ne doit être placé en dehors des divs' #content 'et' #footer ' à moins qu'il ne soit absolument positionné.
Remarque: Rien ne doit être placé à l'intérieur du div' #push ' car il sera caché.

Et le CSS:

* {
  margin: 0;
}
html, body {
  height: 100%;
}
#content {
  min-height: 100%;
  height: auto !important; /*min-height hack*/
  height: 100%;            /*min-height hack*/
  margin-bottom: -4em;     /*Negates #push on longer pages*/
}
#footer, #push {
  height: 4em;
}

Pour que les en-têtes ou les pieds de page couvrent la largeur d'une page, vous devez absolument positionner l'en-tête.
Remarque: Si vous ajoutez un en-tête de largeur de page, j'ai trouvé nécessaire d'ajouter un wrapper div supplémentaire à # content . Le div externe contrôle l'espacement horizontal tandis que le div interne contrôle l'espacement vertical. J'ai été obligé de le faire parce que j'ai trouvé que 'min-height:' ne fonctionne que sur le corps d'un élément et ajoute un rembourrage à la hauteur.

*Edit: point-virgule manquant

20
répondu Bryan 2013-07-31 19:03:32

Si #top et #bottom ont des hauteurs fixes, vous pouvez utiliser:

#top {
    position: absolute;
    top: 0;
    height: 200px;
}
#bottom {
    position: absolute;
    bottom: 0;
    height: 100px;
}
#central {
    margin-top: 200px;
    margin-bot: 100px;
}

Mettre à jour

Si vous voulez que #central s'étire, vous pouvez:

  • faux avec un fond sur parent;
  • utilisez les CSS3 (pas largement pris en charge, très probablement) calc();
  • Ou peut-être utiliser javascript pour ajouter dynamiquement min-height.

Avec calc():

#central {
    min-height: calc(100% - 300px);
}

Avec jQuery, cela pourrait être quelque chose comme:

$(document).ready(function() {
  var desiredHeight = $("body").height() - $("top").height() - $("bot").height();
  $("#central").css("min-height", desiredHeight );
});
8
répondu ANeves 2011-09-23 14:44:23

Aucun hack ou js nécessaire. Appliquez simplement la règle suivante à votre élément racine:

min-height: 100%;
height: auto;

Il choisira automatiquement le plus grand des deux comme hauteur, ce qui signifie que si le contenu est plus long que le navigateur, ce sera la hauteur du contenu, sinon, la hauteur du navigateur. C'est le css standard.

2
répondu streaver91 2014-06-27 21:57:36

Comme mentionné ailleurs, la fonction CSS calc () peut bien fonctionner ici. Il est maintenant principalement pris en charge. Vous pouvez utiliser comme:

.container
{
    min-height: 70%;
    min-height: -webkit-calc(100% - 300px);
    min-height: -moz-calc(100% - 300px);
    min-height: calc(100% - 300px);
}
2
répondu Jahmic 2016-04-09 12:02:40

Vous devez probablement écrire du JavaScript, car il n'y a aucun moyen d'estimer la hauteur de tous les utilisateurs de la page.

0
répondu Merianos Nikos 2011-09-23 09:56:18

C'est difficile de faire ça.

Il existe un style css min-height:, mais cela ne fonctionne pas dans tous les navigateurs. Vous pouvez l'utiliser, mais le plus gros problème est que vous devrez le définir à quelque chose comme 90% ou des nombres comme ça (pourcentages), mais les divs haut et bas utilisent des tailles de pixels fixes, et vous ne serez pas en mesure de les réconcilier.

 var minHeight = $(window).height() -
                 $('#a').outerHeight(true) -
                 $('#c').outerHeight(true));

if($('#b').height() < minHeight) $('#b').height(minHeight);

Je sais que a et c ont des hauteurs fixes, mais je les Mesure plutôt au cas où elles changeraient plus tard.

Aussi, je mesure la hauteur de b (Je ne vous voulez faire est plus petit après tout), mais s'il y a une image là-bas qui n'a pas chargé la hauteur peut changer, alors faites attention à des choses comme ça.

Il peut être plus sûr de faire:

$('#b').prepend('<div style="float: left; width: 1px; height: ' + minHeight + 'px;">&nbsp;</div>');

Qui ajoute simplement un élément dans cette div avec la hauteur correcte-qui agit efficacement comme min-height même pour les navigateurs qui ne l'ont pas. (Vous pouvez ajouter l'élément dans votre balisage, puis en contrôler la hauteur via javascript au lieu de l'ajouter de cette façon, de cette façon vous pouvez le prendre en compte lors de la conception de la mise en page.)

0
répondu Ariel 2011-09-25 20:14:59