Tengo un problema cuando intento centrar los "productos" del bloque div porque no conozco de antemano el ancho del div. ¿Alguien tiene una solución?
Actualización: el problema que tengo es que no sé cuántos productos mostraré, puedo tener 1, 2 o 3 productos, puedo centrarlos si fuera un número fijo ya que sabría el ancho del padre div, simplemente no sé cómo hacerlo cuando el contenido es 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>
Respuestas:
Actualización 27 de febrero de 2015: mi respuesta original sigue siendo votada, pero ahora normalmente uso el enfoque de @bobince.
Mi publicación original para fines históricos:
Es posible que desee probar este enfoque.
Aquí está el estilo a juego:
JSFiddle
La idea aquí es que contiene el contenido que desea centrar en dos divs, uno externo y uno interno. Flota ambos divs para que sus anchos se reduzcan automáticamente para adaptarse a su contenido. Luego, colocas relativamente el div externo con su borde derecho en el centro del contenedor. Por último, colocas relativamente el div interno en la dirección opuesta por la mitad de su propio ancho (en realidad, el ancho del div externo, pero son iguales). En última instancia, eso centra el contenido en cualquier contenedor en el que se encuentre.
Es posible que necesite ese div vacío al final si depende del contenido de su "producto" para dimensionar la altura del "contenedor_producto".
fuente
overflow:hidden
para.product_container
elouter-center
div se solapará otros contenidos cercanos a la derecha de la misma. Cualquier enlace o botón a la derechaouter-center
no funcionará. Pruebe el color de fondo paraouter-center
comprender la necesidadoverflow :hidden
. Esta fue una edición sugerida por Cicil ThomasUn elemento con 'display: block' (como div es por defecto) tiene un ancho determinado por el ancho de su contenedor. No puede hacer que el ancho de un bloque dependa del ancho de su contenido (reducir para ajustar).
(Excepto para los bloques que son 'flotante: izquierda / derecha' en CSS 2.1, pero eso no sirve para centrar).
Puede establecer la propiedad 'display' en 'inline-block' para convertir un bloque en un objeto que se ajuste para que se pueda controlar mediante la propiedad de alineación de texto de su padre, pero el soporte del navegador es irregular. En su mayoría, puede salirse con la suya utilizando hacks (por ejemplo, ver -moz-inline-stack) si desea seguir ese camino.
La otra manera de ir es tablas. Esto puede ser necesario cuando tiene columnas cuyo ancho realmente no se puede conocer de antemano. Realmente no puedo decir qué está tratando de hacer con el código de ejemplo: no hay nada obvio allí que necesite un bloque de contracción, pero una lista de productos podría considerarse tabular.
[PD. nunca use 'pt' para tamaños de fuente en la web. 'px' es más confiable si realmente necesita texto de tamaño fijo, de lo contrario, las unidades relativas como '%' son mejores. Y "claro: ccc ambos": ¿un error tipográfico?]
JSFiddle
fuente
display: inline-block
no es compatible con IE7 y versiones anteriores de FirefoxLa mayoría de los navegadores admiten la
display: table;
regla CSS. Este es un buen truco para centrar un div en un contenedor sin agregar HTML adicional ni aplicar estilos de restricción al contenedor (como eltext-align: center;
que centraría el resto del contenido en línea en el contenedor), mientras se mantiene el ancho dinámico para el div contenido:HTML:
CSS:
Mostrar fragmento de código
Actualización (2015-03-09):
La forma correcta de hacer esto hoy es usar reglas de flexbox. El soporte del navegador es un poco más restringido ( soporte de tabla CSS frente a soporte de flexbox ) pero este método también permite muchas otras cosas, y es una regla CSS dedicada para este tipo de comportamiento:
HTML:
CSS:
Mostrar fragmento de código
fuente
display: table;
variante es ideal para pseudo-elementos (::before
,::after
) donde no puede agregar marcas adicionales y desea evitar la interrupción de los estilos de elementos adyacentes.seis formas de pelar a ese gato:
Botón uno: cualquier cosa de tipo
display: block
asumirá el ancho completo de los padres. (a menos que se combine confloat
o undisplay: flex
padre). Cierto. Mal ejemplo.Botón 2: ir a
display: inline-block
conducirá a un ancho automático (en lugar de completo). Luego puede centrarse usandotext-align: center
en el bloque de envoltura . Probablemente el más fácil y más compatible, incluso con navegadores 'vintage' ...Botón 3: no es necesario poner nada en la envoltura. Quizás esta sea la solución más elegante. También funciona verticalmente. (La compatibilidad del navegador para la traducción es lo suficientemente buena (≥IE9) en estos días ...).
Por cierto: también es una excelente manera de centrar verticalmente bloques de altura desconocida (en relación con el posicionamiento absoluto).
Botón 4: posicionamiento absoluto. Solo asegúrese de reservar suficiente altura en el contenedor, ya que nadie más lo hará (ni clearfix ni implícito ...)
Botón 5: flotante (que también trae elementos de nivel de bloque al ancho dinámico) y un cambio relativo. Aunque he nunca visto esto en la naturaleza. Quizás hay desventajas ...
Actualizar: Botón 6: Y hoy en día, también puedes usar flex-box. Tenga en cuenta que los estilos se aplican al contenedor del objeto centrado.
→ código fuente completo (sintaxis del lápiz)
fuente
Encontré una solución más elegante, combinando "bloque en línea" para evitar el uso de flotante y hacky clear: ambos. Todavía requiere divs anidados, que no es muy semántico, pero simplemente funciona ...
¡Espero eso ayude!
fuente
Si el elemento objetivo está absolutamente posicionado, puede centrarlo moviéndolo 50% en una dirección (
left: 50%
) y luego transformándolo 50% en la dirección de oposición (transform:translateX(-50%)
). Esto funciona sin definir el ancho del elemento de destino (o conwidth:auto
). La posición del elemento padre puede ser estática, absoluta, relativa o fija.fuente
Por defecto, los
div
elementos se muestran como elementos de bloque, por lo que tienen un ancho del 100%, por lo que centrarlos no tiene sentido. Según lo sugerido por Arief, debe especificar aywidth
luego puede usarloauto
al especificarmargin
para centrar adiv
.Alternativamente, también podría forzar
display: inline
, pero entonces tendría algo que se comportaría como un enspan
lugar de undiv
, por lo que no tiene mucho sentido.fuente
Esto centrará un elemento como una Lista ordenada, o Lista no ordenada, o cualquier elemento. Simplemente envuélvelo con un Div con la clase de innerElement y dale al elemento interno la clase de innerElement.
La clase outerelement representa IE, el antiguo Mozilla y la mayoría de los navegadores más nuevos.
fuente
use css3 flexbox con justify-content: center;
fuente
Ligera variación en la respuesta de Mike M. Lin
Si agrega
overflow: auto;
(ohidden
) adiv.product_container
, entonces no necesitadiv.clear
.Esto se deriva de este artículo -> http://www.quirksmode.org/css/clearing.html
Aquí está HTML modificado:
Y aquí está CSS modificado:
La razón, por qué es mejor sin
div.clear
(aparte de que se siente mal tener un elemento vacío) es la asignación de margen excesivamente celosa de Firefox.Si, por ejemplo, tienes este html:
luego, en Firefox (8.0 en el punto de escritura), verá
11px
margen antesproduct_container
. Lo peor es que obtendrá una barra de desplazamiento vertical para toda la página, incluso si el contenido se ajusta perfectamente a las dimensiones de la pantalla.fuente
Prueba este nuevo CSS y marcado
Aquí está HTML modificado:
Y aquí está CSS modificado:
fuente
Si no proporciona "desbordamiento: oculto" para ".product_container", el div "centro exterior" se superpondrá a otros contenidos cercanos a la derecha del mismo. Cualquier enlace o botón a la derecha del "centro exterior" no funcionará. Pruebe el color de fondo para "centro exterior" para comprender la necesidad de "desbordamiento: oculto"
fuente
Encontré una solución interesante, estaba haciendo un control deslizante y tuve que centrar los controles deslizantes e hice esto y funciona bien. También puede agregar una posición relativa al padre y mover la posición del niño vertical. Echar un vistazo http://jsfiddle.net/bergb/6DvJz/
CSS:
HTML:
fuente
Hacer
display:table;
y configurarmargin
aauto
Bit de código importante:
No importa cuántos elementos tenga ahora, se alineará automáticamente en el centro
Ejemplo en fragmento de código:
Mostrar fragmento de código
fuente
Me temo que la única forma de hacerlo sin especificar explícitamente el ancho es usar tablas (jadeo).
fuente
Arreglo horrible, pero funciona ...
CSS:
HTML:
fuente
Solución simple que funciona en navegadores antiguos (pero usa tablas y requiere una altura para ser establecida):
fuente
}
use span en lugar de los divs internos
fuente
Sé que esta pregunta es antigua, pero me estoy rindiendo. Muy similar a la respuesta de bobince pero con un ejemplo de código de trabajo.
Haga de cada producto un bloque en línea. Centrar el contenido del contenedor. Hecho.
http://jsfiddle.net/rgbk/6Z2Re/
Ver también: Centrar bloques en línea con ancho dinámico en CSS
fuente
Esta es una forma de centrar cualquier cosa dentro de un div sin conocer el ancho interno de los elementos.
fuente
mi solución fue:
fuente
agregue este CSS a su clase product_container
fuente