Ich bin sicher, dass dieses Problem schon einmal gestellt wurde, aber ich kann anscheinend keine Antwort finden.
Ich habe das folgende Markup:
<div id="foo">
<div id="bar">
here be dragons
</div>
</div>
Mein Wunsch ist es, foo so zu machen, dass es die Breite 600px
( width: 600px;
) hat und bar die folgenden Verhaltensweisen hat:
padding-left: 2px;
padding-right: 2px;
margin-left: 2px;
margin-right: 2px;
outerWidth: 100%;
Mit anderen Worten, anstatt die Breite des Balkens auf 592px
zu setzen, möchte ich die äußere Breite des Balkens 100%
so einstellen , dass er berechnet wird 592px
. Die Wichtigkeit hierbei ist, dass ich die Breite von foo in ändern kann 800px
und der Balken beim Rendern berechnet wird, anstatt dass ich die Berechnungen für alle diese Instanzen manuell durchführen muss.
Ist das in reinem CSS möglich?
Noch mehr Spaß damit:
- Was ist, wenn
#bar
ein Tisch ist? - Was ist, wenn
#bar
es sich um einen Textbereich handelt? Was ist, wenn
#bar
es sich um eine Eingabe handelt?Was ist, wenn
#foo
es sich um eine Tabellenzelle (td
) handelt? (Ändert dies das Problem oder ist das Problem identisch?)
Bisher ist die table#bar
, input#bar
wird diskutiert. Ich habe keine gute Lösung für Textbereich # Leiste gesehen. Ich denke, ein Textbereich ohne Rand / Rand / Polsterung mit einem div
Wrap könnte mit dem div
Stil funktionieren, der als Rahmen für die textarea
.
inline-block
alsblock
Elemente. Beachten Sie jedoch, dass ich eher gesagt habe, dass es nicht dasselbe ist wie :-) Was Sie wahrscheinlich erleben, ist, dass sie, sofern nicht anders definiert, im Allgemeinen erweitert werden, um alle Spalten aufzunehmen, was sehr ärgerlich sein kann, wenn einige der Überschriften / Zellen langen, nicht auspackbaren Text enthalten.textarea#bar
Sie sollten in der Lage sein, diesdisplay: block
mit wenig nachteiligen Auswirkungen einzustellen . Was die Tabelle angeht, weiß ich, dass ich in der Vergangenheit eine Lösung / Minderung dafür verwendet habe, aber ich kann mich nicht erinnern, was es im Moment war. Allerdings werde ich sagen, dass ich im Allgemeinen keine "Ränder" für eine Tabelle setze, sondern sie in ein Div mit Auffüllen / Rändern einwickle ... dies könnte #foo selbst sein oder ein anderes Div, das jsut verwendet, um diese Art von Abstand anzuwenden. Sie können auch demfast da, wechseln Sie einfach
outerWidth: 100%;
zuwidth: auto;
(OuterWidth ist keine CSS-Eigenschaft)Alternativ können Sie die folgenden Stile auf die Leiste anwenden:
quelle
bar
weil der zu 100% addiert wird, wodurch er effektivbar
breiter als der übergeordnete Rand wirdfoo
.display:block;
(auch als Blockebenenelement bezeichnet) verfügt, übernimmt dieses Verhalten. Ein DIV-Element hatwidth:auto;
unddisplay:block;
ist standardmäßig eingestellt.Verwenden Sie die Stile
oder und
oder und
oder und
Ich denke für die meisten Fälle wird das den Job machen
quelle
Nach Recherchen wird also Folgendes entdeckt:
Für eine
div#bar
Einstellungdisplay:block; width: auto;
ergibt sich das Äquivalent vonouterWidth:100%;
Für a müssen
table#bar
Sie es in ein div mit den unten angegebenen Regeln einwickeln. So wird Ihre Struktur:Auf diese Weise nimmt die Tabelle das übergeordnete Div zu 100% ein und
#barWrap
wird verwendet, um der#bar
Tabelle Rahmen / Rand / Abstand hinzuzufügen . Beachten Sie, dass Sie den Hintergrund der ganzen Sache in festlegen müssen#barWrap
und haben#bar
Hintergrund als transparent oder gleich sein s‘#barWrap
.Für
textarea#bar
undinput#bar
Sie müssen das Gleiche tun wietable#bar
: Der Nachteil ist, dass Sie durch Entfernen der Ränder das native Widget-Rendering des Eingabe- / Textbereichs stoppen und die Ränder des Rahmens#barWrap
etwas anders aussehen als alles andere, sodass Sie dies wahrscheinlich tun müssen Gestalten Sie alle Ihre Eingaben auf diese Weise.quelle