Tengo un diseño similar a:
<div>
<table>
</table>
</div>
Me gustaría que el div
solo se expanda tanto como table
sea posible.
Tengo un diseño similar a:
<div>
<table>
</table>
</div>
Me gustaría que el div
solo se expanda tanto como table
sea posible.
Respuestas:
La solución es configurar su div
a display: inline-block
.
span
o una div
o ul
cualquier otra cosa, la parte importante es que el contenedor que le gustaría tener un ancho mínimo tenga la propiedad CSSdisplay: inline-block
display: inline-block
configurado la propiedad margin: 0 auto;
, no funcionará como se esperaba. En ese caso, si el contenedor principal tiene, text-align: center;
entonces el inline-block
elemento estará centrado horizontalmente.
inline-block
NO funcionó para mí, pero sí inline-flex
.
Desea un elemento de bloque que tenga lo que CSS llama ancho de contracción y la especificación no proporciona una forma bendecida de obtener tal cosa. En CSS2, reducir para ajustar no es un objetivo, sino que significa lidiar con una situación en la que el navegador "tiene" que obtener un ancho de la nada. Esas situaciones son:
cuando no hay ancho especificado. Escuché que piensan en agregar lo que quieres en CSS3. Por ahora, hazte con uno de los anteriores.
La decisión de no exponer la función directamente puede parecer extraña, pero hay una buena razón. Es caro. Reducir para ajustar significa formatear al menos dos veces: no puede comenzar a formatear un elemento hasta que sepa su ancho, y no puede calcular el ancho sin pasar por todo el contenido. Además, no se necesita un elemento de contracción tan a menudo como se pueda pensar. ¿Por qué necesitas div extra alrededor de tu mesa? Tal vez el título de la tabla es todo lo que necesitas.
inline-block
es exactamente para esto y resuelve el problema perfectamente.
content-box, max-content, min-content, available, fit-content, auto
fit-content
palabra clave (que no existía cuando se escribió esta respuesta por primera vez, y aún no es totalmente compatible ) le permite aplicar explícitamente el tamaño de "reducir para ajustar" a un elemento, eliminando la necesidad de cualquiera de los hacks sugeridos aquí si está tiene la suerte de solo apuntar a los navegadores con soporte. +1 no obstante; estos siguen siendo útiles por ahora!
float
Hice lo que necesitaba hacer!
Creo que usando
display: inline-block;
funcionaría, sin embargo, no estoy seguro de la compatibilidad del navegador.
Otra solución sería envolverlo div
en otro div
(si desea mantener el comportamiento de bloqueo):
HTML:
<div>
<div class="yourdiv">
content
</div>
</div>
CSS:
.yourdiv
{
display: inline;
}
*display: inline; *zoom: 1;
. No he probado esta situación en particular, pero siempre he encontrado en el pasado que el hack hasLayout solo es necesario para IE7, o IE8 en modo IE7 (¡o IE8 en peculiaridades!).
inline-block
habilitado en IE 7.
display: inline-block
agrega un margen extra a su elemento.
Yo recomendaría esto:
#element {
display: table; /* IE8+ and all other modern browsers */
}
Bonificación: ahora también puede centrar fácilmente esa nueva fantasía #element
simplemente agregando margin: 0 auto
.
position: absolute
Es necesario un comentario condicional para <IE8.
display: inline-block
no agrega ningún margen. Pero CSS maneja espacios en blanco que se mostrarán entre elementos en línea.
position: absolute
Puedes probar fit-content
(CSS3):
div {
width: fit-content;
/* To adjust the height as well */
height: fit-content;
}
Lo que funciona para mí es:
display: table;
en el div
. (Probado en Firefox y Google Chrome ).
border-collapse: separate;
estilo. Es predeterminado en muchos navegadores, pero a menudo los marcos css como bootstrap restablecen su valor a collapse
.
Hay dos mejores soluciones
display: inline-block;
O
display: table;
De estos dos display:table;
es mejor, porque display: inline-block;
agrega un margen extra.
Para display:inline-block;
que pueda utilizar el método de margen negativo para arreglar el espacio extra
display:table
es mejor?
display:table
deja el elemento en el contexto de formato de Bloque, para que pueda controlar su posición con márgenes, etc., como de costumbre. display:-inline-*
, por otro lado, coloca el elemento en contexto de formato en línea, haciendo que el navegador cree el contenedor de bloques anónimo a su alrededor, que contiene el cuadro de línea con la configuración heredada de fuente / altura de línea, e inserta el bloque en ese cuadro de línea (alineando verticalmente por línea de base por defecto). Esto implica más "magia" y, por lo tanto, posibles sorpresas.
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
Foo Hack - Soporte de navegador cruzado para estilo de bloque en línea (2007-11-19) .
-moz-inline-stack
Sin saber en qué contexto esta aparecerá, pero creo que el establecimiento de estilo CSS float
, ya sea left
o right
tendrá este efecto. Por otro lado, también tendrá otros efectos secundarios, como permitir que el texto flote a su alrededor.
Sin embargo, corríjame si estoy equivocado, no estoy 100% seguro y actualmente no puedo probarlo yo mismo.
La respuesta a su pregunta está en el futuro, mi amigo ...
a saber, "intrínseco" viene con la última actualización de CSS3
width: intrinsic;
desafortunadamente IE está atrasado con él, así que aún no lo admite
Más información al respecto: CSS Intrinsic & Extrinsic Sizing Module Level 3 y ¿puedo usarlo? : Dimensionamiento intrínseco y extrínseco .
Por ahora tienes que estar satisfecho <span>
o <div>
configurado
display: inline-block;
intrinsic
como un valor no es estándar. De hecho lo es width: max-content
. Vea la página MDN sobre eso o el borrador ya vinculado.
Una solución compatible con CSS2 es usar:
.my-div
{
min-width: 100px;
}
También puede flotar su div, lo que lo forzará lo más pequeño posible, pero necesitará usar una corrección clara si algo dentro de su div está flotando:
.my-div
{
float: left;
}
width:1px;
white-space: nowrap;
funciona bien para mí :)
De acuerdo, en muchos casos, incluso no es necesario hacer nada, ya que por defecto div lo ha hecho height
y width
como automático, pero si no es tu caso, aplicar la inline-block
pantalla funcionará para ti ... mira el código que creo para ti y listo Qué estás buscando:
div {
display: inline-block;
}
<div>
<table>
<tr>
<td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
<td>Nunc auctor aliquam est ac viverra. Sed enim nisi, feugiat sed accumsan eu, convallis eget felis. Pellentesque consequat eu leo nec pharetra. Aenean interdum enim dapibus diam.</td>
<td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
</tr>
</table>
</div>
Esto se ha mencionado en los comentarios y es difícil de encontrar en una de las respuestas:
Si está usando display: flex
por cualquier razón, puede usar:
div {
display: inline-flex;
}
Esto también es ampliamente compatible en todos los navegadores.
display: flex;
Puede usar inline-block
como @ user473598, pero tenga cuidado con los navegadores más antiguos.
/* Your're working with */
display: inline-block;
/* For IE 7 */
zoom: 1;
*display: inline;
/* For Mozilla Firefox < 3.0 */
display:-moz-inline-stack;
Mozilla no admite bloqueo en línea en absoluto, pero tienen lo -moz-inline-stack
que es casi lo mismo
Algunos inline-block
atributos de visualización alrededor del navegador :
https://css-tricks.com/snippets/css/cross-browser-inline-block/
Puede ver algunas pruebas con este atributo en: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/
inline-block
desde 3.0 (2008). Fuente: developer.mozilla.org/en-US/docs/Web/CSS/…
Simplemente ponga un estilo en su archivo CSS
div {
width: fit-content;
}
-moz-fit-content
para FF, presumiblemente los otros prefijos de proveedor permitirán su propio ...
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<div id="content_lalala">
this content inside the div being inside a table, needs no inline properties and the table is the one expanding to the content of this div =)
</div>
</td>
</tr>
</table>
Sé que a la gente no le gustan las tablas a veces, pero debo decirte que probé los hacks en línea css, y funcionaron en algunos divs pero en otros no, así que, en realidad, fue más fácil encerrar el div en expansión una tabla ... y ... puede tener o no la propiedad en línea y aún así la tabla es la que va a contener el ancho total del contenido. =)
Una demostración de trabajo está aquí
.floating-box {
display:-moz-inline-stack;
display: inline-block;
width: fit-content;
height: fit-content;
width: 150px;
height: 75px;
margin: 10px;
border: 3px solid #73AD21;
}
<h2>The Way is using inline-block</h2>
Supporting elements are also added in CSS.
<div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
</div>
Mi solución CSS3 flexbox en dos sabores: el de arriba se comporta como un tramo y el de abajo se comporta como un div, tomando todo el ancho con la ayuda de un contenedor. Sus clases son "top", "bottom" y "bottomwrapper" respectivamente.
body {
font-family: sans-serif;
}
.top {
display: -webkit-inline-flex;
display: inline-flex;
}
.top, .bottom {
background-color: #3F3;
border: 2px solid #FA6;
}
/* bottomwrapper will take the rest of the width */
.bottomwrapper {
display: -webkit-flex;
display: flex;
}
table {
border-collapse: collapse;
}
table, th, td {
width: 280px;
border: 1px solid #666;
}
th {
background-color: #282;
color: #FFF;
}
td {
color: #444;
}
th, td {
padding: 0 4px 0 4px;
}
Is this
<div class="top">
<table>
<tr>
<th>OS</th>
<th>Version</th>
</tr>
<tr>
<td>OpenBSD</td>
<td>5.7</td>
</tr>
<tr>
<td>Windows</td>
<td>Please upgrade to 10!</td>
</tr>
</table>
</div>
what you are looking for?
<br>
Or may be...
<div class="bottomwrapper">
<div class="bottom">
<table>
<tr>
<th>OS</th>
<th>Version</th>
</tr>
<tr>
<td>OpenBSD</td>
<td>5.7</td>
</tr>
<tr>
<td>Windows</td>
<td>Please upgrade to 10!</td>
</tr>
</table>
</div>
</div>
this is what you are looking for.
display: inline-flex;
. Por cierto, esto funciona sin prefijo para Chrome 62, Firefox 57 y Safari 11
<div class="parentDiv" style="display:inline-block">
// HTML elements
</div>
Esto hará que el ancho div principal sea igual al ancho del elemento más grande.
Tratar display: inline-block;
. Para que sea compatible con varios navegadores, utilice el siguiente código CSS.
div {
display: inline-block;
display:-moz-inline-stack;
zoom:1;
*display:inline;
border-style: solid;
border-color: #0000ff;
}
<div>
<table>
<tr>
<td>Column1</td>
<td>Column2</td>
<td>Column3</td>
</tr>
</table>
</div>
Al manipular Firebug, encontré el valor de la propiedad -moz-fit-content
que hace exactamente lo que el OP quería y podría usarse de la siguiente manera:
width: -moz-fit-content;
Aunque solo funciona en Firefox, no pude encontrar ningún equivalente para otros navegadores como Chrome.
fit-content
. Firefox solo admite ancho. Otros navegadores lo soportan bien.
Puedes probar este código. Sigue el código en la sección CSS.
div {
display: inline-block;
padding: 2vw;
background-color: green;
}
table {
width: 70vw;
background-color: white;
}
<div>
<table border="colapsed">
<tr>
<td>Apple</td>
<td>Banana</td>
<td>Strawberry</td>
</tr>
<tr>
<td>Apple</td>
<td>Banana</td>
<td>Strawberry</td>
</tr>
<tr>
<td>Apple</td>
<td>Banana</td>
<td>Strawberry</td>
</tr>
</table>
</div>
He resuelto un problema similar (donde no quería usar display: inline-block
porque el elemento estaba centrado) agregando una span
etiqueta dentro de la div
etiqueta y moviendo el formato CSS de la div
etiqueta externa a la nueva span
etiqueta interna . Simplemente lanzar esto como otra idea alternativa si display: inline block
no es una respuesta adecuada para usted.
Podemos usar cualquiera de las dos formas en el div
elemento:
display: table;
o,
display: inline-block;
Prefiero usar display: table;
, porque maneja, todos los espacios adicionales por sí solo. Mientras que display: inline-block
necesita un poco de espacio extra de fijación.
Si tiene contenedores que rompen líneas, después de horas buscando una buena solución CSS y no encontrando ninguna, ahora uso jQuery en su lugar:
$('button').click(function(){
$('nav ul').each(function(){
$parent = $(this).parent();
$parent.width( $(this).width() );
});
});
nav {
display: inline-block;
text-align: left; /* doesn't do anything, unlike some might guess */
}
ul {
display: inline;
}
/* needed style */
ul {
padding: 0;
}
body {
width: 420px;
}
/* just style */
body {
background: #ddd;
margin: 1em auto;
}
button {
display: block;
}
nav {
background: #bbb;
margin: 1rem auto;
padding: 0.5rem;
}
li {
display: inline-block;
width: 40px;
height: 20px;
border: solid thin #777;
margin: 4px;
background: #999;
text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>fix</button>
<nav>
<ul>
<li>3</li>
<li>.</li>
<li>1</li>
<li>4</li>
</ul>
</nav>
<nav>
<ul>
<li>3</li>
<li>.</li>
<li>1</li>
<li>4</li>
<li>1</li>
<li>5</li>
<li>9</li>
<li>2</li>
<li>6</li>
<li>5</li>
<li>3</li>
<li>5</li>
</ul>
</nav>
Revisado (funciona si tiene varios hijos): puede usar jQuery (Mire el enlace JSFiddle)
var d= $('div');
var w;
d.children().each(function(){
w = w + $(this).outerWidth();
d.css('width', w + 'px')
});
No olvides incluir el jQuery ...