Центр фіксованого 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.