Tenho um problema quando tento centralizar o bloco div "produtos" porque não conheço antecipadamente a largura do div. Alguém tem uma solução?
Atualização: O problema que tenho é que não sei quantos produtos exibirei, posso ter 1, 2 ou 3 produtos, posso centralizá-los se fosse um número fixo, pois saberia a largura do pai div, eu simplesmente não sei como fazê-lo quando o conteúdo é dinâmico.
.product_container {
text-align: center;
height: 150px;
}
.products {
height: 140px;
text-align: center;
margin: 0 auto;
clear: ccc both;
}
.price {
margin: 6px 2px;
width: 137px;
color: #666;
font-size: 14pt;
font-style: normal;
border: 1px solid #CCC;
background-color: #EFEFEF;
}
<div class="product_container">
<div class="products" id="products">
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
</div>
</div>
Respostas:
Atualização 27 de fevereiro de 2015: Minha resposta original continua sendo votada, mas agora eu normalmente uso a abordagem de @ bobince.
Minha postagem original para fins históricos:
Você pode tentar esta abordagem.
Aqui está o estilo correspondente:
JSFiddle
A idéia aqui é que você contenha o conteúdo que deseja centralizar em duas divs, uma externa e outra interna. Você flutua as duas divs para que suas larguras diminuam automaticamente para se ajustarem ao seu conteúdo. Em seguida, posicione relativamente a div externa com sua borda direita no centro do contêiner. Por fim, você posiciona relativamente a div interna na direção oposta pela metade de sua própria largura (na verdade, a largura da div externa, mas elas são iguais). Em última análise, isso centraliza o conteúdo em qualquer container em que ele esteja.
Você pode precisar dessa div vazia no final se depender do conteúdo do "produto" para dimensionar a altura do "content_container".
fonte
overflow:hidden
para.product_container
oouter-center
div se sobrepõem outros conteúdos próximas para a direita dele. Quaisquer links ou botões à direitaouter-center
não funcionarão. Experimente a cor de fundo paraouter-center
entender a necessidadeoverflow :hidden
. Esta foi uma edição sugerida por Cicil ThomasUm elemento com 'display: block' (como div é por padrão) tem uma largura determinada pela largura do seu contêiner. Você não pode tornar a largura de um bloco dependente da largura de seu conteúdo (encolher para ajustar).
(Exceto pelos blocos que são 'float: left / right' no CSS 2.1, mas isso não serve para centralizar.)
Você pode definir a propriedade 'display' como 'inline-block' para transformar um bloco em um objeto que se ajusta ao tamanho que pode ser controlado pela propriedade de alinhamento de texto do pai, mas o suporte ao navegador é irregular. Você pode se safar usando hacks (por exemplo, consulte -moz-inline-stack) se quiser seguir esse caminho.
O outro caminho a percorrer são as mesas. Isso pode ser necessário quando você tem colunas cuja largura realmente não pode ser conhecida antecipadamente. Eu realmente não sei dizer o que você está tentando fazer com o código de exemplo - não há nada óbvio lá que precisaria de um bloco de ajuste a encaixe - mas uma lista de produtos pode ser considerada tabular.
[PS. nunca use 'pt' para tamanhos de fonte na web. 'px' é mais confiável se você realmente precisar de texto de tamanho fixo; caso contrário, unidades relativas como '%' serão melhores. E "claro: ccc both" - um erro de digitação?]
JSFiddle
fonte
display: inline-block
não é suportado no IE7 e versões mais antigas do FirefoxA maioria dos navegadores suporta a
display: table;
regra CSS. Esse é um bom truque para centralizar uma div em um contêiner sem adicionar HTML extra nem aplicar estilos de restrição ao contêiner (como otext-align: center;
que centralizaria todo o outro conteúdo embutido no contêiner), mantendo a largura dinâmica da div contida:HTML:
CSS:
Mostrar snippet de código
Atualização (09-03-2015):
A maneira correta de fazer isso hoje é realmente usar as regras do flexbox. O suporte ao navegador é um pouco mais restrito ( suporte à tabela CSS vs suporte flexbox ), mas esse método também permite muitas outras coisas e é uma regra CSS dedicada para esse tipo de comportamento:
HTML:
CSS:
Mostrar snippet de código
fonte
display: table;
variante é ideal para pseudoelementos (::before
,::after
) nos quais você não pode adicionar marcação extra e deseja evitar interrupções nos estilos de elementos adjacentes.seis maneiras de esfolar esse gato:
Botão um: qualquer coisa do tipo
display: block
assumirá a largura total dos pais. (a menos que combinado comfloat
um dosdisplay: flex
pais). Verdade. Mau exemplo.Botão 2: a busca
display: inline-block
levará à largura automática (em vez de cheia). Você pode centralizar usandotext-align: center
o bloco de embalagem . Provavelmente o mais fácil e o mais amplamente compatível, mesmo com navegadores 'antigos' ...Botão 3: Não é necessário colocar nada no envoltório. Talvez essa seja a solução mais elegante. Também funciona verticalmente. (O suporte do navegador para transtlate é bom o suficiente (≥IE9) atualmente ...).
Btw: Também é uma ótima maneira de centralizar verticalmente blocos de altura desconhecida (em conexão com o posicionamento absoluto).
Botão 4: posicionamento absoluto. Apenas certifique-se de reservar altura suficiente no wrapper, pois ninguém mais o fará (nem clearfix nem implícito ...)
Botão 5: flutuar (que também traz elementos em nível de bloco para a largura dinâmica) e uma mudança relativa. Embora eu nunca tenha visto isso na natureza. Talvez haja desvantagens ...
Atualização: Botão 6: E hoje em dia, você também pode usar a caixa flexível. Observe que esses estilos se aplicam ao wrapper do objeto centralizado.
→ código fonte completo (sintaxe da caneta)
fonte
Encontrei uma solução mais elegante, combinando "bloco em linha" para evitar o uso de float e o hacky clear: ambos. Ele ainda requer divs tho aninhados, o que não é muito semântico, mas simplesmente funciona ...
Espero que ajude!
fonte
Se o elemento de destino estiver absolutamente posicionado, você poderá centralizá-lo movendo-o 50% em uma direção (
left: 50%
) e depois transformá-lo 50% na direção oposta (transform:translateX(-50%)
). Isso funciona sem definir a largura do elemento de destino (ou comwidth:auto
). A posição do elemento pai pode ser estática, absoluta, relativa ou fixa.fonte
Por padrão, os
div
elementos são exibidos como elementos de bloco e, portanto, têm 100% de largura, tornando-os sem sentido. Conforme sugerido por Arief, você deve especificar aewidth
poderá usá-loauto
ao especificarmargin
para centralizar adiv
.Como alternativa, você também pode forçar
display: inline
, mas terá algo que se comporta como um emspan
vez de umdiv
, para que não faça muito sentido.fonte
Isso centralizará um elemento, como uma Lista ordenada, ou Lista não ordenada, ou qualquer elemento. Apenas envolva-o com um Div com a classe de outerElement e dê ao elemento interno a classe de innerElement.
A classe outerelement é responsável pelo IE, Mozilla antigo e navegadores mais recentes.
fonte
use css3 flexbox com justify-content: center;
fonte
Ligeira variação na resposta de Mike M. Lin
Se você adicionar
overflow: auto;
(ouhidden
) adiv.product_container
, não precisarádiv.clear
.Isso é derivado deste artigo -> http://www.quirksmode.org/css/clearing.html
Aqui está o HTML modificado:
E aqui é CSS modificado:
A razão, porque é melhor sem
div.clear
(além de parecer errado ter um elemento vazio) é a atribuição de margem excessivamente zelosa do Firefox.Se, por exemplo, você tiver este html:
então, no Firefox (8.0 no momento da redação), você verá uma
11px
margem antesproduct_container
. O pior é que você terá uma barra de rolagem vertical para toda a página, mesmo que o conteúdo se encaixe perfeitamente nas dimensões da tela.fonte
Experimente este novo css e marcação
Aqui está o HTML modificado:
E aqui é CSS modificado:
fonte
Se você não fornecer "overflow: hidden" para ".product_container", a div "outer-center" se sobreporá a outros conteúdos próximos à direita. Quaisquer links ou botões à direita do "centro externo" não funcionarão. Experimente a cor de plano de fundo em "centro externo" para entender a necessidade de "estouro: oculto"
fonte
Encontrei uma solução interessante, eu estava fazendo slider e tive que centralizar os controles de slide, fiz isso e funciona bem. Você também pode adicionar uma posição relativa ao pai e mover a posição filho na vertical. Dê uma olhada http://jsfiddle.net/bergb/6DvJz/
CSS:
HTML:
fonte
Faça
display:table;
e definamargin
comoauto
Importante parte do código:
Não importa quantos elementos você tenha agora, ele se alinhará automaticamente no centro
Exemplo no trecho de código:
Mostrar snippet de código
fonte
Receio que a única maneira de fazer isso sem especificar explicitamente a largura seja usar tabelas (gasp).
fonte
Correção ruim, mas funciona ...
CSS:
HTML:
fonte
Correção simples que funciona em navegadores antigos (mas usa tabelas e requer uma altura a ser definida):
fonte
}
use span istead das divs internas
fonte
Eu sei que essa pergunta é antiga, mas estou tentando entender. Muito semelhante à resposta de bobince, mas com um exemplo de código funcional.
Faça de cada produto um bloco embutido. Centralize o conteúdo do recipiente. Feito.
http://jsfiddle.net/rgbk/6Z2Re/
Veja também: Centralize blocos embutidos com largura dinâmica em CSS
fonte
Essa é uma maneira de centralizar qualquer coisa dentro de uma div que não conheça a largura interna dos elementos.
fonte
minha solução foi:
fonte
adicione este css à sua classe product_container
fonte