Пусть у нас есть элемент 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;
}Новые статьи: