Centruję DIV wewnątrz innego DIV za pomocą Flexboksa. Pomyśl o oknie dialogowym, które pojawia się na środku ekranu w razie potrzeby.
Działa dobrze, jednak wyglądałoby to znacznie lepiej, gdyby przestrzeń powyżej i poniżej okna dialogowego nie była dokładnie równa, mając 40% pozostałej przestrzeni powyżej i 60% poniżej okna dialogowego. Jest to trudne, ponieważ wysokość okna dialogowego zmienia się w zależności od ilości tekstu w środku.
Na przykład, jeśli wysokość przeglądarki wynosi 1000 pikseli, a wysokość okna dialogowego wynosi 400 pikseli, chcę, aby pozostała przestrzeń pionowa (600 pikseli) znajdowała się 240 pikseli powyżej i 360 pikseli poniżej okna dialogowego. Mógłbym to zrobić za pomocą Javascript, ale jestem ciekawy, czy istnieje jakiś sprytny sposób z CSS. Próbowałem dodać dolny margines do #dialogBox DIV, ale to nie działa, gdy wysokość okna dialogowego zbliża się do wysokości przeglądarki.
#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>
Odpowiedzi:
Użyj pseudoelementu i kierunku kolumny, aby zasymulować białą przestrzeń. Po prostu dostosuj
flex-grow
pseudoelement, aby kontrolować, ile wolnego miejsca każdy powinien zająć. Równy flex-grow zapewni równe miejsce:Pokaż fragment kodu
Możesz także użyć
2
i3
. Po prostu musimy zachować ten sam stosunek:Pokaż fragment kodu
Innym pomysłem jest użycie najwyższej wartości równej
40%
i skorygowanie pozycji za pomocą translacji (ta sama logika jak50%
przy centrowaniu)źródło
To rozwiązanie wykorzystuje
display: grid
, jest to nowa funkcja, więc sprawdź obsługę przeglądarki i kliknij tutaj, aby dowiedzieć się więcej.Oto linia kontrolująca górne i dolne spacje:
grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
Treść fragmentu tekstu można edytować, aby sprawdzić, czy pole pozostaje wyśrodkowane, nawet jeśli zmienia się wysokość.
źródło
4fr auto 6fr
. To, co masz, działa, ale z pewnym przepełnieniem, ponieważ 40% + 60% + 1fr zawsze będzie większe niż 100% i jesteś centrowany, więc przepełnienie zostanie podzielone równo od góry i dołu: jsfiddle.net/cobutn0e/2 . Zauważysz również, że nie jest to w 100% oczekiwane1fr=minmax(auto,1fr)
i w twoim przypadku spadnie,auto
ponieważ nie ma wolnego miejsca, ponieważ 40% + 60% = 100% (dlatego zawsze będziesz miał przepełnienie)Możesz dodać dzielniki div i ustawić Flex-Grow ze współczynnikiem 4: 6.
źródło
Prosty sposób przy użyciu pozycji i marginesu, przyjąłem, że wysokość okna dialogowego wynosi zawsze 40% wysokości przeglądarki.
HTML
źródło