J'ai examiné toutes les solutions min-height: 100% des solutions sur StackOverflow et sur le Web et je n'arrive pas à en trouver une qui réponde à mes besoins (relativement simples).
Voici ce que je veux:
Exemple de code:
http://codepen.io/anon/pen/dwgDq?editors=110
<!DOCTYPE html>
<html>
<body>
<div class="container">
<div class="nav">
<p>Item 1</p>
<p>Item 2</p>
<p>Item 3</p>
<p>Item 4</p>
<p>Item 5</p>
</div>
<div class="content">
<p>Content 1</p>
<p>Content 2</p>
<p>Content 3</p>
<p>Content 4</p>
<p>Content 5</p>
<p>Content 6</p>
<p>Content 7</p>
<p>Content 8</p>
</div>
</div>
</body>
</html>
html, body { height: 100%; margin: 0; }
.wrapper {
height: 100%;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.container {
display: flex;
align-items: stretch;
min-height: 100%;
}
.nav {
background: grey;
width: 200px;
}
.content {
flex-grow: 1;
background: yellow;
}
Cela fonctionne parfaitement dans Safari et Chrome.
Il semble que IE (v11 dans mon cas) ne respecte pas ma hauteur minimale et que, par conséquent, les colonnes ne remplissent pas la hauteur de l'écran. D'après ce que j'ai lu, IE6 + 7 avait des problèmes avec le traitement de la hauteur en min-height, mais il s'agit d'une relique du passé, révolue depuis longtemps, lors de l'utilisation d'un doctype HTML5.
Comment faire IE honorer mon min-height?
Comment puis-je faire cette mise en page?
Voici le correctif:
HTML
<body>
<header>Header</header>
<main>Here comes the content ...</main>
<footer>Footer</footer>
</body>
CSS
body {
display: flex;
flex-direction: column;
height: 100vh;
}
header, footer {
flex-shrink: 0;
}
main {
flex: 1 0 auto;
}
jsfiddle: http://jsfiddle.net/d5syw3dc/
Il existe une autre solution à ce problème.
Dans votre cas, vous pouvez utiliser un pseudo-élément pour étirer une ligne:
Tout d’abord, utilisez 100vh au lieu de 100%
.container {
display: flex;
align-items: stretch;
min-height: 100vh;
}
Après cela, ajoutez simplement pseudo élément à .container avec exactement même hauteur valeur
.container::after{
content: '';
height: 100vh;
visibility: hidden;
}
Ici, voir mon codepen http://codepen.io/anon/pen/LVazgQ
min-height
ne fonctionne pas dans IE10/11 lorsqu'il est associé à une structure flexible (consultez le rapport bug ). Utilisez un autre conteneur flexible pour le réparer.
Edit:Je viens juste de comprendre que je ne répondais pas au message d'origine, induit en erreur par la réponse votée. Alors, on y va:
HTML
<div class="ie-fixMinHeight">
<div id="page">
<div id="sidebar"></div>
<div id="content"></div>
</div>
</div>
CSS
.ie-fixMinHeight{
display:flex;
}
#page {
min-height:100vh;
width:100%;
display:flex;
}
#content {
flex-grow:1;
}
N'utilisez pas la mise en page flexbox directement sur body
car des éléments insérés via des plugins jQuery (saisie semi-automatique, popup, etc.) seraient bloqués.
Ici, la mise en page fixed en fonction de votre code.
HTML
<div class="ie-fixMinHeight">
<div id="page">
<div id="header"></div>
<div id="content"></div>
<div id="footer"></div>
</div>
</div>
CSS
.ie-fixMinHeight {
display:flex;
}
#page {
min-height:100vh;
width:100%;
display:flex;
flex-direction:column;
}
#content {
flex-grow:1;
}
Voir une démo working .
Faire en sorte que les enfants de votre élément display: flex
héritent de min-height était une solution rapide pour moi sur IE, sans aucun élément supplémentaire. Cela fonctionne également comme prévu avec le débordement.
HTML:
<div class="container">
<div class="col-1">Col 1</div>
<div class="col-2">Col 2</div>
</div>
CSS:
body {
margin: 0;
min-height: 100vh;
}
.container {
min-height: inherit; /* or 100vh or whatever you want */
display: flex;
}
.container > * {
min-height: inherit; /* use the full height of the container, works with overflow */
}
.col-1 {
background: red;
flex-grow: 1; /* half the screen width */
}
.col-2 {
background: blue;
flex-grow: 1; /* half the screen width */
}
EDIT: La réponse de Thomas montre un moyen de réaliser ce que je voulais sans utiliser min-height, ce qui signifie que cela fonctionne très bien sous IE.
J'ai fini par résoudre ce problème avec Javascript, même si je reconnais que c'est un code absolument désagréable et une jolie solution dépendante de l'implémentation. Lorsque la taille de mon élément de contenu principal change de taille, je désactive la propriété height, mesure le conteneur pour déterminer si la propriété height est réellement nécessaire, puis le remplace si nécessaire. C'est comme si j'avais écrit ma propre implémentation de min-height. Un inconvénient majeur de cette approche est que IE ne donne pas les événements appropriés lorsque la taille des éléments change ou lorsque le contenu d'un élément change, et sans ces événements, vous devez utiliser un minuteur setInterval et mesurer vous-même l'élément . Brut.
En plus de ma propre solution, j'ai parlé avec les membres de l'équipe IE qui travaillent sur flexbox. Ils ont reconnu que le bogue existait toujours dans la production actuelle, mais ils m'ont tout de même invité à trouver un moyen de le réparer sans JS. L’une des pistes qu’ils m’avaient données consistait à utiliser la disposition spécifique à IE -ms-grid . Je ne les connais pas bien, mais je vais faire rapport et mettre à jour cette réponse si j'ai le temps d'enquêter.