CSS горизонтальное центрирование фиксированного div?

#menu {
    position: fixed;
    width: 800px;
    background: rgb(255, 255, 255); /* The Fallback */
    background: rgba(255, 255, 255, 0.8);
    margin-top: 30px;
}

Я знаю, что этот вопрос в миллион раз, но я не могу найти решение для моего дела. У меня есть div, который нужно фиксировать на экране, даже если страница прокручивается, она всегда должна оставаться CENTERED в середине экрана!

У div должна быть ширина 500px, должна быть 30px вдалеке от вершины (верхняя граница), должна быть горизонтально центрирована в середине страницы для всех размеров браузера и не должна перемещаться при прокрутке остальной части страница.

Возможно ли это?

Ответ 1

left: 50%;
margin-left: -400px; /* Half of the width */

Ответ 2

Ответы здесь устарели. Теперь вы можете легко использовать преобразование CSS3 без жесткого кодирования. Это работает на всех элементах, включая элементы без ширины или динамической ширины.

Горизонтальный центр:

left: 50%;
transform: translateX(-50%);

Вертикальный центр:

top: 50%;
transform: translateY(-50%);

Как горизонтальный, так и вертикальный:

left: 50%;
top: 50%;
transform: translate(-50%, -50%);

Совместимость не является проблемой: http://caniuse.com/#feat=transforms2d

Ответ 3

Если использовать встроенные блоки - это вариант, я бы рекомендовал этот подход:

.container { 
    /* fixed position a zero-height full width container */
    position: fixed;
    top: 0; /* or whatever position is desired */
    left: 0;
    right: 0;
    height: 0;
    /* center all inline content */
    text-align: center;
}

.container > div {
    /* make the block inline */
    display: inline-block;
    /* reset container center alignment */
    text-align: left;
} 

Я написал короткую запись об этом здесь: http://salomvary.github.com/position-fixed-horizontally-centered.html

Ответ 4

Редактировать сентябрь 2016 года. Хотя приятно, что по-прежнему иногда получают голосование за это, потому что мир двинулся дальше, я бы пошел с ответом, который использует transform (и у которого есть тонна upvotes). Я больше не буду этого делать.

Другим способом не нужно вычислять запас или нужен субконтейнер:

#menu {
    position: fixed;   /* Take it out of the flow of the document */
    left: 0;           /* Left edge at left for now */
    right: 0;          /* Right edge at right for now, so full width */ 
    top: 30px;         /* Move it down from top of window */
    width: 500px;      /* Give it the desired width */ 
    margin: auto;      /* Center it */
    max-width: 100%;   /* Make it fit window if under 500px */ 
    z-index: 10000;    /* Whatever needed to force to front (1 might do) */
}

Ответ 5

... или вы можете обернуть ваше меню div в другое:

    <div id="wrapper">
       <div id="menu">
       </div>
    </div>


#wrapper{
         width:800px;
         background: rgba(255, 255, 255, 0.8);
         margin:30px auto;
         border:1px solid red;
    }

    #menu{
        position:fixed;
        border:1px solid green;
        width:300px;
        height:30px;
    }

Ответ 6

Можно горизонтально центрировать div таким образом:

HTML:

<div class="container">
    <div class="inner">content</div>
</div>

CSS

.container {
    left: 0;
    right: 0;
    bottom: 0; /* or top: 0, or any needed value */
    position: fixed;
    z-index: 1000; /* or even higher to prevent guarantee overlapping */
}

.inner {
    max-width: 600px; /* just for example */
    margin: 0 auto;
}

Используя этот способ, вы всегда будете иметь свой внутренний центральный блок, к тому же его можно легко превратить в истинную отзывчивость (в примере это будет просто жидкость на меньших экранах), поэтому никаких ограничений, как в примере вопроса, так и в выбранный ответ.

Ответ 7

Здесь другое решение с двумя div. Пытался держать его кратким, а не жестко закодированным. Во-первых, ожидаемый html:

<div id="outer">
  <div id="inner">
    content
  </div>
</div>

Принцип, стоящий за следующим css, заключается в том, чтобы позиционировать какую-либо сторону "внешнего", а затем использовать тот факт, что он предполагает размер "внутреннего" относительно относительно сдвига последнего.

#outer {
  position: fixed;
  left: 50%;          // % of window
}
#inner {
  position: relative;
  left: -50%;         // % of outer (which auto-matches inner width)
}

Этот подход похож на Quentin's, но внутренний может иметь переменный размер.

Ответ 8

Здесь решение flexbox при использовании полноэкранного упаковщика div. Выравнивание по центру выравнивает его дочерний элемент по горизонтали, а выравнивание - по центру.

<div class="full-screen-wrapper">
    <div class="center"> //... content</div>
</div>

.full-screen-wrapper { 
  position: fixed;
  display: flex;
  justify-content: center;
  width: 100vw;
  height: 100vh;
  top: 0;
  align-items: center;
}

.center {
  // your styles
}