Auf die Gefahr hin, mich zu wiederholen: Jedes Element im Webdesign ist eine rechteckige Box. Das war mein Aha-Erlebnis, das mir wirklich geholfen hat, CSS-basiertes Webdesign zu verstehen und die Layouts zu realisieren, die ich realisieren wollte. Wir haben bereits über die Positionierung dieser Boxen und ein wenig und über ihr Verhalten gesprochen.
Worüber wir noch nicht viel gesprochen haben, ist die Box selbst. Wie genau wird die Größe der Box berechnet?
Hier ist eine Grafik

Wenn Sie ein Firebug-Benutzer sind, sind Sie vielleicht an eine Grafik wie diese gewöhnt, die schön die Zahlen zeigt, die eine beliebige Box auf der Seite beeinflussen.

Beachten Sie in beiden Beispielen, dass der Rand im Weißen liegt. Der Rand ist einzigartig darin, dass er nicht die Größe der Box selbst beeinflusst, sondern er beeinflusst andere Inhalte, die mit der Box interagieren, und ist somit ein wichtiger Teil des CSS-Box-Modells.
Die Größe der Box selbst wird wie folgt berechnet:
| Breite | Breite + links-Padding + rechts-Padding + links-Rand + rechts-Rand |
| Höhe | Höhe + oberes-Padding + unteres-Padding + oberer-Rand + unterer-Rand |
Was passiert, wenn diese Werte nicht deklariert sind?
Wenn Padding oder Ränder nicht deklariert sind, sind sie entweder null (wahrscheinlich, wenn Sie ein CSS-Reset verwenden) oder der Standardwert des Browsers (wahrscheinlich nicht null, insbesondere bei Formularelementen, die häufig nicht zurückgesetzt werden).
Wenn die Breite einer Box nicht deklariert ist (und die Box ein Block-Level-Element ist), wird es ein wenig seltsamer. Beginnen wir damit und gehen dann zu einigen anderen wichtigen Dingen über das Box-Modell über.
Die Standardbreite von Block-Level-Boxen
Wenn Sie keine Breite festlegen und die Box statisch oder relativ positioniert ist, bleibt die Breite bei 100% und das Padding und der Rand drängen nach innen statt nach außen. Wenn Sie jedoch die Breite der Box explizit auf 100% einstellen, drängt das Padding die Box wie gewohnt nach außen.

Die Lektion hier ist, dass die Standardbreite einer Box nicht wirklich 100% ist, sondern ein weniger greifbares „was übrig bleibt“. Dies ist besonders wertvoll zu wissen, da es viele Umstände gibt, in denen es äußerst nützlich ist, eine Breite entweder festzulegen oder nicht festzulegen.
Der größte Dorn im Auge, den ich immer finde, sind Textarea-Elemente, die ihre Breiten dringend benötigen, um dem erforderlichen „cols“-Attribut entgegenzuwirken und keine Kindelemente haben können. Sie benötigen also oft, dass die Textarea explizit auf 100% eingestellt ist, aber auch ein Padding hat, das sie zu groß werden lässt, um hineinzupassen. In einer Umgebung mit statischer Breite greifen wir oft auf Pixelbreiten zurück, die passen, aber in flüssigen Umgebungen gibt es keine solche Glück.
Absolute Boxen ohne Breite
Absolut positionierte Boxen, bei denen keine Breite festgelegt ist, verhalten sich etwas seltsam. Ihre Breite ist nur so groß, wie sie benötigt wird, um den Inhalt aufzunehmen. Wenn die Box also ein einzelnes Wort enthält, ist die Box nur so breit wie dieses Wort dargestellt wird. Wenn sie zu zwei Wörtern wächst, wächst sie bis zu dieser Breite.

Dies sollte so lange fortgesetzt werden, bis die Box 100% der Breite des Elternteils (des nächstgelegenen relativ positionierten Elternteils oder des Browserfensters) erreicht und dann zu umbrechen beginnt. Es fühlt sich natürlich und normal an, dass sich Boxen vertikal ausdehnen, um Inhalt aufzunehmen, aber es fühlt sich einfach seltsam an, wenn dies horizontal geschieht. Dieses seltsame Gefühl ist gerechtfertigt, da es viele Eigenheiten gibt, wie verschiedene Browser damit umgehen, ganz zu schweigen von der Tatsache, dass Text auf verschiedenen Plattformen unterschiedlich gerendert wird.

