Tenho certeza de que esse problema foi perguntado antes, mas não consigo encontrar a resposta.
Eu tenho a seguinte marcação:
<div id="foo">
<div id="bar">
here be dragons
</div>
</div>
Meu desejo é fazer com que foo tenha largura de 600px
( width: 600px;
) e que bar tenha os seguintes comportamentos:
padding-left: 2px;
padding-right: 2px;
margin-left: 2px;
margin-right: 2px;
outerWidth: 100%;
Em outras palavras, em vez de definir a largura da barra 592px
como, gostaria de definir a largura externa da barra para 100%
que ela seja calculada 592px
. A importância aqui é que eu posso alterar a largura de foo para 800px
e a barra irá calcular quando renderizada, em vez de eu ter que fazer a matemática para todas essas instâncias manualmente.
Isso é possível em CSS puro?
Um pouco mais divertido com isso:
- E se
#bar
for uma mesa? - E se
#bar
for uma área de texto? E se
#bar
for uma entrada?E se
#foo
for uma célula de tabela (td
)? (Isso muda o problema ou o problema é idêntico?)
Até agora table#bar
, input#bar
foi discutido. Eu não vi uma boa solução para textarea # bar. Eu acho que uma textarea sem borda / margem / preenchimento com uma div
quebra pode funcionar com o div
estilo para funcionar como bordas para o textarea
.
inline-block
queblock
elementos. Observe, porém, que eu disse mais como não é o mesmo que :-) O que você provavelmente está experimentando é que, a menos que definido de outra forma, eles geralmente se expandem para acomodar todas as colunas, o que pode ser realmente irritante se alguns dos cabeçalhos / células contiverem um texto longo que não pode ser encapsulado.textarea#bar
você deve ser capaz de definir issodisplay: block
com poucos efeitos adversos. Quanto à tabela, eu sei que usei algum tipo de solução / mitigação para isso no passado, mas não me lembro o que era no momento. No entanto, direi que geralmente não defino "margens" em uma mesa, mas envolvo-a em uma div com preenchimento / margens ... isso pode ser o próprio #foo ou outro div usado apenas para aplicar esse tipo de espaçamento. Além disso, você pode fazer para neutralizar o problema da borda para aplicar as bordas apenas à primeira / última célula em uma linha / as células na primeira / última linhaquase lá, basta mudar
outerWidth: 100%;
parawidth: auto;
(outerWidth não é uma propriedade CSS)como alternativa, aplique os seguintes estilos à barra:
width: auto; display: block;
fonte
bar
porque o será adicionado aos 100% tornando-o efetivamentebar
mais largo do que seu paifoo
.display:block;
(também conhecido como elemento de nível de bloco) adotará esse comportamento. um elemento DIV temwidth:auto;
edisplay:block;
definida por padrão.Use os estilos
left: 0px;
ou e
right: 0px;
ou e
top: 0px;
ou e
bottom: 0px;
Eu acho que na maioria dos casos isso fará o trabalho
fonte
Portanto, após a pesquisa, o seguinte é descoberto:
Para uma
div#bar
configuraçãodisplay:block; width: auto;
causa o equivalente aouterWidth:100%;
Para um,
table#bar
você precisa envolvê-lo em um div com as regras declaradas abaixo. Portanto, sua estrutura se torna:<div id="foo"> <div id="barWrap" style="border...."> <table id="bar" style="width: 100%; border: 0; padding: 0; margin: 0;">
Desta forma, a tabela ocupa o div pai 100% e
#barWrap
é usada para adicionar bordas / margens / preenchimento à#bar
tabela. Observe que você precisará definir o fundo de tudo em#barWrap
e fazer com que#bar
o fundo seja transparente ou igual a#barWrap
.Pois
textarea#bar
einput#bar
você precisa fazer a mesma coisa quetable#bar
, o lado negativo é que, ao remover as bordas, você interrompe a renderização nativa do widget da área de entrada / texto e as#barWrap
bordas de parecerão um pouco diferentes de tudo o mais, então você provavelmente terá que estilize todas as suas entradas desta forma.fonte