Центр фіксованого div з динамічною шириною (CSS)


89

У мене є div, який матиме такий CSS:

#some_kind_of_popup
{
    position: fixed;
    top: 100px;
    min-height: 300px;
    width: 90%;
    max-width: 900px;
}

Тепер, як я можу зробити цей центр по центру? Я можу використовувати, margin-left: -450px; left: 50%;але це буде працювати лише тоді, коли екран> 900 пікселів. Після цього (коли вікно <900 пікселів) воно більше не буде центруватися.

Звичайно, я можу зробити це за допомогою якогось js, але чи є "правильніше" робити це за допомогою CSS?


4
@Liam - я не згоден, я думаю, що це питання є відвертим саме по собі. Ці запитання не дають відповіді на це стосовно того, що div не має фіксованої ширини по центру.
Джошуа М

Те, що сказав Джошуа, це для того, щоб відцентрувати div в іншому.
gubbfett

7
@Liam - Крім того, ви не можете використовувати a margin: 0 autoна position: fixeddiv. Ви навіть читали питання?
Джошуа М

^ ні. я теж спробував це. : p
gubbfett

3
@JoshuaM Ваше твердження невірно на 100%. Дивіться мою відповідь.
laconbass

Відповіді:


223

Ви можете відцентрувати параметр fixedабо absoluteпозиціонований елемент rightі leftдо 0, а потім margin-left& margin-rightдо autoтак, ніби ви центруєте staticпозиціонований елемент.

#example {
    position: fixed;
    /* center the element */
    right: 0;
    left: 0;
    margin-right: auto;
    margin-left: auto;
    /* give it dimensions */
    min-height: 10em;
    width: 90%;
}

Дивіться цей приклад роботи над цією скрипкою .


1
Зазначу лише ... Це не так несподівано, але в IE7 це не вдається. Він розташований 0px зліва тут. Це ідеально працює в IE 8.
gubbfett

Це не працює, коли ширина елемента більша за ширину екрана .. було б непогано, щоб він працював у такій ситуації.
andrewb

1
@andrewb, ви можете застосувати настільки ж негативне поле як до, так rightі leftпринаймні value >= witdth / 2, як це видно на jsfiddle.net/PvfFy/168 , але це не елегантний підхід IMHO. Я тестував його на хромі для розваги, не знаю, чи спрацює на решту
laconbass

5
Поза сферою питання це залежить від встановлення ширини елемента, тому не чудово, якщо у вас є динамічний вміст, ширина якого змінюється або невідома. Залишаючи центрування осторонь, я зазвичай роблю це з display: inline-block та без встановленої ширини. Хтось має рішення no-js для цього випадку?
загадка

4
Питання говорить про динамічну ширину , це вся проблема, ви не можете просто ігнорувати це.
Гіл Епштейн,

54

Ось ще один метод, якщо ви можете безпечно використовувати transformвластивість CSS3 :

.fixed-horizontal-center
{
    position: fixed;
    top: 100px; /* or whatever top you need */
    left: 50%;
    width: auto;
    -webkit-transform: translateX(-50%);
    -moz-transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    -o-transform: translateX(-50%);
    transform: translateX(-50%);
}

... або якщо ви хочете як горизонтальне, так і вертикальне центрування:

.fixed-center
{
    position: fixed;
    top: 50%;
    left: 50%;
    width: auto;
    height: auto;
    -webkit-transform: translate(-50%,-50%);
    -moz-transform: translate(-50%,-50%);
    -ms-transform: translate(-50%,-50%);
    -o-transform: translate(-50%,-50%);
    transform: translate(-50%,-50%);
}

5
Поки це стосується сучасного браузера, це КРАЩЕ рішення у цій відповіді! Єдиний, схожий на справжній `float: center ', оскільки ви можете клацати навколо обгортаючого елемента і не застрягати, коли вам доведеться рибалити навколо нього. Люблю цю відповідь!
SpYk3HH

1
Обережно, не використовуйте переклад у відсотках для центрування тексту, оскільки він буде згладжений, якщо отримане значення буде плаваючим. Хо хлопче, ти цього не хочеш, ні не хочеш.
gnou

Використання перетворень CSS може спричинити згладжування не лише тексту; В результаті трансформації я отримую прикольні кордони.
Nathan K

1
Можливість скоротити контракт при зміні розміру екрану (залежно від розміру дивізіону), що призводить до великих кордонів навколо краю дивізіону.
Single Entity,

7
<div id="container">
    <div id="some_kind_of_popup">
        center me
    </div>
</div>

Вам потрібно буде загорнути його в контейнер. ось css

#container{
    position: fixed;
    top: 100px;
    width: 100%;
    text-align: center;
}
#some_kind_of_popup{
    display:inline-block;
    width: 90%;
    max-width: 900px;  
    min-height: 300px;  
}

Ах, мені подобається ваше мислення. Виправлений div буде лише контейнером для іншого div з фактичним результатом? Я спробую це!
gubbfett

Хоча мені подобається інтуїтивність вашої відповіді, я не розумію, як це дозволить підтримку ie6 / 7.
Метью Берг

1
@MathewBerg, хороший момент щодо ie6 / 7. У цьому випадку ваша відповідь повинна працювати найкраще. Це трохи заповіту, але особисто я думаю, що розробники не повинні витрачати час на виправлення матеріалів для <= ie7. Я думаю, що насправді розробники повинні блокувати ці браузери, щоб змусити людей та компанії зі старими системами оновити. Наскільки важко продати цю ідею клієнту, який платить! ;)
gubbfett

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

1
це також не працює, оскільки ви все ще не можете перейти через "контейнер"
SpYk3HH,

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