Floated Boxen ohne Breite
Das exakt gleiche Verhalten ist bei gefloateten Elementen ohne Breiten zu beobachten. Die Box ist nur so breit wie nötig, um den Inhalt aufzunehmen, bis zur Breite ihres Elternelements (muss nicht relativ positioniert sein). Aufgrund der fragilen Natur dieser breitenlosen Boxen ist die Lektion, die man hier mitnehmen kann, nicht auf sie in geschäftskritischen Szenarien, wie z. B. im gesamten Seitenlayout, zu setzen. Wenn Sie eine Spalte floaten, um sie als Seitenleiste zu verwenden, und sich auf ein Element darin (wie ein Bild) verlassen, um seine Breite zu halten, suchen Sie nach Problemen.
Inline-Elemente sind auch Boxen
Wir haben uns hier eher auf Boxen als Block-Level-Elemente konzentriert. Es ist leicht, sich Block-Level-Elemente als Boxen vorzustellen, aber Inline-Elemente sind ebenfalls Boxen. Stellen Sie sie sich als sehr, sehr lange und schlanke Rechtecke vor, die zufällig jede Zeile umbrechen. Sie können Margin, Padding, Ränder wie jede andere Box haben.

Das Umbrechen macht es verwirrend. Ein linker Rand schiebt die Box nach rechts, wie man es erwarten würde, aber nur die erste Zeile, da dies der Anfang der Box ist. Das Padding wird über und unter dem Text angewendet, wie es sein sollte, und wenn es umbricht, ignoriert es die Zeile über seinem Padding und beginnt dort, wo die Zeilenhöhe es vorschreibt. Der Hintergrund wurde mit Transparenz angewendet, um zu sehen, wie es klarer funktioniert.
Sehen Sie es mit eigenen Augen
Möchten Sie jede einzelne „Box“ sehen, aus der eine Seite besteht? Versuchen Sie, dies vorübergehend in das Stylesheet einzufügen.
* {
outline: 1px solid red !important;
}

