CSS: центральный элемент внутри элемента <div>


179

Для центрирования элемента HTML я могу использовать CSS left: 50%;. Однако это центрирует элемент относительно всего окна.

У меня есть элемент, который является дочерним <div>элементом элемента, и я хочу центрировать дочерний элемент относительно этого родителя <div>, а не всего окна.

Я не хочу, чтобы контейнер , <div>чтобы все его содержание по центру, только один конкретный ребенок.

Ответы:


264

Установите text-align:center;родительский div и margin:auto;дочерний div.

#parent {
    text-align:center;
    background-color:blue;
    height:400px;
    width:600px;
}
.block {
    height:100px;
    width:200px;
    text-align:left;
}
.center {
    margin:auto;
    background-color:green;
}
.left {
    margin:auto auto auto 0;
    background-color:red;
}
.right {
    margin:auto 0 auto auto;
    background-color:yellow;
}
<div id="parent">
    <div id="child1" class="block center">
        a block to align center and with text aligned left
    </div>
    <div id="child2" class="block left">
        a block to align left and with text aligned left
    </div>
    <div id="child3" class="block right">
        a block to align right and with text aligned left
    </div>
</div>

Это хороший ресурс, чтобы сосредоточить в основном все, что угодно.
http://howtocenterincss.com/


3
Хм ... Я не хочу, чтобы весь родительский div имел центрированный текст. Хотя это решает проблему, оно создает другое!
Randomblue

3
Вы можете установить выравнивание текста: слева; к дочернему элементу, чтобы текст был правильно выровнен.
Pasine

@pasine text-align, похоже, не работает над <i>элементом. Давать ему класс делает ..
nclsvh

Есть ли способ сделать этот центр элемента как вертикально, так и горизонтально?
Гман Смит

@GmanSmith вы можете использовать display: table-cellили flexboxдля этого. Посмотрите на ссылку, которую я добавил.
Пасине

57

На самом деле это очень просто с CSS3 flex box .

.flex-container{
  display: -webkit-box;  /* OLD - iOS 6-, Safari 3.1-6, BB7 */
  display: -ms-flexbox;  /* TWEENER - IE 10 */
  display: -webkit-flex; /* NEW - Safari 6.1+. iOS 7.1+, BB10 */
  display: flex;         /* NEW, Spec - Firefox, Chrome, Opera */
  
  justify-content: center;
  align-items: center;
  
  width: 400px;
  height: 200px;
  background-color: #3498db;
}

.inner-element{
  width: 100px;
  height: 100px;
  background-color: #f1c40f;
}
<div class="flex-container">
  <div class="inner-element"></div>
</div>

ОБНОВИТЬ:

Кажется, что я не читал редактирование OP в то время, когда я написал этот ответ. Приведенный выше код будет центрировать все внутренние элементы (без наложения между ними), но OP хочет, чтобы центрировался только конкретный элемент , а не другие внутренние элементы. Таким образом, второй метод ответа @Warface более уместен, но все же требует вертикального центрирования:

.flex-container{
  position: relative;
  
  /* Other styling stuff */
  width: 400px;
  height: 200px;
  background-color: #3498db;
}

.inner-element{
  position: absolute;
  left: 50%;
  top: 50%;
  
  transform: translate(-50%,-50%);
  /* or 3d alternative if you will add animations (smoother transitions) */
  transform: translate3d(-50%,-50%,0);

  /* Other styling stuff */
  width: 100px;
  height: 100px;
  background-color: #f1c40f;
}
<div class="flex-container">
  <p>Other inner elements like this follows the normal flow.</p>
  <div class="inner-element"></div>
</div>


11

CSS

  body{
    text-align:center;
    }
    .divWrapper{
    width:960px //Change it the to width of the parent you want
    margin: 0 auto;
    text-align:left;
    }

HTML

<div class="divWrapper">Tada!!</div>

Это должно центрировать div

2016 - метод HTML5 + CSS3

CSS

div#relative{
  position:relative;
}

div#thisDiv{
  position:absolute;
  left:50%;
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
}

HTML

<div id="relative">
  <div id="thisDiv">Bla bla bla</div>
</div>

Fiddledlidle

https://jsfiddle.net/1z7m83dx/


Но это также центрирует все тело, не так ли?
Randomblue

Ну, то, что будет в divWrapper, будет центрировано, да, но вы можете поместить что-то вне этого Div, и это не будет центрировано, если хотите.
Warface

Точная ширина (960 пикселей) не подходит для большинства сценариев.
QMaster

@QMaster Я знаю, что этот пост старый, я должен обновить его, добавив в него силу HTML5
Warface

Здесь есть хорошее объяснение: w3.org/Style/Examples/007/center.en.html
Purplejacket

5

text-align:center; на родительском div должен сделать свое дело


2
Это не текст, который я хотел бы выровнять, а весь элемент (например, кнопка).
Randomblue

1
если он находится в div, он должен выровнять центр, может быть немного сложнее для элементов блока.
Кевин Бауэрсокс

4

Для центрирования только конкретного ребенка:

.parent {
  height: 100px;
  background-color: gray;
  position: relative;
}

.child {
  background-color: white;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  width: 20px;
  height:20px;
  margin: auto;

}
<div class="parent">
   <span class="child">hi</span>
</div>  

ИЛИ, вы также можете использовать flex, но это отразит всех детей

.parent {
  height: 100px;
  background-color: gray;
  display: flex;
  justify-content: center;
  align-items: center;
}

.child {
  background-color: white;  
}
<div class="parent">
   <span class="child">hi</span>
</div>


4

Вы можете использовать загрузочное имя класса flex следующим образом:

<div class="d-flex justify-content-center">
    // the elements you want to center
</div>

Это будет работать даже с количеством элементов внутри.


2

