Estoy seguro de que este problema se ha planteado antes, pero parece que no puedo encontrar la respuesta.
Tengo el siguiente marcado:
<div id="foo">
<div id="bar">
here be dragons
</div>
</div>
Mi deseo es hacer que foo tenga un ancho de 600px
( width: 600px;
) y hacer que la barra tenga los siguientes comportamientos:
padding-left: 2px;
padding-right: 2px;
margin-left: 2px;
margin-right: 2px;
outerWidth: 100%;
En otras palabras, en lugar de establecer el ancho de la barra en, 592px
me gustaría establecer el ancho exterior de la barra en 100%
para que se calcule 592px
. La importancia aquí es que puedo cambiar el ancho de foo 800px
y la barra se calculará cuando se procese en lugar de tener que hacer los cálculos para todas estas instancias manualmente.
¿Es esto posible en CSS puro?
Un poco más divertido con él:
- ¿Y si
#bar
es una mesa? - ¿Y si
#bar
es un área de texto? ¿Y si
#bar
es una entrada?¿Qué pasa si
#foo
es una celda de tabla (td
)? (¿Esto cambia el problema o el problema es idéntico?)
Hasta ahora table#bar
, input#bar
se ha discutido. No he visto una buena solución para textarea # bar. Creo que un área de texto sin borde / margen / relleno con un div
ajuste podría funcionar con el div
estilo para que funcione como bordes para textarea
.
inline-block
deblock
elementos. Sin embargo, tenga en cuenta que dije más como no es lo mismo que :-) Lo que probablemente esté experimentando es que, a menos que se defina lo contrario, generalmente se expandirán para acomodar todas las columnas, lo que puede ser realmente molesto si algunos de los encabezados / celdas tienen texto largo que no se puede envolver.textarea#bar
que debería poder configurarlodisplay: block
con poco efecto adverso. En cuanto a la tabla, sé que he utilizado algún tipo de solución / mitigación para eso en el pasado, pero no recuerdo cuál era en este momento. Sin embargo, diré que generalmente no establezco "márgenes" en una tabla, sino que lo envuelvo en un div con padding / margins ... esto podría ser #foo mismo u otro div usado jsut para aplicar este tipo de espaciado. También puede hacer para contrarrestar el problema del borde para aplicar los bordes solo a la primera / última celda de una fila / las celdas en la primera / última filacasi allí, simplemente cambie
outerWidth: 100%;
awidth: auto;
(outerWidth no es una propiedad de CSS)alternativamente, aplique los siguientes estilos a la barra:
width: auto; display: block;
fuente
bar
porque se agregará al 100% de manera efectiva, lobar
que lo hace más ancho que su padrefoo
.display:block;
(también conocido como elemento de nivel de bloque) adoptará este comportamiento. un elemento DIV tienewidth:auto;
y estádisplay:block;
configurado por defecto.Usa los estilos
left: 0px;
o y
right: 0px;
o y
top: 0px;
o y
bottom: 0px;
Creo que para la mayoría de los casos eso funcionará
fuente
Entonces, después de la investigación, se descubre lo siguiente:
Para un
div#bar
ajustedisplay:block; width: auto;
causa el equivalente deouterWidth:100%;
Para un
table#bar
, debe envolverlo en un div con las reglas que se indican a continuación. Entonces tu estructura se convierte en:<div id="foo"> <div id="barWrap" style="border...."> <table id="bar" style="width: 100%; border: 0; padding: 0; margin: 0;">
De esta manera, la tabla ocupa el div principal al 100% y
#barWrap
se usa para agregar bordes / márgenes / relleno a la#bar
tabla. Tenga en cuenta que deberá establecer el fondo de todo el asunto#barWrap
y que#bar
el fondo sea transparente o igual que#barWrap
.Porque
textarea#bar
yinput#bar
necesita hacer lo mismo quetable#bar
, el lado negativo es que al eliminar los bordes, detiene la representación nativa del widget del área de entrada / texto y los#barWrap
bordes se verán un poco diferentes a todo lo demás, por lo que probablemente tendrá que hacerlo diseñe todas sus entradas de esta manera.fuente