Горизонтальне центрування CSS нерухомого діва?


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

Я знаю, що це питання мільйон разів, але я не можу знайти рішення своєї справи. У мене є div, який повинен бути зафіксований на екрані, навіть якщо сторінка прокручується, вона завжди повинна залишатися ЦЕНТРОВАНО в середині екрану!

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

Це можливо?


Дивіться також stackoverflow.com/questions/17069435/…
e2-e4

Відповіді:


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

25
він не працює за призначенням під час зміни розміру вікна браузера.

3
@Bahodir: Ви впевнені? Мені це здається правильним щодо розміру. Я думаю, це -400пов’язано з шириною дива, який встановлюється 800.
Мерлін Морган-Грехем

1
@PrestonBadeer - Як і те, про яке задається питання?
Квентін

3
Повністю згоден - це НЕ рішення! Ніколи не важко кодуйте щось таким чином. -1
Нейт I

3
Я проголосував за це НЕ тому, що це була погана відповідь за його день - це була хороша відповідь, а тому, що більше не є, і наступна найвища відповідь потребує всієї допомоги, яку вона може отримати, щоб вважати найкращою відповіддю ЗАРАЗ. Квентін: Я думаю, що було б непогано відредагувати коментар до цього ефекту у самій відповіді - я б тоді змінив свій голос проти.
Нік Райс

547

Відповіді тут застарілі. Тепер ви можете легко використовувати перетворення CSS3 без жорсткого кодування поля . Це працює на всіх елементах, включаючи елементи без ширини чи динамічної ширини.

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

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

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

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

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

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

Сумісність не є проблемою: http://caniuse.com/#feat=transforms2d


86
+1 Ця відповідь демонструє проблему з stackoverflow: Старі відповіді, які були хорошими для їхнього дня та були прийняті правильно, можуть гордо сидіти на вершині, створюючи враження, що вони все-таки підходять, тоді як чудові відповіді для нового світу, як цей, повинні поборотися проти шансів.
Нік Райс

10
@NickRice 100% погодився. Ця відповідь має бути новою прийнятою відповіддю. Молодші розробники не повинні бачити навіть прийняту відповідь!
Нейт I

2
@matt, будь ласка, прийміть це замість цього. Прокрутіть далеко, щоб довго це побачити.
ssbb

4
Це робить ефекти розмиття в тіні поля в елементах вмісту.
раб

4
Так, Chrome неправильно розмиває вміст, який трансформується. Текст також розмитий. Але це єдине рішення мати фіксований елемент в центрі без жорсткого кодування та використання елементів обгортки. Якщо ви не переймаєтесь подіями вказівника фону, ви можете досягти такого ж ефекту, використовуючи повну екранову обгортку та флексбокс, або рішення @ salomvary нижче.
Maciej Krawczyk

58

Якщо використання вбудованих блоків є варіантом, я рекомендую такий підхід:

.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's center alignment */
    text-align: left;
} 

Я написав короткий пост про це тут: http://salomvary.github.com/position-fixed-horizontally-centered.html


1
10 разів, це спрацювало для мене без необхідності жорсткого кодування будь-яких чисел widthчи чогось іншого - на відміну від @Quentins відповіді
@Quentins Yatharth Agarwal

30

Редагувати вересень 2016 року: Хоча приємно все-таки отримувати періодичне голосування за це, оскільки світ просунувся, я б зараз пішов з відповіддю, що використовує трансформацію (і яка має цілу суму грошей). Я б більше не робив цього.

Ще один спосіб не потрібно обчислювати маржу або потрібен підконтейнер:

#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) */
}

@Joey Що робить нижня частина: 0? тобто для чого це потрібно? (Минув час, коли я на це подивився!)
Нік Райс

bottom:0забезпечив би меню завжди вертикально по центру, але я бачу, що це не те, про що вимагала ОП. :)
Йорданія H

Я спробував використати це в іншому контексті, бачив, що це не центр у FF, якщо висота елементів більша за висоту вікна (вікно перегляду)
Philipp Werminghausen

Оскільки світ пішов далі, я б зараз пішов з відповіддю, що використовує перетворення. (Я робив цей коментар раніше, посилаючись на ім’я, яке використовував відповідач, - але вони змінили це ім'я, щоб мій коментар більше не мав сенсу, і я його видалив. Просто шукайте на цій сторінці для трансформації.)
Нік Райс

7

Можна горизонтально центрувати діл таким чином:

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;
}

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


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;
    }

5

Ось ще одне рішення з двома дівами. Намагався тримати його лаконічним і не жорстким. По-перше, очікуваний 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)
}

Такий підхід схожий на Квентін, але внутрішній може мати різний розмір.


-1

Ось рішення для флешбоксу при використанні повнорозмірного обгорткового диві. виправдати контент-центри, це дочірнє ділення по горизонталі та вирівняти елементи, розташовуючи його по вертикалі.

<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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.