Je centre un DIV à l'intérieur d'un autre DIV à l'aide d'un flexbox. Pensez à une fenêtre de dialogue qui apparaît au centre de l'écran en cas de besoin.
Cela fonctionne bien, mais il serait beaucoup mieux si l'espace au-dessus et en dessous de la boîte de dialogue n'était pas exactement égal, avec 40% de l'espace restant au-dessus et 60% en dessous de la boîte de dialogue. Cela devient difficile car la hauteur de la boîte de dialogue varie avec la quantité de texte à l'intérieur.
Ainsi, par exemple, si la hauteur du navigateur est de 1000 px et la hauteur de la fenêtre de dialogue est de 400 px, je veux que l'espace vertical restant (600 px) soit 240 px au-dessus et 360 px en dessous de la boîte de dialogue. Je pourrais le faire avec Javascript, mais je suis curieux de savoir s'il existe un moyen intelligent avec CSS. J'ai essayé d'ajouter une marge inférieure à la DIV #dialogBox, mais cela ne fonctionne pas lorsque la hauteur de la boîte de dialogue approche de la hauteur du navigateur.
#dialogBoxPanel
{
position:absolute;
display:flex;
align-items:center;
justify-content:center;
left:0px;
top:0px;
width:100%;
height:100%;
}
#dialogBox
{
width:350px;
}
<div id="dialogBoxPanel">
<div id="dialogBox">Text</div>
</div>
Réponses:
Utilisez le pseudo-élément et la direction de la colonne pour simuler l'espace blanc. Ajustez simplement
flex-grow
le pseudo-élément pour contrôler la quantité d'espace libre que chacun devrait prendre. Une flex-grow égale donnera un espace égal:Afficher l'extrait de code
Vous pouvez également utiliser
2
et3
. Nous devons simplement garder le même ratio:Afficher l'extrait de code
Une autre idée est d'utiliser une valeur supérieure égale à
40%
et de rectifier la position avec translate (même logique que50%
lors du centrage)la source
Cette solution utilise
display: grid
, c'est une nouvelle fonctionnalité alors assurez-vous de vérifier la prise en charge du navigateur et cliquez ici pour en savoir plus.C'est la ligne qui contrôle les espaces supérieurs et inférieurs:
grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
Le contenu du texte d'extrait peut être modifié pour que vous puissiez vérifier que la case reste centrée même si la hauteur change.
la source
4fr auto 6fr
. Ce que vous avez fonctionne mais avec un débordement puisque 40% + 60% + 1fr sera toujours plus grand que 100% et vous vous centrez donc le débordement sera divisé également en haut et en bas: jsfiddle.net/cobutn0e/2 . Vous remarquerez également que ce n'est pas à 100% comme prévu1fr=minmax(auto,1fr)
et dans votre cas, il tomberaauto
car il n'y a pas d'espace libre car 40% + 60% = 100% (c'est pourquoi vous aurez toujours un débordement)Vous pouvez ajouter des diviseurs d'espacement et définir la flex-croissance avec un rapport 4: 6.
la source
De manière simple en utilisant la position et la marge, j'ai supposé que la hauteur de votre dialogue est toujours de 40% de la hauteur du navigateur.
HTML
la source