118 votes

Hauteur du corps 100% affichant la barre de défilement verticale

Par curiosité, si l'on considère l'exemple ci-dessous, pourquoi le fait d'avoir la marge sur le div #container provoque-t-il l'apparition d'une barre de défilement verticale dans le navigateur ? Le conteneur est beaucoup plus petit en hauteur que la hauteur du corps, qui est fixée à 100 %.

J'ai fixé le padding et les marges à 0 pour tous les éléments sauf le #container. Notez que j'ai délibérément omis le positionnement absolu sur le div #container. Dans ce cas, comment le navigateur calcule-t-il la hauteur du corps et comment la marge l'affecte-t-elle ?

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
* { padding:0; margin:0;}
html, body { height:100%; }
#container
{
  padding:10px;
  margin:50px;
  border:1px solid black;
  width: 200px;
  height: 100px;
}
</style>
</head>
<body>
  <div id='container'>
  </div>
</body>
</html>

Exemple également sur JSFiddle

81voto

BoltClock Points 249668

Si vous peignez les arrière-plans de html y body (en donnant à chacun sa propre couleur) vous remarquerez rapidement que body est déplacé vers le bas avec #container y #container n'est pas décalé par rapport au haut de la page body du tout. C'est un effet secondaire de effondrement des marges que je couvre en détail aquí (bien que cette réponse décrive une configuration légèrement différente).

C'est ce comportement qui provoque l'apparition de la barre de défilement, puisque vous avez déclaré body pour avoir 100% de la hauteur de html . Notez que la hauteur réelle de body n'est pas affectée, car les marges ne sont jamais incluses dans les calculs de hauteur.

30voto

hvc Points 11

En me basant sur la réponse de @BoltClock, j'ai réglé le problème en mettant à zéro la marge...
donc

html,body, #st-full-pg {
   height: 100%;
   margin: 0;
}

fonctionne lorsque l'identifiant "st-full-pg" est attribué à un div de panneau (qui contenait en outre panel-heading et panel-body)

24voto

Michel Points 767

Un peu tard, mais peut-être que ça aidera quelqu'un.

Ajout de float: left; a #container supprime la barre de défilement, comme le dit le W3C :

-Les marges entre une boîte flottante et toute autre boîte ne se réduisent pas (pas même entre une boîte flottante et ses enfants dans le flux).

11voto

fjkjava Points 987
html,body {
   height: 100%;
   margin: 0;
   overflow: hidden;
}

Cela a fonctionné pour moi

4voto

En ajoutant float:left; c'est bien, mais cela va interférer avec le positionnement horizontal central en utilisant margin:auto;

si vous connaissez la taille de votre marge, vous pouvez en tenir compte dans votre pourcentage de taille en utilisant le calcul :

height: calc(100% - 50px);

la prise en charge des navigateurs est bonne, mais uniquement IE11+. https://caniuse.com/#feat=calc

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