Flexbox et vertical scroll dans une application pleine hauteur utilisant une nouvelle api flexbox
je veux utiliser une application pleine hauteur en utilisant flexbox. J'ai trouvé ce que je veux en utilisant l'ancienne flexbox (display: box; et d'autres choses) dans ce lien: CSS3 Flexbox pleine hauteur app et débordement
il s'agit d'une solution correcte pour l'ancienne version des propriétés CSS de flexbox.
si je veux essayer d'utiliser les nouvelles propriétés flexbox je vais essayer d'utiliser la deuxième solution dans le même lien mais "hacking" flexbox en utilisant un conteneur avec hauteur: 0px; il fait pour montrer un rouleau vertical.
Je ne l'aime pas beaucoup parce qu'il introduit d'autres problèmes et il est plus un workarround qu'une solution.
j'ai préparé un jsfiddle avec un exemple de base: http://jsfiddle.net/ch7n6 /
#container {
display: -webkit-flex;
-webkit-flex-direction: column;
height: 100%;
}
#container article {
-webkit-flex: 1 1 auto;
overflow-y: scroll;
}
il s'agit d'un" full-height html web " et le pied de page sont en bas à cause de la flexbox de le contenu de l'élément. Je vous suggère de déplacer la barre entre le code css et le résultat pour simuler une hauteur différente.
3 réponses
merci à https://stackoverflow.com/users/1652962/cimmanon qui m'a donné la réponse.
la solution fixe une hauteur à l'élément réglable verticalement. Par exemple:
#container article {
-webkit-flex: 1 1 auto;
overflow-y: auto;
height: 0px;
}
l'élément aura la hauteur parce que flexbox recalcule à moins que vous ne vouliez une min-height donc vous pouvez utiliser hauteur: 100px; qu'il est exactement identique à: min-height: 100px;
#container article {
-webkit-flex: 1 1 auto;
overflow-y: auto;
height: 100px; /* == min-height: 100px*/
}
donc la meilleure solution si vous voulez un min-height dans le rouleau vertical:
#container article {
-webkit-flex: 1 1 auto;
overflow-y: auto;
min-height: 100px;
}
Si vous voulez juste plein de défilement verticale dans le cas où il n'y a pas assez d'espace pour voir l'article:
#container article {
-webkit-flex: 1 1 auto;
overflow-y: auto;
min-height: 0px;
}
le code final: http://jsfiddle.net/ch7n6/867 /
éditeur de spécifications Flexbox ici.
c'est une utilisation encouragée de flexbox, mais il ya quelques choses que vous devriez Modifier pour le meilleur comportement.
-
N'utilisez pas de préfixes. Flexbox non figé est bien supporté par la plupart des navigateurs. Commencez toujours avec unprefixed, et n'ajoutez des préfixes que si nécessaire pour le supporter.
-
puisque votre en-tête et le pied de page ne sont pas destinés à fléchir, ils devraient tous les deux ont
flex: none;
. En ce moment, vous avez un comportement similaire en raison de certains effets se chevauchant, mais vous ne devriez pas compter sur ce sauf si vous voulez accidentellement vous confondre plus tard. (Par défaut estflex:0 1 auto
, de sorte qu'ils commencent à leur hauteur automatique et peuvent rétrécir mais ne pas croître, mais ils sont aussioverflow:visible
par défaut, qui déclenche leur défautmin-height:auto
pour les empêcher de rétrécir du tout. Si jamais vous mettez unoverflow
sur eux, le comportement demin-height:auto
les changements (passer à zéro plutôt qu'à min-content) et ils vont soudainement être écrasés par l'élément extra-haut<article>
.) -
vous pouvez simplifier le
<article>
flex
trop - juste misflex: 1;
et vous serez bon à aller. Essayez de vous en tenir aux valeurs communes de https://drafts.csswg.org/css-flexbox/#flex-common sauf si vous avez une bonne raison de faire quelque chose de plus compliqué - ils sont plus faciles à lire et couvrez la plupart des comportements que vous voulez invoquer.
la spécification actuelle dit ceci au sujet de flex: 1 1 auto
:
tailles l'article basé sur les propriétés
width
/height
, mais fait ils sont entièrement flexibles, de sorte qu'ils absorbent tout espace libre le long de la axe. Si tous les articles sontflex: auto
,flex: initial
, ouflex: none
, tout espace libre positif après que les articles ont été dimensionnés sera distribué également aux articles avecflex: auto
.
http://www.w3.org/TR/2012/CR-css3-flexbox-20120918/#flex-common
il me semble que si vous dites un élément est de 100px de haut, il est traité plus comme une taille" suggéré", pas un absolu. Parce qu'il est permis de rétrécir et de croître, il prend autant d'espace que son permis. C'est pourquoi ajouter cette ligne à votre élément "principal" fonctionne: height: 0
(ou tout autre petit nombre).