Comment puis-je savoir qu'une rangée de mise en page flexbox consomme l'espace vertical restant dans une fenêtre de navigateur?
J'ai une mise en page flexbox sur 3 rangées. Les deux premières lignes ont une hauteur fixe, mais la 3ème est dynamique et je voudrais qu’elle atteigne toute la hauteur du navigateur.
J'ai un autre flexbox dans la ligne 3 qui crée un ensemble de colonnes. Pour ajuster correctement les éléments dans ces colonnes, j'ai besoin qu'ils comprennent toute la hauteur du navigateur - pour des éléments tels que la couleur d'arrière-plan et les alignements d'éléments à la base. La mise en page majeure ressemblerait finalement à ceci:
.vwrapper {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: stretch;
align-content: stretch;
//height: 1000px;
}
.vwrapper #row1 {
background-color: red;
}
.vwrapper #row2 {
background-color: blue;
}
.vwrapper #row3 {
background-color: green;
flex 1 1 auto;
display: flex;
}
.vwrapper #row3 #col1 {
background-color: yellow;
flex 0 0 240px;
}
.vwrapper #row3 #col2 {
background-color: orange;
flex 1 1;
}
.vwrapper #row3 #col3 {
background-color: purple;
flex 0 0 240px;
}
<body>
<div class="vwrapper">
<div id="row1">
this is the header
</div>
<div id="row2">
this is the second line
</div>
<div id="row3">
<div id="col1">
col1
</div>
<div id="col2">
col2
</div>
<div id="col3">
col3
</div>
</div>
</div>
</body>
J'ai essayé d'ajouter un attribut height
, qui fonctionne lorsque je le définit comme un nombre fixe mais pas lorsqu'il est défini sur 100%
. Je comprends que height: 100%
ne fonctionne pas, car le contenu ne remplit pas la fenêtre du navigateur, mais puis-je reproduire l'idée à l'aide de la présentation flexbox?
Vous devez définir height
sur html, body, .wrapper
sur 100%
(pour hériter de la hauteur maximale), puis sur une valeur flex
supérieure à 1
sur .row3
et pas sur les autres.
.wrapper, html, body {
height: 100%;
margin: 0;
}
.wrapper {
display: flex;
flex-direction: column;
}
#row1 {
background-color: red;
}
#row2 {
background-color: blue;
}
#row3 {
background-color: green;
flex:2;
display: flex;
}
#col1 {
background-color: yellow;
flex: 0 0 240px;
}
#col2 {
background-color: orange;
flex: 1 1;
}
#col3 {
background-color: purple;
flex: 0 0 240px;
}
<div class="wrapper">
<div id="row1">this is the header</div>
<div id="row2">this is the second line</div>
<div id="row3">
<div id="col1">col1</div>
<div id="col2">col2</div>
<div id="col3">col3</div>
</div>
</div>
mettre l'emballage à hauteur 100%
.vwrapper {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: stretch;
align-content: stretch;
height: 100%;
}
et réglez la 3ème ligne sur Flex-Grow
#row3 {
background-color: green;
flex: 1 1 auto;
display: flex;
}
Laissez-moi vous montrer une autre méthode qui fonctionne à 100%. Je vais également ajouter un peu de remplissage pour l'exemple.
<div class = "container">
<div class = "flex-pad-x">
<div class = "flex-pad-y">
<div class = "flex-pad-y">
<div class = "flex-grow-y">
Content Centered
</div>
</div>
</div>
</div>
</div>
.container {
position: fixed;
top: 0px;
left: 0px;
bottom: 0px;
right: 0px;
width: 100%;
height: 100%;
}
.flex-pad-x {
padding: 0px 20px;
height: 100%;
display: flex;
}
.flex-pad-y {
padding: 20px 0px;
width: 100%;
display: flex;
flex-direction: column;
}
.flex-grow-y {
flex-grow: 1;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
Comme vous pouvez le constater, nous pouvons atteindre cet objectif avec quelques wrappers pour le contrôle, tout en utilisant l’attribut flex-grow & flex-direction.
1: Lorsque le parent "flex-direction" est une "rangée", son enfant "flex-grow" fonctionne horizontalement. 2: Lorsque le parent "flex-direction" est "colonnes", son enfant "flex-grow" fonctionne verticalement.
J'espère que cela t'aides
Daniel