Div это фиксированная ширина или ширина жидкости? В любом случае, для ширины жидкости вы можете использовать:

#element { /* this is the child div */
margin-left:auto;
margin-right:auto;
/* Add remaining styling here */
}

Или вы можете установить родительский div в, text-align:center;а дочерний div вtext-align:left; .

И left:50%;только центрирует его по всей странице, когда div установлен в position:absolute;. Если вы установили для left:50%;него значение div, сделайте это относительно ширины родительского элемента div. Для фиксированной ширины сделайте это:

#parent {
width:500px;
}

#child {
left:50%;
margin-left:-100px;
width:200px;
}


1

Если вы хотите использовать CSS3:

position:absolute;
left:calc(50% - PutTheSizeOfTheHalfOfYourElementpx);

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


0

Прежде всего вы можете сделать это с помощью left: 50%, чтобы отцентрировать его относительно родительского div, но для этого вам нужно изучить CSS позиционирование.

Одним из возможных решений от многих является сделать что-то вроде

    div.parent { text-align:center; }    //will center align every thing in this div as well as in the children element
    div.parent div { text-align:left;}   //to restore so every thing would start from left

если ваш div находится относительно, вы можете просто сделать

    .mydiv { position:relative; margin:0 auto; } 

Я не хочу, чтобы весь родительский div имелtext-align:center;
Randomblue

почему ты не хочешь? В любом случае, в этом случае вы можете использовать второй подход.
Ehtesham

0

Слева: 50% работает с точностью до ближайшего родителя с назначенной статической шириной. Попробуйте ширину: 500 пикселей или что-то на родительском div. В качестве альтернативы, сделайте контент, который вам нужен, по центру дисплея: заблокируйте и установите для левого и правого полей значение auto.


0

Если дочерний элемент является встроенным (например, не a div, и tableт. Д.), Я бы обернул его внутри a divили a pи сделал бы свойство css выравнивания текста обертки равным center.

    <div id="container">
        This text is aligned to the left.<br>
        So is this text.<br>
        <div style="text-align: center">
            This <button>button</button> is centered.
        </div>
        This text is still aligned left.
    </div>

В противном случае, если элемент является блоком ( display: blockнапример, a divили a p) с фиксированной шириной, я бы установил его свойства left и right css на auto.

    <div id="container">
        This text is aligned to the left.<br>
        So is this text.<br>
        <div style="margin: 0 auto; width: 200px; background: red; color: white;">
            My parent is centered.
        </div>
        This text is still aligned left.
    </div>

Конечно, вы можете добавить text-align: centerэлемент обертки, чтобы его содержимое также было центрировано.

Я не буду беспокоиться о позиционировании, потому что ИМХО это не путь для решения проблемы ОП, но не забудьте проверить эту ссылку , очень полезно.


0

Создайте новый элемент div для вашего элемента по центру, затем добавьте класс специально для центрирования этого элемента, например

<div id="myNewElement">
    <div class="centered">
        <input type="button" value="My Centered Button"/>
    </div>
</div>

Css

.centered{
    text-align:center;
}

0

Я нашел другое решение

<style type="text/css">
    .container {
        width:600px; //set how much you want
        overflow: hidden; 
        position: relative;
     }
     .containerSecond{
        position: absolute; 
        top:0px; 
        left:-500%; 
        width:1100%;
     }
     .content{
        width: 800px; //your content size 
        margin:0 auto;
     }           
</style>

и в теле

<div class="container">
   <div class="containerSecond">
       <div class="content"></div>
   </div>
</div>

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



0

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

.статья {

width: whatever;
text-align: center; 
float: whatever (in case you got more articles in a row); 
margin: give it whatever margin you want;

} .статья {

}

/ * внутри статьи я хочу, чтобы изображение было в центре * /

.article img {

float: none;
margin: 0 auto;
padding: give it a padded ridge if you want;

}

/ * Теперь под этим изображением в том же элементе article должна быть кнопка типа read more. Конечно, вам нужно работать с em или%, когда он внутри адаптивного дизайна * /

.button {

background: #whatever color:
padding: 4.3567%; /*Instead of fixed width*/
text-align: cente;
font: whatever;
max-width: 41.4166%;
float: none;
margin: 0 auto; /* You could make the zero into any margin you want on the top and bottom of this button.. Just notice the float: none property.. this wil solve most your issues, also check if maybe position and displaay might mess up your code..*/

}

Удачи


0

Если вы хотите центрировать элементы внутри div и не заботиться о размере деления, вы можете использовать Flex power. Я предпочитаю использовать flex и не использовать точный размер для элементов.

<div class="outer flex">
    <div class="inner">
        This is the inner Content
    </div>
</div>

Как вы можете видеть, Outer div - это контейнер Flex, а Inner должен быть элементом Flex, который указан flex: 1 1 auto;для лучшего понимания, вы можете увидеть этот простой пример. http://jsfiddle.net/QMaster/hC223/

Надеюсь, это поможет.


0

мой хотел бы магии.

html, body {
 height: 100%;
}

.flex-container{
  display: -ms-flexbox;
  display: -webkit-box;
  display: flex;
  -ms-flex-align: center;
  -ms-flex-pack: center;
  -webkit-box-align: center;
  align-items: center;
  -webkit-box-pack: center;
  justify-content: center;
}


<div class="flex-container">
  <div>Content</div>
</div>

0
<html>
<head>
</head>
<style>
  .out{
    width:200px;
    height:200px;
    background-color:yellow;
  }
   .in{
    width:100px;
    height:100px;
    background-color:green;
    margin-top:50%;
    margin-left:50%;
    transform:translate(-50%,50%);
  }
</style>
  <body>
     <div class="out">
     <div class="in">

     </div>
     </div> 
  </body>
</html>

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