Wow, das ist großartig! Viele nette kleine Hinweise, die ich nicht kannte. :)
Gute Erklärung. Ich werde die Leute darauf hinweisen.
Ich denke, dass in IE gefloatete Boxen immer noch die 100% oder „was übrig bleibt“ Breite haben, so dass Sie eine Breite festlegen müssen, wenn sie neben etwas liegen soll. Am häufigsten stoße ich darauf, wenn ich eine Navigation neben einem Seitentitel floate.
Ja, das Beste ist, immer eine Breite für alles festzulegen, was gefloatet, absolut positioniert oder fixiert positioniert ist, um browserübergreifende Probleme zu vermeiden.
Ein weiterer IE-Fix für gefloatete Elemente ist das Hinzufügen von ‚display: inline‘ zum CSS-Tag.
Gute Idee, das wusste ich nicht! :-)
–Notiz an mich–
Stellen Sie sicher, dass Sie display:inline setzen, bevor Sie versuchen, Ränder anzupassen. Oh, der Spaß, den ich einmal hatte, weil ich dieses winzige (aber wichtige) Detail übersehen habe.
Ja, es ist schwierig, die Breite auf 100% einzustellen und dann in Pixel zu fixieren. Weil Pixel in verschiedenen Browsern variieren.
Ich hasse es, mich mit IE zu beschäftigen, wenn es um CSS geht, weil er alles so falsch rendert. Warum kann Microsoft seinen Browser nicht nach W3C-Standards machen?
sehr cool! toll für jemanden, der gerade anfängt, CSS zu lernen.
Der Rand an allem ist ein einfaches Testwerkzeug und kann sehr aufschlussreich sein.
Die Web-Entwickler-Toolbar für Firefox zeigt Ihnen alle Boxen.. :)
Download-Link
Wieder einmal haben Sie sich mit einem prägnanten und informativen Schreibstück selbst übertroffen. Machen Sie weiter so!
Sehr cool. Das ist genau auf meinem Niveau als Teilzeit-Gelegenheitsnutzer. Ich wusste das alles nicht und jetzt ergibt alles Sinn.
Wow, Sie haben diesen Rat „Padding für Padding verwenden, nicht für Positionierung“ wirklich ernst genommen. Ich bin etwas überrascht, dass Sie Mitte 2009 ein Tutorial zum Box-Modell machen, aber es ist nie zu spät für die Grundlagen. Hervorragende Präsentation von Informationen wie üblich.
Ich hasse es, ein Rechtschreib-Nazi zu sein, aber es heißt „per se“, nicht „per say“.
Dann tu es nicht
Dieser Beitrag und der ‚overflow‘-Beitrag waren sehr hilfreich. Ich habe ein paar Dinge gelernt, die mir Zeit und Frustration ersparen könnten.
Wen interessiert die Rechtschreibung, wenn Sie verstanden haben, was er meinte, dann machen Sie weiter. Ihre dumme Antwort zu lesen hat meine Zeit verschwendet. Wachsen Sie, „jh“.
Wow… Sie sind ein Arschloch.
Leck meinen haarigen Sack, Mike & Benjamin
Falsch. Seine Antwort zu lesen war lehrreich. Ihren Beitrag zu lesen war eine Verschwendung aller Zeit. Wachsen Sie, „jh“.
Hallo Afe, Sie haben es gut gemacht, danke für den kleinen Tipp.
Toller Artikel, danke!
Als ich ihn las, entdeckte ich, warum Sie in Ihren Screencasts und Artikeln immer Ränder und Padding auf 0 zurücksetzen. Können Sie uns einige Tipps und Tricks zu anderen Markup-Tags wie p, ul, li usw. geben? Ich verstehe, dass dies stark davon abhängt, was Sie tun wollen, aber vielleicht gibt es einige allgemeine Regeln, die Sie uns zeigen können.
Danke!
Schöner Beitrag, Chris!
Übrigens, wie wird die Box des TEXT berechnet und wie entfernt man den standardmäßigen Platz um den Text herum? Wie im von Ihnen gezeigten Beispiel, wo es heißt „Hallo“, gibt es 1 Pixel oben und 5 Pixel unten, und wenn Sie die Schriftgröße erhöhen, erhöht sich das ebenfalls.
Ich habe versucht, die Zeilenhöhe zu verringern, aber es gibt immer ein kleines Extra drumherum.
Ich nehme an, Sie meinen die Methode der Schriftartendarstellung, die in jedem Browser unterschiedlich ist. Einige Schriftarten werden browserübergreifend gleich gerendert, andere nicht (z. B. Arial). Ich fand das ziemlich ärgerlich.
Der 1-Pixel-Rand ist seit etwa 1997 das Standard-Testwerkzeug… früher…. als Tabellen eingeführt wurden….
Vielen Dank für die Auffrischung des Box-Modells!!!
Ich bin ein großer Fan davon, Hintergrundfarben zum Testen zu verwenden, da sie Ihre Breiten/Layouts nicht beeinträchtigen. Aardvark ist eines meiner wichtigsten Werkzeuge geworden und hat eine wirklich schöne Farbfunktion, bei der Sie ein Element hervorheben und es erhält eine zufällige Hintergrundfarbe.
Eine Kombination aus diesem und einem Debug-Abschnitt von CSS mit Hintergrundfarben ist etwas, das ich täglich beim Debuggen von Layouts verwende.
Jedenfalls ein weiterer toller Artikel und ich mag Ihren Grundsatz, viele Dinge von Grund auf neu anzugehen.
PS: Habe gerade bemerkt, wie cool Ihre Anhangshinweise für Links sind… progressive Enhancement FTW!
Ach… der coole Link-Anhang wurde nie angezeigt :(
also ist padding standardmäßig innerhalb der Box, aber außerhalb, wenn Sie sagen, Breite 100% ??? :-(
Padding ist immer noch innerhalb der Box, wenn die Breite 100% beträgt. In diesem Beispiel hat das Elternelement eine Breite von 300px. Wenn das Kindelement auf 100% mit 20px Padding eingestellt wird, wird die Box 340px breit (300 Breite vom Elternteil + 20px linkes Padding + 20px rechtes Padding). Ich denke, das statische Breite des Elternelements ist es, was Sie verwirrt.
Warum funktioniert meine Seite-nach-unten-Taste auf Ihrem Blog nicht? Mit Firefox 3 auf XP
Boxen, Boxen, Boxen! :-)
Toller Artikel, es gibt durchweg informative Artikel von CSS Tricks!
Sehr gut geschrieben und äußerst informativer Artikel, Chris.
Vielen Dank.
Ich benutze den Rand-Trick auch oft, wenn ich das Gefühl habe, die Kontrolle ein wenig zu verlieren. Ich habe diesen Trick irgendwie selbst gelernt (habe ihn nirgends gelesen/gesehen) – es macht Spaß zu lesen, dass mehr Leute es so machen :)
Beachten Sie, dass Inline-„Boxen“ keine Höhen oder Breiten haben können.
Siehe Beispiel hier.
Das Hinzufügen von Padding zu Inline-Elementen ist auch bestenfalls Glückssache. Ich glaube, einige Versionen von IE erlauben es. Wenn ich mich richtig erinnere, polstert Firefox links und rechts, aber nicht oben und unten.
Unabhängig von der Browserunterstützung sind Inline-Elemente gemäß den Spezifikationen tatsächlich keine Boxen. Sie haben keine Breite, keine Höhe, kein Padding usw. (es sei denn, Sie fügen natürlich display:block hinzu;).
Nun… Danke für die Klarstellung! Ich benutze Firebug schon eine Weile und habe nur über die Box geschaut. :)
Ich benutze Outline > Outline Block Level Elements in der Web-Entwickler-Toolbar ständig.
Ja, die Umriss-Technik ist meiner Meinung nach besser als ein Rand.
Hier ist ein kurzes Snippet, das etwas Ähnliches bewirkt, wenn Sie die Web-Entwickler-Toolbar nicht haben.
* { outline: 2px dotted red }
* * { outline: 2px dotted green }
* * * { outline: 2px dotted orange }
* * * * { outline: 2px dotted blue }
* * * * * { outline: 1px solid red }
* * * * * * { outline: 1px solid green }
* * * * * * * { outline: 1px solid orange }
* * * * * * * * { outline: 1px solid blue }
Wow! Das ist super hilfreich! Danke für die großartigen Informationen und die Art und Weise, wie Sie es erklären, selbst ein 5-Jähriger könnte es klar verstehen. Ich werde Leute definitiv darauf verweisen!
Guter Beitrag, neu mit CSS und hat mir geholfen, gut zu verstehen.
Sie machen einen großartigen Job, Mann. Danke für all die guten Tipps.
Toller Artikel. Ein sehr klares Verständnis, wie das Box-Modell funktioniert, beseitigt viel Rätselraten.
Und danke für die Erklärung des Unterschieds zwischen keiner Breite und 100% Breite – das habe ich vorher nie ganz verstanden. Es ist seltsam, wie es so funktioniert – man sollte meinen, es wäre sowieso dasselbe, aber das ist es nicht.
Außerdem wäre es vielleicht eine gute Idee, alle daran zu erinnern, einen richtigen Doctyp zu deklarieren (was Sie sowieso tun sollten); andernfalls greift IE in den Quirks-Modus zurück und verwendet seine eigene (falsche) Implementierung des Box-Modells.
Aus früheren Kopfschmerzen habe ich diese Dinge bereits gelernt und stelle normalerweise alles mit einer Breite ein, aber es ist gut zu wissen, dass es verschiedene Möglichkeiten gibt, mit Dingen zu arbeiten.
Ich glaube, ich sollte dieses Firebug ausprobieren, das überall erwähnt zu werden scheint. Ich mag die Funktionen in der Web-Entwickler-Toolbar und sah keinen Grund, Firebug auszuprobieren. Aber diese Anzeige des Box-Modells sieht wahnsinnig hilfreich aus.
schön gesagt.
Grafische Darstellung hilft, CSS leichter zu verstehen.
Das ist eine großartige Wiederholung. Sehr gut geschrieben. Danke für den kontinuierlichen Strom hochwertiger Inhalte!
Danke dafür. Grundlagen, aber ohne Fundament kann man kein Haus bauen.
Habe diese Seite gerade über Stumble gefunden.
Tolle Tipps. Ich suche immer nach verschiedenen Möglichkeiten, Seitenlayouts zu verwalten.
Freue mich auf zukünftige Artikel.
Hmm, ich verstehe nicht, warum Denis Onichshenko so etwas sagen würde: „Ich bin etwas überrascht, dass Sie Mitte 2009 ein Tutorial zum Box-Modell machen…“ Erklären Sie diesen Kommentar, Denis. Begreifen Sie nicht, dass es Leute gibt, die diese Dinge jedes Jahr neu lernen? Grundlagen sind immer relevant (und wichtig, dass sie richtig gemacht werden) – ja, jedes Jahr! Schauen Sie sich die anderen Kommentare von Leuten an, die von diesem Beitrag profitiert haben, der für Sie „zu einfach“ war.
Danke fürs Teilen, Chris!
Beiträge wie dieser helfen Menschen, die Grundlagen oft besser zu verstehen als ein trockenes Tutorial. Es ist sehr wertvoll. Und wenn man „außerhalb der Box“ designen will, ist es immer gut, sich aufzufrischen, wie diese Box funktioniert.
Was die Behandlung durch ältere Browser angeht… brrr, schauder… vielleicht eine Idee für ein weiteres Tutorial… so sehr wir auch IE6-Doppelrand usw. Bugs hinter uns lassen wollen, wir müssen uns immer noch damit auseinandersetzen, und die Details des Box-Modells und dessen Korrektur für ältere Browser könnten viele entmutigen, potenziell großartige Designer….
es ist ein cooler Beitrag, danke Chris
Es ist erwähnenswert, dass das Hinzufügen eines roten Randes (oder einer beliebigen Farbe) zum Testen usw. beim Anwenden einer Breite auf Ihre sorgfältig arrangierten Boxen die Breite und Höhe um 2 Pixel erhöht, was ausreichen kann, um Ihr Layout während des Testens zu brechen.
Ich ändere normalerweise die Hintergrundfarbe vorübergehend, um zu sehen, was los ist, auf diese Weise ändert sich Ihre Größenordnung nicht.
Nicht ganz richtig. Sie können zum Beispiel eine Breite von 80% und ein Padding von 10% einstellen, und es passt schön auf 100%. Das einzige Problem wäre, wenn Sie aus irgendeinem Grund keine Prozente für das Padding wünschen.
Und ein großes Problem ist, dass der Rand keine Prozentmessung annehmen kann. Aber die ems sind meiner Meinung nach auch eine gute Wahl. 0,1em passt normalerweise auf 1px.
so
margin:0.5em auto; border: 0.1em solid #000000; width:80%; padding:5%;
Und display:block;, da es sich in diesem Fall um ein em-Element handelt.
Eine weitere interessante Sache ist, dass Elemente mit relativer Positionierung (ähnlich denen mit fester Positionierung) automatisch einen höheren z-Index als die nachfolgenden Elemente mit statischer Positionierung erhalten. Dies kann jedoch durch Setzen der z-index-Eigenschaft auf einen geeigneten Wert ausgeglichen werden.
nun… das Skript hat den Inline-Stil vom em-Element entfernt, also vergiss es.
Gut erklärt. Es gibt unzählige Bücher und so weiter, aber das ist wirklich informativ und beschreibend.
Ausgezeichneter Beitrag. Sie haben hier einige interessante Punkte angesprochen. Der Abschnitt über Standardwerte hat mir zu denken gegeben. Das Verständnis der unterschiedlichen Arbeitsweisen verschiedener Browser mit diesen Modellen ist unerlässlich, um unnötige und zeitaufwendige Hacking-Methoden auszuschalten, keine Namen genannt, … IE.
Ich werde auf jeden Fall wieder hierher zurückkehren, um weitere Beiträge in der Zukunft zu lesen.
Coole grundlegende Sachen für Anfänger wie mich :D. Danke.
Sehr nützliche Informationen Chris… Gestolpert!
Obwohl ich nicht mehr so neu bin wie früher, sind CSS-Grundlagen und -Fundamente immer lesenswert, um mein Wissen aufzufrischen.
Auch ein gut gefüllter Kommentarbereich wimmelt von unerwartet hilfreichen Tipps und Tricks.
Wow, ich bekomme diese Boxen nie so hin, wie ich es wollte.
Jetzt weiß ich warum.
Großartig erklärt.
Danke fürs Teilen
Danke, es hilft mir, CSS besser zu verstehen, jeden Tag macht es ein bisschen mehr Sinn für mich.
Danke für das Teilen :)
netter Mann, danke fürs Teilen, das ist eine wirklich coole Beschreibung.
nette, aufgeräumte, einfache Idee mit diesem Rand. Ich wünschte, ich hätte das gedacht. Hätte mir das Leben leichter gemacht.
Gut erklärt. Es gibt unzählige Bücher und so weiter, aber das ist wirklich informativ und beschreibend.
Vielen Dank für das Posten! Habe kürzlich mit CSS-Stylesheets angefangen und Ihr Beitrag ist eine große Hilfe :)
Dieser Artikel ist für mich ein echter Augenöffner. Kann Ihnen nicht genug dafür danken :)
Das ist wahrscheinlich ein ziemlich guter Artikel. Aber ich suche einen, der sich damit beschäftigt, wie man diese dummen Divs benutzt. Das heißt, ich sehe sie überhaupt nicht als Boxen, ich bin Grafikdesigner. Es ist einfach, runde Boxen zu zeichnen, sogar kreisförmige. Die Idee des Box-Modells ist einfach die Definition eines Raumes, eines Raumes, der rund sein kann. Allein der Name, Box-Modell, ist höchst kontraproduktiv.
Aber mein Problem ist, dass ich versuche, ein Layout mit mehreren Räumen so zu definieren, wie ich es früher mit Tabellen gemacht habe, nur besser. Wenn also jemand weiß, wo ich ein anständiges Tutorial oder eine Diskussion darüber finden kann, wie man ein einfaches Div-Layout tatsächlich korrekt zum Laufen bringt, kontaktieren Sie mich bitte und weisen Sie mich darauf hin.