Подтвердить что ты не робот

Вертикально центр в видовом экране с использованием CSS

Я хочу вертикально центрировать <div> в окне просмотра (окне браузера), не прибегая к Javascript (только для чистого HTML и CSS). У меня есть несколько ограничений:

  • Элемент div должен располагаться по вертикали в окне просмотра. Методы, которые я видел, поддерживают только центрирование внутри другого <div>, чего я не хочу.
  • Высота div неизвестна.

Другие ограничения:

  • div должен быть выровнен вправо.
  • div имеет постоянную ширину.
  • div должен поддерживать дополнение.
  • Другие элементы будут размещены на веб-странице. div действует как меню.
  • Div должен поддерживать фоновый цвет/изображение.

Это приближает меня к тому, что я хочу, но не совсем:

#nav {
    position: fixed;
    right: 0;
    top: 50%;
}

Однако верхняя часть nav находится в середине, а не в середине навигатора.

Есть ли какой-нибудь метод, который позволяет мне центрировать мой div с этими ограничениями?

4b9b3361

Ответ 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>