Как центрировать <div> по горизонтали?
Вопрос
Как я могу горизонтально центрировать <div>
внутри другого <div>
используя CSS?
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Решение
Вы можете применить этот CSS к внутреннему <div>
:
#inner {
width: 50%;
margin: 0 auto;
}
Конечно, вам не обязательно устанавливать width
к 50%
.Любая ширина меньше содержащей <div>
будет работать.А margin: 0 auto
это то, что делает фактическое центрирование.
Если вы ориентируетесь на IE8+, возможно, лучше использовать это:
#inner {
display: table;
margin: 0 auto;
}
Это сделает внутренний элемент центральным по горизонтали и работает без установки определенного значения. width
.
Рабочий пример здесь:
#inner {
display: table;
margin: 0 auto;
border: 1px solid black;
}
#outer {
border: 1px solid red;
width:100%
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Другие советы
Если вы не хотите устанавливать фиксированную ширину на внутренней div
вы могли бы сделать что-то вроде этого:
#outer {
width: 100%;
text-align: center;
}
#inner {
display: inline-block;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Это делает внутренний div
во встроенный элемент, который можно центрировать с помощью text-align
.
Лучшие подходы с CSS 3.
Модель коробки:
#outer {
width: 100%;
/* Firefox */
display: -moz-box;
-moz-box-pack: center;
-moz-box-align: center;
/* Safari and Chrome */
display: -webkit-box;
-webkit-box-pack: center;
-webkit-box-align: center;
/* W3C */
display: box;
box-pack: center;
box-align: center;
}
#inner {
width: 50%;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
В зависимости от вашего удобства вы также можете использовать box-orient, box-flex, box-direction
характеристики.
Гибкий:
#outer {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
Подробнее о центрировании дочерних элементов…
И это объясняет, почему коробочная модель является лучшим подходом:
Предположим, что ваш div 200px
широкий:
.centered {
position: absolute;
left: 50%;
margin-left: -100px;
}
Убедитесь, что родительский элемент расположен то естьотносительный, фиксированный, абсолютный или липкий.
Если вы не знаете ширину своего div, вы можете использовать transform:translateX(-50%);
вместо отрицательной маржи.
Я создал это пример показать, как вертикально и горизонтально align
.
Код в основном такой:
#outer {
position: relative;
}
и...
#inner {
margin: auto;
position: absolute;
left:0;
right: 0;
top: 0;
bottom: 0;
}
и оно останется в center
даже когда ты изменить размер ваш экран.
На некоторых плакатах упоминается способ центрирования CSS 3 с помощью display:box
.
Этот синтаксис устарел и больше не должен использоваться.[Смотрите также эта почта].
Для полноты картины приведем новейший способ центрирования в CSS 3 с помощью Модуль гибкой компоновки коробок.
Итак, если у вас есть простая разметка, например:
<div class="box">
<div class="item1">A</div>
<div class="item2">B</div>
<div class="item3">C</div>
</div>
... и вы хотите центрировать свои элементы внутри блока, вот что вам нужно для родительского элемента (.box):
.box {
display: flex;
flex-wrap: wrap; /* Optional. only if you want the items to wrap */
justify-content: center; /* For horizontal alignment */
align-items: center; /* For vertical alignment */
}
.box {
display: flex;
flex-wrap: wrap;
/* Optional. only if you want the items to wrap */
justify-content: center;
/* For horizontal alignment */
align-items: center;
/* For vertical alignment */
}
* {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
}
.box {
height: 200px;
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
border: 2px solid tomato;
}
.box div {
margin: 0 10px;
width: 100px;
}
.item1 {
height: 50px;
background: pink;
}
.item2 {
background: brown;
height: 100px;
}
.item3 {
height: 150px;
background: orange;
}
<div class="box">
<div class="item1">A</div>
<div class="item2">B</div>
<div class="item3">C</div>
</div>
Если вам нужна поддержка старых браузеров, которые используют старый синтаксис для flexbox вот хорошее место для поиска.
Если вы не хотите устанавливать фиксированную ширину и не хотите иметь дополнительное поле, добавьте display: inline-block
к своей стихии.
Вы можете использовать:
#element {
display: table;
margin: 0 auto;
}
Центрирование div неизвестной высоты и ширины
Горизонтально и вертикально.Он работает с достаточно современными браузерами (Firefox, Safari/WebKit, Chrome, Internet Explorer 10, Opera и т. д.).
.content {
position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
<div class="content">This works with any content</div>
Его нельзя центрировать, если вы не зададите ему ширину, иначе по умолчанию он займет все горизонтальное пространство.
#outer {
width:100%;
height:100%;
display:box;
box-orient:horizontal;
box-pack:center;
box-align:center;
}
Установить width
и установить margin-left
и margin-right
к auto
.Это только для горизонтального, хотя.Если вы хотите оба пути, вы просто сделаете это в обоих направлениях.Не бойтесь экспериментировать;ты ничего не сломаешь.
Недавно мне пришлось центрировать «скрытый» элемент div (т. е. display:none;), внутри которого была табличная форма, которую нужно было центрировать на странице.Я написал следующий jQuery для отображения скрытого элемента div, а затем обновил CSS до автоматически сгенерированной ширины таблицы и изменил поле, чтобы центрировать его.(Переключение отображения срабатывает при нажатии на ссылку, но этот код не требовался для отображения.)
ПРИМЕЧАНИЕ:Я делюсь этим кодом, потому что Google привел меня к этому решению для переполнения стека, и все бы работало, за исключением того, что скрытые элементы не имеют ширины и не могут быть изменены/центрированы до тех пор, пока они не отобразятся.
$(function(){
$('#inner').show().width($('#innerTable').width()).css('margin','0 auto');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="inner" style="display:none;">
<form action="">
<table id="innerTable">
<tr><td>Name:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="submit"></td></tr>
</table>
</form>
</div>
Обычно я это делаю, используя абсолютную позицию:
#inner{
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
Чтобы это работало, внешнему div не нужны никакие дополнительные свойства.
Для Firefox и Chrome:
<div style="width:100%;">
<div style="width: 50%; margin: 0px auto;">Text</div>
</div>
Для Internet Explorer, Firefox и Chrome:
<div style="width:100%; text-align:center;">
<div style="width: 50%; margin: 0px auto; text-align:left;">Text</div>
</div>
А text-align:
Свойство является необязательным для современных браузеров, но оно необходимо в режиме совместимости Internet Explorer для поддержки устаревших браузеров.
Это мой ответ.
#outerDiv {
width: 500px;
}
#innerDiv {
width: 200px;
margin: 0 auto;
}
<div id="outerDiv">
<div id="innerDiv">Inner Content</div>
</div>
Другое решение этой проблемы без необходимости устанавливать ширину для одного из элементов — использовать CSS 3. transform
атрибут.
#outer {
position: relative;
}
#inner {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
Хитрость в том, что translateX(-50%)
устанавливает #inner
элемент на 50 процентов левее своей ширины.Вы можете использовать тот же трюк для вертикального выравнивания.
Вот скрипка показывая горизонтальное и вертикальное выравнивание.
Дополнительная информация находится на Сеть разработчиков Mozilla.
Крис Койер, написавший отличный пост о «Центрировании в неизвестном» в своем блоге.Это обзор нескольких решений.Я опубликовал тот, которого нет в этом вопросе.У него больше поддержки браузера, чем у решения flexbox, и вы не используете display: table;
что может сломать другие вещи.
/* This parent can be any width and height */
.outer {
text-align: center;
}
/* The ghost, nudged to maintain perfect centering */
.outer:before {
content: '.';
display: inline-block;
height: 100%;
vertical-align: middle;
width:0;
overflow:hidden;
}
/* The element to be centered, can
also be of any width and height */
.inner {
display: inline-block;
vertical-align: middle;
width: 300px;
}
Я понимаю, что довольно поздно вошел в игру, но это очень популярный вопрос, и недавно я нашел подход, о котором нигде здесь не упоминал, поэтому решил задокументировать его.
#outer {
position: absolute;
left: 50%;
}
#inner {
position: relative;
left: -50%;
}
РЕДАКТИРОВАТЬ:для правильной работы оба элемента должны иметь одинаковую ширину.
Например, см. эта ссылка и фрагмент ниже:
div#outer {
height: 120px;
background-color: red;
}
div#inner {
width: 50%;
height: 100%;
background-color: green;
margin: 0 auto;
text-align: center; /* For text alignment to center horizontally. */
line-height: 120px; /* For text alignment to center vertically. */
}
<div id="outer" style="width:100%;">
<div id="inner">Foo foo</div>
</div>
Если у вас много детей от родителя, ваш CSS-контент должен быть таким пример на скрипке.
HTML-контент выглядит следующим образом:
<div id="outer" style="width:100%;">
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> Foo Text </div>
</div>
Тогда посмотри это пример на скрипке.
Центрирование только по горизонтали
По моему опыту, лучший способ центрировать блок по горизонтали — применить следующие свойства:
Контейнер:
- должен иметь
text-align: center;
Поле содержимого:
- должен иметь
display: inline-block;
Демо:
.container {
width: 100%;
height: 120px;
background: #CCC;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="container">
<div class="centered-content">
Center this!
</div>
</div>
Смотрите также эта скрипка!
Центрирование как по горизонтали, так и по вертикали
По моему опыту, лучший способ центрировать коробку оба вертикально и горизонтально — использовать дополнительный контейнер и применить следующие свойства:
Внешний контейнер:
- должен иметь
display: table;
Внутренний контейнер:
- должен иметь
display: table-cell;
- должен иметь
vertical-align: middle;
- должен иметь
text-align: center;
Поле содержимого:
- должен иметь
display: inline-block;
Демо:
.outer-container {
display: table;
width: 100%;
height: 120px;
background: #CCC;
}
.inner-container {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="outer-container">
<div class="inner-container">
<div class="centered-content">
Center this!
</div>
</div>
</div>
Смотрите также эта скрипка!
Самый простой способ:
#outer {
width: 100%;
text-align: center;
}
#inner {
margin: auto;
width: 200px;
}
<div id="outer">
<div id="inner">Blabla</div>
</div>
Если ширина содержимого неизвестна, вы можете использовать следующий метод.Предположим, у нас есть эти два элемента:
.outer
-- полная ширина.inner
-- ширина не задана (но можно указать максимальную ширину)
Предположим, что вычисленная ширина элементов равна 1000 пикселей и 300 пикселей соответственно.Действуйте следующим образом:
- Сворачивать
.inner
внутри.center-helper
- Делать
.center-helper
встроенный блок;он становится такого же размера, как.inner
сделав его шириной 300 пикселей. - Толкать
.center-helper
50% прав относительно своего родителя;это помещает его лево на 500 пикселей относительно.внешний. - Толкать
.inner
50% осталось относительно родителя;это помещает его левое значение на -150 пикселей относительно.центральный помощник, что означает, что его левая сторона находится на расстоянии 500–150 = 350 пикселей относительно нее.внешний. - Включить переполнение
.outer
чтобы скрыть, чтобы предотвратить горизонтальную полосу прокрутки.
Демо:
body {
font: medium sans-serif;
}
.outer {
overflow: hidden;
background-color: papayawhip;
}
.center-helper {
display: inline-block;
position: relative;
left: 50%;
background-color: burlywood;
}
.inner {
display: inline-block;
position: relative;
left: -50%;
background-color: wheat;
}
<div class="outer">
<div class="center-helper">
<div class="inner">
<h1>A div with no defined width</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Duis condimentum sem non turpis consectetur blandit.<br>
Donec dictum risus id orci ornare tempor.<br>
Proin pharetra augue a lorem elementum molestie.<br>
Nunc nec justo sit amet nisi tempor viverra sit amet a ipsum.</p>
</div>
</div>
</div>
.outer {
overflow: hidden;
}
.center-helper {
float: left;
position: relative;
left: 50%;
}
.inner {
float: left;
position: relative;
left: -50%;
}
Вы можете сделать что-то вроде этого
#container {
display: table;
width: <width of your container>;
height: <height of your container>;
}
#inner {
width: <width of your center div>;
display: table-cell;
margin: 0 auto;
text-align: center;
vertical-align: middle;
}
Это также позволит согласовать #inner
вертикально.Если не хотите, удалите display
и vertical-align
характеристики;
Вот что вы хотите кратчайшим путем.
#outer {
margin - top: 100 px;
height: 500 px; /* you can set whatever you want */
border: 1 px solid# ccc;
}
#inner {
border: 1 px solid# f00;
position: relative;
top: 50 % ;
transform: translateY(-50 % );
}
Выравнивание текста:центр
Применение text-align: center
встроенное содержимое центрируется внутри линейного поля.Однако, поскольку внутренний div по умолчанию имеет width: 100%
вам необходимо установить определенную ширину или использовать одно из следующих действий:
#inner {
display: inline-block;
}
#outer {
text-align: center;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Допуск:0 авто
С использованием margin: 0 auto
это еще один вариант, который больше подходит для совместимости со старыми браузерами.Он работает вместе с display: table
.
#inner {
display: table;
margin: 0 auto;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Флексбокс
display: flex
ведет себя как блочный элемент и размещает свое содержимое в соответствии с моделью flexbox.Это работает с justify-content: center
.
Пожалуйста, обрати внимание: Flexbox совместим с большинством браузеров, но не со всеми.Видеть здесь для получения полного и актуального списка совместимости браузеров.
#inner {
display: inline-block;
}
#outer {
display: flex;
justify-content: center;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Трансформировать
transform: translate
позволяет изменять координатное пространство модели визуального форматирования CSS.С его помощью элементы можно перемещать, вращать, масштабировать и наклонять.Для центрирования по горизонтали требуется position: absolute
и left: 50%
.
#inner {
position: absolute;
left: 50%;
transform: translate(-50%, 0%);
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
<center>
(Устарело)
Тег <center>
является HTML-альтернативой text-align: center
.Она работает в старых браузерах и в большинстве новых, но это не считается хорошей практикой, поскольку эта функция устаревший и был удален из веб-стандартов.
#inner {
display: inline-block;
}
<div id="outer">
<center>
<div id="inner">Foo foo</div>
</center>
</div>
Вы можете использовать display: flex
для вашего внешнего div и для горизонтального центрирования вам нужно добавить justify-content: center
#outer{
display: flex;
justify-content: center;
}
или вы можете посетить w3schools — гибкое свойство CSS для получения дополнительных идей.
Этот метод также работает отлично:
div.container {
display: flex;
justify-content: center; /* for horizontal alignment */
align-items: center; /* for vertical alignment */
}
Для внутреннего <div>
, единственным условием является то, что его height
и width
не должен быть больше размеров контейнера.
Flex поддерживается более чем 97% браузеров и может быть лучшим способом решить подобные проблемы с помощью нескольких строк:
#outer {
display: flex;
justify-content: center;
}
Что ж, мне удалось найти решение, которое, возможно, подойдет для всех ситуаций, но использует JavaScript:
Вот структура:
<div class="container">
<div class="content">Your content goes here!</div>
<div class="content">Your content goes here!</div>
<div class="content">Your content goes here!</div>
</div>
А вот фрагмент JavaScript:
$(document).ready(function() {
$('.container .content').each( function() {
container = $(this).closest('.container');
content = $(this);
containerHeight = container.height();
contentHeight = content.height();
margin = (containerHeight - contentHeight) / 2;
content.css('margin-top', margin);
})
});
Если вы хотите использовать его в адаптивном подходе, вы можете добавить следующее:
$(window).resize(function() {
$('.container .content').each( function() {
container = $(this).closest('.container');
content = $(this);
containerHeight = container.height();
contentHeight = content.height();
margin = (containerHeight - contentHeight) / 2;
content.css('margin-top', margin);
})
});
Существовал один вариант, который я нашел:
Все говорят, что нужно использовать:
margin: auto 0;
Но есть и другой вариант.Установите это свойство для родительского элемента div.Он работает отлично в любое время:
text-align: center;
И смотрите, ребенок идет по центру.
И, наконец, CSS для вас:
#outer{
text-align: center;
display: block; /* Or inline-block - base on your need */
}
#inner
{
position: relative;
margin: 0 auto; /* It is good to be */
}