Пусть у нас есть элемент div, внутри которого есть другой div:
<div class="box"> <div class="box-content"></div> </div>
Рассмотрим различные способы выравнивания внутреннего блока по центру внешнего в зависимости от исходных данных.
Если у внутреннего и внешнего блока известна ширина, то для внутреннего блока можно вычислить отступы по формуле:
(ширина_внешнего_блока — ширина_внутреннего_блока) / 2
И указать в стилях конкретные значения:
.box { width: 1000px; } .box-content { width: 500px; margin-left: 250px; /* отступ справа вычисляется сам */ }
То же самое возможно использовать и с процентами, ширина внешнего блока при этом принимается за 100%: например, ширина внутреннего блока 60%, значит размер отступов будет равен 20%:
.box-content { width: 60%; margin-left: 20%; }
Если же у внутреннего блока известны размеры отступов, а ширина неизвестна, то достаточно будет указать только отступы, но уже не только слева, а с обеих сторон. В этом случае ширина блока будет вычислена по отступам:
.box-content { margin: 20%; }
Если внутренний блок имеет фиксированную ширину, то чтобы его отцентрировать по горизонтали, достаточно указать отступы справа и слева как auto:
.box-content { width: 500px; margin: 0 auto; }
Если вложенный элемент .box-content является строчным (img, a, span и др.), то для него понадобится указать display:
.box-content { width: 500px; margin: 0 auto; display: block; }
text-align также позволяет выполнить выравнивание по горизонтали, в первую очередь он используется для текста.
Например, в данном случае:
<div class="text-box"> <p>Какой-то текст</p> </div>
Выравнивания по центру можно достичь, указав text-align для .text-box:
.text-box { text-align: center; }
Если у внутреннего блока известна ширина, то можно отцентрировать его по горизонтали при помощи абсолютного позиционирования. В этом случае необходимо сдвинуть блок влево на половину его ширины, чтобы он действительно оказался по центру:
.box { position: relative; } .box-content { position: absolute; left: 50%; width: 500px; margin-left: -250px; }
Если есть блок, в котором размещен текст, занимающий не больше 1 строки (например, кнопка или пункт меню) и известна высота этого блока, то можно задать line-height, равный этой высоте.
Например, для такой структуры:
<div class="menu-item">Пункт меню</div>
Выравнивание по вертикали будет выглядеть следующим образом:
.menu-item { height: 32px; line-height: 32px; }
Вертикальное выравнивание блока делается по аналогии с горизонтальным, однако здесь вместо ширины внутреннего блока нужно знать его высоту, а отступы указывать не слева, а сверху.
.box { position: relative; } .box-content { position: absolute; top: 50%; height: 500px; margin-top: -250px; }
Также можно указать позиции со всех сторон, равные 0, если известны ширина и высота блока, и такой вариант также будет работать:
.box { position: relative; } .box-content { width: 300px; height: 200px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; }
Как известно, в таблицах работает vertical-align для выравнивания их контента по высоте.
<div class="table"> <div class="table-row">Какие-то данные</div> </div>
Если использовать display: table в стилях, то возможно добиться того же:
.table { display: table; width: 100%; } .table-row { height: 80px; display: table-cell; vertical-align: middle; }
CSS3 позволяет выполнять выравнивание буз необходимости добавления внешних блоков. Достаточно иметь один блок:
<div class="box">Какие-то данные</div>
Стили для него будут выглядеть следующим образом, если у него известны высота и ширина:
.box { width: 300px; height: 200px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
Если же размеры блока неизвестны, то внешний блок становится нужен:
<div class="box"> <div class="box-content">Какие-то данные</div> </div>
И стили определяются так:
.box-content { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; }