Вертикально центр в видовом экране с использованием CSS
Я хочу вертикально центрировать <div>
в окне просмотра (окне браузера), не прибегая к Javascript (только для чистого HTML и CSS). У меня есть несколько ограничений:
- Элемент
div
должен располагаться по вертикали в окне просмотра. Методы, которые я видел, поддерживают только центрирование внутри другого <div>
, чего я не хочу.
- Высота
div
неизвестна.
Другие ограничения:
-
div
должен быть выровнен вправо.
-
div
имеет постоянную ширину.
-
div
должен поддерживать дополнение.
- Другие элементы будут размещены на веб-странице.
div
действует как меню.
- Div должен поддерживать фоновый цвет/изображение.
Это приближает меня к тому, что я хочу, но не совсем:
#nav {
position: fixed;
right: 0;
top: 50%;
}
Однако верхняя часть nav находится в середине, а не в середине навигатора.
Есть ли какой-нибудь метод, который позволяет мне центрировать мой div
с этими ограничениями?
Ответы
Ответ 1
Что это? Взять 8 лет, чтобы получить ответ на проблему слишком много?
Хорошо, лучше поздно, чем никогда!
Вы очень близко подошли к решению. Я бы сделал это с помощью transform: translate()
:
#nav {
position: fixed;
right: 0;
top: 50%;
transform: translateY(-50%);
}
В соответствии с Могу ли я использовать?, он поддерживается всем, кроме IE8- и Opera Mini (что, если честно, является довольно хорошая поддержка).
Я бы порекомендовал вам немного переусердствовать и просто добавить все префиксы поставщика (просто чтобы убедиться!):
#nav {
position: fixed;
right: 0;
top: 50%;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
Вот фрагмент, чтобы показать его вам в действии:
#nav {
right: 0;
top: 50%;
position: fixed;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
background-color: #ccc;
padding: 20px;
}
<div id="nav">
ABC<br/>
DEFGH<br/>
IJKLMNO<br/>
PQRS<br/>
TUVWXYZ
</div>
Ответ 2
вы можете использовать это как одно из решений.
<style>
#containter {
height: 100vh; //vh - viewport height
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
#content {}
</style>
<div id="containter">
<div id="content">
any text<br>
any height<br>
any content, for example generated from DB<br>
everything is vertically centered
</div>
</div>
Ответ 3
Самый простой способ - не использовать div
- использовать table
с одной строкой и одной ячейкой. Вертикальное выравнивание неумолимо не поддерживается в CSS, и вы обнаружите, что находитесь над стеной и потолком, чтобы выполнить ее.
Я понимаю семантический аргумент против того, что я только что предложил - в большинстве случаев я сторонник смысловой разметки. Однако я также верю в использование правильного инструмента для правильной работы. Я считаю, что лучше всего пожертвовать небольшой чистотой в этом случае для простого решения, которое будет работать.
Ответ 4
Если элемент установлен в position: fixed
или position: absolute
:
top: 50%; left: 50%; transform: translate(-50%, -50%)
Если для элемента установлено position: relative
, используйте:
margin-top: 50%; margin-left: 50%; transform: translate(-50%, -50%)
(Подробнее на источнике.)
Пример:
Запустите фрагмент и затем измените размер этой страницы (или поверните устройство). Поле остается по центру в "окне просмотра фрагмента".
.myContainer {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 5px solid RebeccaPurple;
}
.myThing {
width: 100px;
height: 100px;
background-color: CornflowerBlue;
}
<div class="myContainer">
<div class="myThing myContents">
</div>
</div>