Je suis sûr que ce problème a déjà été posé mais je n'arrive pas à trouver la réponse.
J'ai le balisage suivant:
<div id="foo">
<div id="bar">
here be dragons
</div>
</div>
Mon désir est de faire en sorte que foo ait une largeur de 600px
( width: 600px;
) et que bar ait les comportements suivants:
padding-left: 2px;
padding-right: 2px;
margin-left: 2px;
margin-right: 2px;
outerWidth: 100%;
En d'autres termes, au lieu de définir la largeur de la barre sur, 592px
je voudrais définir la largeur extérieure de la barre sur 100%
afin qu'elle soit calculée 592px
. L'importance ici est que je peux changer la largeur de foo en 800px
et la barre calculera lors du rendu au lieu de devoir faire le calcul pour toutes ces instances manuellement.
Est-ce possible en CSS pur?
Un peu plus de plaisir avec:
- Et qu'est-ce qui se passerait si
#bar
c'était une table? - Et qu'est-ce qui se passerait si
#bar
c'était une zone de texte? Et si
#bar
c'est une entrée?Et si
#foo
est une cellule de tableau (td
)? (Cela change-t-il le problème ou le problème est-il identique?)
Jusqu'à présent, le table#bar
, input#bar
a été discuté. Je n'ai pas vu de bonne solution pour textarea # bar. Je pense qu'une zone de texte sans bordure / marge / remplissage avec une div
enveloppe pourrait fonctionner avec le div
style pour fonctionner comme des bordures pour le textarea
.
inline-block
que desblock
éléments. Notez cependant que j'ai dit plutôt pas la même chose que :-) Ce que vous vivez probablement, c'est que, sauf indication contraire, elles se développeront généralement pour accueillir toutes les colonnes, ce qui peut être vraiment ennuyeux si certains des en-têtes / cellules contiennent un long texte non emballable.textarea#bar
vous devriez pouvoir régler celadisplay: block
avec peu d'effet indésirable. En ce qui concerne le tableau, je sais que j'ai utilisé une sorte de solution / atténuation pour cela dans le passé, mais je ne me souviens pas de ce que c'était pour le moment. Cependant, je dirai que je ne mets généralement pas de "marges" sur une table, mais plutôt l'enveloppe dans un div avec padding / margins ... cela pourrait être #foo lui-même ou un autre div utilisé jsut pour appliquer ce type d'espacement. Vous pouvez également faire pour contrer le problème de bordure pour appliquer les bordures uniquement à la première / dernière cellule d'une ligne / aux cellules de la première / dernière lignepresque là, il suffit de changer
outerWidth: 100%;
pourwidth: auto;
(OutsideWidth n'est pas une propriété CSS)ou appliquez les styles suivants à la barre:
width: auto; display: block;
la source
bar
car le sera ajouté à 100%, ce qui rendrabar
plus large que son parentfoo
.display:block;
(également appelé élément de niveau bloc) adoptera ce comportement. un élément DIV awidth:auto;
etdisplay:block;
défini par défaut.Utilisez les styles
left: 0px;
ou et
right: 0px;
ou et
top: 0px;
ou et
bottom: 0px;
Je pense que dans la plupart des cas, cela fera l'affaire
la source
Ainsi, après recherche, on découvre ce qui suit:
Pour un
div#bar
décordisplay:block; width: auto;
provoque l'équivalent deouterWidth:100%;
Pour un,
table#bar
vous devez l'envelopper dans un div avec les règles énoncées ci-dessous. Ainsi votre structure devient:<div id="foo"> <div id="barWrap" style="border...."> <table id="bar" style="width: 100%; border: 0; padding: 0; margin: 0;">
De cette façon, le tableau occupe le div parent à 100% et
#barWrap
est utilisé pour ajouter des bordures / marge / remplissage au#bar
tableau. Notez que vous devrez définir l'arrière-plan de l'ensemble#barWrap
et que#bar
l'arrière-plan de celui-ci soit transparent ou identique à#barWrap
.Pour
textarea#bar
etinput#bar
vous devez faire la même chose quetable#bar
, l' inconvénient est qu'en supprimant les bordures, vous arrêtez le rendu du widget natif de la zone d'entrée / de texte et les#barWrap
bordures de s auront un aspect un peu différent de tout le reste, vous devrez donc probablement stylisez toutes vos entrées de cette façon.la source