CSS центр отображения встроенного блока?


207

У меня есть рабочий код здесь: http://jsfiddle.net/WVm5d/ (вам может потребоваться увеличить окно результатов, чтобы увидеть эффект выравнивания по центру)

Вопрос

Код работает нормально, но мне не нравится иметь display: table;. Это единственный способ сделать центр выравнивания по классу wrap. Я думаю, что было бы лучше, если бы был способ использовать display: block;или display: inline-block;. Можно ли решить центр выравнивания по-другому?

Добавление фиксированного с к контейнеру не вариант для меня.

Я также вставлю сюда свой код, если в будущем ссылка JS Fiddle будет разорвана:

body {
    background: #bbb;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: table;
    overflow: hidden;
}

.sidebar {
    width: 200px;
    float: left;
    background: #eee;
}

.container {
    margin: 0 auto;
    background: #ddd;
    display: block;
    float: left;
    padding: 5px;
}

.box {
    background: #eee;
    border: 1px solid #ccc;
    padding: 10px;
    margin: 5px;
    float: left;
}

.box:nth-child(3n+1) {
    clear: left;
}
<div class="wrap">
    <div class="sidebar">
        Sidebar
    </div>
    <div class="container">
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
    </div>
    <div class="sidebar">
        Sidebar
    </div>
</div>

Ответы:


79

Принятое решение не будет работать для меня, так как мне нужен дочерний элемент с display: inline-block горизонтальной и вертикальной центрированием в пределах 100% -ного родителя.

Я использовал Flexbox justify-contentи align-itemsсвойства, которые соответственно позволяют центрировать элементы по горизонтали и вертикали. Установив обаcenter на родительский элемент, дочерний элемент (или даже несколько элементов!) Будет идеально посередине.

Это решение не требует фиксированной ширины, что было бы неприемлемо для меня, поскольку текст моей кнопки изменится.

Вот демонстрация CodePen и фрагмент соответствующего кода ниже:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

.child {
  display: inline-block;
}
<div class="parent">
  <a class="child" href="#0">Button</a>
</div>


1
Этот вопрос был создан до Flexbox, но теперь этот подход лучше, поэтому я принял его как ответ.
Йенс Торнелл

@ JensTörnell использование inline-block бесполезно, в этом случае его можно удалить
Temani Afif

Это намного лучше, чем использование выравнивания текста по центру. Эта реализация просто пропускает центрирование текста ко всем дочерним компонентам. Не делай этого.
Трассировка

266

Попробуй это. Я добавил text-align: centerк телу и display:inline-blockобернуть, а затем удалилdisplay: table

body {
    background: #bbb;
    text-align: center;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: inline-block;
    overflow: hidden;
}

27
@zack divs работает как текст, когда отображается как inline-block. Вы можете использовать такие вещи, как white-space: nowrap;на них тоже.
User2

5
и что, если я не хочу, чтобы ВСЕ мои элементы были помещены в bodyцентр текста? для меня это звучит как огромное излишество
phil294

4
@Blauhirn, просто создайте блок-обертку для элемента inline-block, а затем установите свойство css text-align: center; он использует тег тела в качестве примера.
Арсалан Шейх

71

Если у вас есть <div>с text-align:center;, то любой текст внутри него будет центрирован относительно ширины этого элемента контейнера. inline-blockэлементы рассматриваются как текст для этой цели, поэтому они также будут центрированы.


2
Как насчет отображения: встроенные элементы? Я проверил, что это не работает так, как я ожидаю
geckob

11

Вы также можете сделать это с помощью позиционирования, установить родительский div в относительный и дочерний div в абсолютный.

.wrapper {
      position: relative;
  }
.childDiv {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
  }

1

Вам не нужно использовать «display: table». Причина, по которой ваш запас: 0 попытка автоматического центрирования не работает, заключается в том, что вы не указали ширину.

Это будет работать просто отлично:

.wrap {
    background: #aaa;
    margin: 0 auto;
    width: some width in pixels since it's the container;
}

Вам не нужно указывать display: block, так как этот div будет блокировать по умолчанию. Вы также можете, вероятно, потерять переполнение: скрытый.


1

Подобно ответу @ vijayscode, он будет центрировать горизонтальный элемент inline-block по горизонтали (но без необходимости изменять стили его родителя):

  display: inline-block;
  position: relative;
  left: 50%; // Move the element to the left by 50% of the container's width
  transform: translateX(-50%); // Calculates 50% of the element's width and moves it by that amount across the X-axis to the left

0

Я только что изменил 2 параметра:

.wrap {
    display: block;
    width:661px;
}

Live Demo


8
Установка фиксированного с не является вариантом для меня. Нашел другое решение. Спасибо, в любом случае.
Йенс Торнелл

2
Так что это было?
RichieHH

-6

Отличная статья, которую я нашел, для меня лучше всего было добавить% к размеру

.wrap {
margin-top:5%;
margin-bottom:5%;
height:100%;
display:block;}

-9

Просто используйте:

line-height:50px

Замените "50px" на ту же высоту, что и ваш div.


1
Пожалуйста, будьте более конкретны в том, где добавить line-height.
Марсель Гвердер

Первоначальный вопрос касался горизонтального центрирования, о чем свидетельствует использование text-align: center;. Регулировка высоты строки - это решение для вертикального центрирования, хотя и не очень надежное решение для встроенного блока.
cdaddr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.