CSS: elemento central dentro de um elemento <div>

178

Para centralizar um elemento HTML, posso usar o CSS left: 50%;. No entanto, isso centraliza o elemento em relação a toda a janela.

Eu tenho um elemento que é filho de um <div>elemento e quero centralizar o filho em relação a esse pai <div>, não a janela inteira.

Não quero que o contêiner <div>tenha todo o seu conteúdo centralizado, apenas um filho específico.

Randomblue
fonte

Respostas:

264

Defina text-align:center;como div principal e margin:auto;div secundário.

#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>

Este é um bom recurso para centralizar quase tudo.
http://howtocenterincss.com/

pasine
fonte
3
Hum ... Eu não quero que toda a div pai tenha o texto centralizado. Embora isso resolva o problema, ele cria outro!
Randomblue
3
você pode definir o alinhamento do texto: esquerda; ao elemento filho, para ter o texto alinhado corretamente.
24511 pasine
@pasine text-alignparece não funcionar em um <i>elemento. Dando uma aula ...
nclsvh 16/01
existe uma maneira de tornar esse centro o elemento tanto vertical quanto horizontalmente?
Gman Smith
@GmanSmith você pode usar display: table-cellou flexboxpara isso. Dê uma olhada no link que eu adicionei.
pasine
57

Na verdade, isso é muito simples com as caixas flexíveis CSS3 .

.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>

ATUALIZAR:

Parece que não li a edição do OP no momento em que escrevi esta resposta. O código acima centralizará todos os elementos internos (sem sobreposição entre eles), mas o OP deseja que apenas um elemento específico seja centralizado , não os outros elementos internos. Portanto, o segundo método de resposta do @Warface é mais adequado, mas ainda exige centralização vertical:

.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>

Gerard Reches
fonte
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>

Isso deve centralizar a div

2016 - método 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/

Warface
fonte
Mas também centra todo o corpo, não é?
Randomblue
Bem, o que estará no divWrapper será centralizado sim, mas você pode colocar algo fora desse Div e não será centralizado, se desejar.
Warface
A largura exata (960px) não é adequada para a maioria dos cenários.
Qmaster
@QMaster Eu sei que este post é antigo, devo atualizá-lo com o poder do HTML5 nele #
Warface
Há uma boa explicação aqui: w3.org/Style/Examples/007/center.en.html
Purplejacket
5

text-align:center; na div dos pais Deve fazer o truque

Kevin Bowersox
fonte
2
Não é o texto que eu gostaria de alinhar, é todo o elemento (por exemplo, um botão).
Randomblue
1
se estiver na div, deve alinhar o centro, pode ser um pouco mais complicado para os elementos do bloco.
precisa
4

Para centralizar apenas o filho específico:

.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>  

OU, você também pode usar o flex, mas isso centralizaria todas as crianças

.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>

Ayan
fonte
4

Você pode usar o nome da classe flex de auto-inicialização assim:

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

Isso funcionará mesmo com o número de elementos internos.

Romi Erez
fonte
2

A div tem uma largura fixa ou uma largura de fluido? De qualquer maneira, para a largura do fluido, você pode usar:

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

Ou você pode definir o div pai para text-align:center;e o filho div paratext-align:left; .

E left:50%;apenas o centraliza de acordo com a página inteira quando o div está definido como position:absolute;. Se você definir o div left:50%;, deve fazê-lo em relação à largura do div principal. Para largura fixa, faça o seguinte:

#parent {
width:500px;
}

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

basta dar ao pai div position: relative

stephenmurdoch
fonte
1

Se você deseja usar CSS3:

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

Você pode querer fazer pesquisas adicionais para descobrir como obter a porcentagem que se ajusta à largura do seu elemento.

user3178128
fonte
0

Primeiro, você pode fazer isso com a esquerda: 50% para centralizá-la em relação à div pai, mas para isso você precisa aprender o posicionamento CSS.

Uma solução possível de muitos é fazer algo como

    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

Se seu div estiver centrado, você pode posicionar-se relativamente, basta fazer

    .mydiv { position:relative; margin:0 auto; } 
Ehtesham
fonte
Eu não quero que toda a div pai tertext-align:center;
Randomblue
por que você não quer? De qualquer forma, nesse caso, você poderia usar a segunda abordagem.
Ehtesham
0

esquerda: 50% trabalha ressecamente com o pai mais próximo com a largura estática atribuída. Experimente a largura: 500 px ou algo na div principal. Como alternativa, torne o conteúdo que você precisa para centralizar a exibição: bloqueie e defina as margens esquerda e direita como automáticas.

Bardt
fonte
0

Se o elemento filho estiver embutido (por exemplo, não um div, tableetc), eu o envolveria dentro de um divou a pe faria o texto do wrapper alinhar a propriedade css igual ao centro.

    <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>

Caso contrário, se o elemento for um bloco ( display: blockpor exemplo, a divou a p) com uma largura fixa, eu definiria suas margens e propriedades css esquerda e direita como 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>

Obviamente, você pode adicionar um text-align: centerao elemento wrapper para tornar seu conteúdo centralizado também.

Não vou me preocupar com o posicionamento, porque o IMHO não é o caminho a seguir para o problema dos OPs, mas verifique este link , muito útil.

Spyros
fonte
0

Crie um novo elemento div para o seu elemento centralizar e, em seguida, adicione uma classe especificamente para centralizar esse elemento como este

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

Css

.centered{
    text-align:center;
}
Squeeky91
fonte
0

Eu encontrei outra solução

<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>

e no corpo

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

Isso centralizará sua divisão de conteúdo sempre que seu contêiner for maior ou menor. Nesse caso, seu conteúdo deve ser maior que 1100% do contêiner para não ser centralizado, mas, nesse caso, você pode tornar o contêinerSecond maior e funcionará

Ruben
fonte
0

Atribua text-align: center;ao pai e display: inline-block;ao div.

koulikoff
fonte
0

por exemplo, eu tenho uma div de artigo que está dentro de uma div de conteúdo principal. Dentro do artigo há uma imagem e abaixo dessa imagem há um botão, estilo como este:

.article {

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

} .article {

}

/ * dentro do artigo, quero a imagem centralizada * /

.article img {

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

}

/ * Agora, nesta imagem, no mesmo elemento do artigo, deve haver um botão como leia mais Claro que você precisa trabalhar com em ou% quando estiver dentro de um design responsivo * /

.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..*/

}

Boa sorte

Hylke
fonte
0

Se você deseja centralizar elementos dentro de uma div e não se importa com o tamanho da divisão, use o Flex power. Eu prefiro usar flex e não uso tamanho exato para elementos.

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

Como você pode ver, a div externa é o contêiner Flex e o interno deve ser o item Flex especificado com flex: 1 1 auto;para entender melhor que você pode ver esta amostra simples. http://jsfiddle.net/QMaster/hC223/

Espero que esta ajuda.

QMaster
fonte
0

o meu gostaria de mágica.

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>
Azizi Musa
fonte
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>
SooRaj Patil
fonte
O código é sempre bom, mas também ajuda a adicionar alguns comentários / contexto sobre como isso aborda a questão original.
craigcaulfield