Como centralizar div absoluta horizontalmente usando CSS?

177

Eu tenho uma div e quero que ela seja centralizada horizontalmente - embora eu esteja dando a ela margin:0 auto;que não é centralizada ...

.container {
    position: absolute;
    top: 15px;
    z-index: 2;
    width:40%;
    max-width: 960px;
    min-width: 600px;
    height: 60px;
    overflow: hidden;
    background: #fff; 
    margin:0 auto;
}
CoreDo
fonte
Possível duplicata de Como centralizar o elemento absolutamente posicionado em div?
precisa saber é o seguinte
@LoganMzz não é porque essa questão tem sua largura conhecida.
Davbog 6/07/19

Respostas:

408

Você precisa definir left: 0e right: 0.

Isso especifica até que ponto as bordas da margem serão deslocadas dos lados da janela.

Como 'top', mas especifica até que ponto a margem direita da caixa é deslocada para a [esquerda / direita] da borda [direita / esquerda] do bloco que contém a caixa.

Fonte: http://www.w3.org/TR/CSS2/visuren.html#position-props

Nota: O elemento deve ter uma largura menor que a janela ou ocupará toda a largura da janela.

Se você pudesse usar consultas de mídia para especificar uma margem mínima e fazer a transição para autotamanhos de tela maiores.


.container {
  left:0;
  right:0;

  margin-left: auto;
  margin-right: auto;

  position: absolute;
  width: 40%;

  outline: 1px solid black;
  background: white;
}
<div class="container">
  Donec ullamcorper nulla non metus auctor fringilla.
  Maecenas faucibus mollis interdum.
  Sed posuere consectetur est at lobortis.
  Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.
  Sed posuere consectetur est at lobortis.
</div>

thgaskell
fonte
38
Nota: widthé imperdível!
Ijas Ameenudeen
2
Sim. Isso está correto ... usando um "alinhamento de texto: centro;" e um "left: 0; right: 0;" permitirá a posição absoluta de uma div, mantendo-a centralizada horizontalmente.
Sterling Bourne
3
@ AlexG Acabei de carregar o violino no IE11 e funciona. Você pode esclarecer?
Brian Webster
1
@AlexG funciona no IE11, no entanto, não funcionará se você não declarar uma largura . Eu tive o mesmo problema. Você precisa usar uma largura, como mostrado no exemplo.
Panama Jack
1
também necessária margin: autopara que ele funcione no nosso caso
Crashalot
124

Isso não funciona no IE8, mas pode ser uma opção a considerar. É principalmente útil se você não deseja especificar uma largura.

.element
{
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
}
Adel
fonte
Provavelmente isso dependeria dos requisitos de seu projeto.
Kris Selbekk
3
Nesse momento, também seria necessário haver uma regra com um prefixo -webkit- para que ele funcionasse no Safari.
21715 Shikkediel
Infelizmente, de alguma forma, aplica a transparência da div circundante também ao texto dentro
dela
1
Esta é definitivamente a resposta. Para mim, ter uma largura definida especificamente é absolutamente impossível.
Mike
14

Embora as respostas acima estejam corretas, mas para simplificar para iniciantes, tudo o que você precisa fazer é definir margem, esquerda e direita. o código a seguir fará isso, desde que a largura esteja definida e a posição seja absoluta:

margin: 0 auto;
left: 0;
right: 0;

Demo:

.centeredBox {
    margin: 0 auto;
    left: 0;
    right: 0;
   
   
   /** Position should be absolute */
    position: absolute;
    /** And box must have a width, any width */
    width: 40%;
    background: #faebd7;
   
   }
<div class="centeredBox">Centered Box</div>

Meta Pakistani
fonte
1
Isso funcionou perfeito para imagens absolutos em uma fileira de colunas de bootstrap
ZachNag
5

Flexbox? Você pode usar o flexbox.

.box {
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  
  -webkit-justify-content: center;
  justify-content: center;

}

.box div {
  border:1px solid grey;
  flex: 0 1 auto;
  align-self: auto;
  background: grey;
}
<div class="box">
  <div class="A">I'm horizontally centered.</div>
</div>

Ronnie Royston
fonte
Isso realmente funcionou muito bem para o meu caso único. left: 0; right: 0;estendido para 100%, o que não era uma opção, pois o elemento filho tinha uma cor de fundo e left: 50%; transform: translateY(-50%);não funcionou porque isso restringia o filho a 50% de largura. Essa foi a única solução que preservou as dimensões flexíveis da criança (limitada apenas ao suporte ao navegador). Obrigado!
Ben Dyer
3
.centerDiv {
    position: absolute;
    left: 0;
    right: 0;
    margin: 0 auto;
    text-align:center;
}
Z. Rahman Raju
fonte
0

Aqui está um link, use-o para fazer a div no centro, se a posição for absoluta.

HTML:

<div class="bar"></div>

CSS:

.bar{
  width:200px;
  border-top:4px solid red;
  position:absolute;
  margin-left:auto;
  margin-right:auto;
  left:0;
  right:0;
}

Exemplo jsfiddle

Amit Kumar
fonte
-1

Você não pode usar margin:auto;em position:absolute;elementos, basta removê-lo se você não precisa dele, no entanto, se você fizer isso, você poderia usar left:30%;((100% -40%) / 2) e consultas de mídia para os valores máximo e mínimo:

.container {
    position: absolute;
    top: 15px;
    left: 30%;
    z-index: 2;
    width:40%;
    height: 60px;
    overflow: hidden;
    background: #fff;
}

@media all and (min-width:960px) {

    .container {
        left: 50%;
        margin-left:-480px;
        width: 960px;
    }

}

@media all and (max-width:600px) {

    .container {
        left: 50%;
        margin-left:-300px;
        width: 600px;
    }

}
Leonard Pauli
fonte