Как я могу горизонтально центрировать <div>
внутри другого, <div>
используя CSS?
<div id="outer">
<div id="inner">Foo foo</div>
</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
то, что делает фактическое центрирование.
Если вы ориентируетесь на Internet Explorer 8 (и более поздние версии), возможно, лучше иметь это вместо этого:
#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>
margin-left: auto; margin-right: auto
я думаю.
margin:0 auto
: это может быть margin: <whatever_vertical_margin_you_need> auto
второй горизонтальный край.
Если вы не хотите устанавливать фиксированную ширину внутри, div
вы можете сделать что-то вроде этого:
#outer {
width: 100%;
text-align: center;
}
#inner {
display: inline-block;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Это превращает внутреннее div
в линейный элемент, с которым можно центрировать text-align
.
float: none;
и, вероятно, необходим только потому, что #inner унаследовал один float
из left
или right
где-то еще в вашем CSS.
text-align
так что вы можете захотеть установить внутренние - х text-align
до initial
или другое значение.
Лучшие подходы с 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
свойства.
Flex :
#outer {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
И это объясняет, почему блочная модель является лучшим подходом :
-webkit
флагов для flexbox ( display: -webkit-flex;
и -webkit-align-items: center;
и -webkit-justify-content: center;
)
Предположим, что ваш div имеет ширину 200 пикселей:
.centered {
position: absolute;
left: 50%;
margin-left: -100px;
}
Убедитесь , что родительский элемент позиционируется , т.е. относительное, фиксированное, абсолютное, или липким.
Если вы не знаете ширину вашего div, вы можете использовать transform:translateX(-50%);
вместо отрицательного поля.
https://jsfiddle.net/gjvfxxdj/
С помощью CSS calc () код может стать еще проще:
.centered {
width: 200px;
position: absolute;
left: calc(50% - 100px);
}
Принцип все тот же; положите предмет посередине и компенсируйте ширину.
Я создал этот пример, чтобы показать, как вертикально и горизонтально align
.
Код в основном это:
#outer {
position: relative;
}
а также...
#inner {
margin: auto;
position: absolute;
left:0;
right: 0;
top: 0;
bottom: 0;
}
И он останется center
даже при изменении размера экрана.
Некоторые авторы упоминают CSS 3 способ использования по центру display:box
.
Этот синтаксис устарел и больше не должен использоваться. [Смотрите также этот пост] .
Так что для полноты изложения здесь представлен новейший способ центрирования в CSS 3 с использованием модуля Flexible Box Layout .
Так что если у вас есть простая разметка, как:
<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 */
}
Если вам нужно поддерживать старые браузеры, которые используют более старый синтаксис для flexbox , то это хорошее место для поиска.
flex-direction
значения. Если это «строка» (по умолчанию) - тогда justify-content: center;
для горизонтального выравнивания (как я упоминал в ответе) Если это «столбец» - тогда justify-content: center;
для вертикального выравнивания.
Если вы не хотите устанавливать фиксированную ширину и не хотите дополнительного поля, добавьте display: inline-block
к своему элементу.
Ты можешь использовать:
#element {
display: table;
margin: 0 auto;
}
display: table;
. Что оно делает?
По горизонтали и вертикали. Он работает с достаточно современными браузерами (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>
Он не может быть центрирован, если вы не дадите ему ширину. В противном случае по умолчанию он займет все горизонтальное пространство.
width: fit-content;
и margin: 0 auto
. Я думаю, что это может работать с неизвестной шириной.
#outer {
width: 100%;
height: 100%;
display: box;
box-orient: horizontal;
box-pack: center;
box-align: center;
}
Установите width
и установите margin-left
и margin-right
в auto
. Это только для горизонтального , хотя. Если вы хотите оба пути, вы просто сделаете это обоими способами. Не бойся экспериментировать; это не значит, что ты что-то сломаешь.
Недавно мне пришлось display:none;
центрировать «скрытый» div (то есть ), который имел внутри себя табличную форму, которую нужно было центрировать на странице. Я написал следующий код 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>
Другое решение для этого без необходимости устанавливать ширину для одного из элементов - это использование transform
атрибута CSS 3 .
#outer {
position: relative;
}
#inner {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
Хитрость в том, что элемент translateX(-50%)
устанавливается на #inner
50 процентов слева от его собственной ширины. Вы можете использовать тот же трюк для вертикального выравнивания.
Вот Скрипка, показывающая горизонтальное и вертикальное выравнивание.
Более подробная информация о Mozilla Developer Network .
-webkit-transform: translate(-50%,0); -moz-transform: translate(-50%,0); -ms-transform: translate(-50%,0); -khtml-transform: translate(-50%,0); -o-transform: translate(-50%,0);
Крис Койер, который написал отличный пост на тему «Сосредоточение в неизвестном» в своем блоге. Это сводка нескольких решений. Я опубликовал тот, который не опубликован в этом вопросе. Он имеет больше поддержки браузера, чем решение 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%;
}
Оба элемента должны иметь одинаковую ширину для правильного функционирования.
#inner
только: #inner { position:relative; left:50%; transform:translateX(-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
не нужно, так width:100%;
как <div>
по умолчанию всегда есть width:100%
. и text-align:center
также не является необходимым вообще.
Если ширина содержимого неизвестна, вы можете использовать следующий метод . Предположим, у нас есть эти два элемента:
.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>
Вы можете сделать что-то вроде этого
#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%
вы должны установить определенную ширину или использовать один из следующих:
Использование margin: 0 auto
- это еще один вариант, и он больше подходит для совместимости со старыми браузерами. Это работает вместе с display: table
.
display: flex
ведет себя как блочный элемент и размещает его содержимое в соответствии с моделью flexbox. Это работает с justify-content: center
.
Обратите внимание: Flexbox совместим с большинством браузеров, но не со всеми. Смотрите здесь полный и обновленный список совместимости браузеров.
transform: translate
позволяет изменить координатное пространство модели визуального форматирования CSS. Используя его, элементы могут быть переведены, повернуты, масштабированы и перекошены. Для центрирования по горизонтали требуется position: absolute
и left: 50%
.
<center>
(Осуждаемый)Тег <center>
является альтернативой HTML text-align: center
. Он работает в старых браузерах и большинстве новых, но не считается хорошей практикой, поскольку эта функция устарела и была удалена из веб-стандартов.
Вы можете использовать display: flex
для вашего внешнего div и горизонтального центра вы должны добавитьjustify-content: center
#outer{
display: flex;
justify-content: center;
}
или вы можете посетить w3schools - CSS flex Property, чтобы получить больше идей.
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);
})
});
Этот метод также отлично работает:
div.container {
display: flex;
justify-content: center; /* For horizontal alignment */
align-items: center; /* For vertical alignment */
}
Для внутреннего <div>
единственного условия является то, что он height
и width
не должен быть больше, чем у его контейнера.
Существовал один вариант, который я нашел:
Все говорят, чтобы использовать:
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 */
}