Die Eigenschaft box-sizing kann den Aufbau von CSS-Layouts einfacher und viel intuitiver machen. Sie ist für Entwickler ein so großer Vorteil, dass wir hier bei CSS-Tricks im Februar den International Box-Sizing Awareness Day feiern.
Aber, wie ist es so hilfreich und beliebt, dass es seinen eigenen Internet-Feiertag verdient? Zeit für ein wenig CSS-Geschichte.
Box Model Geschichte
Seit Anbeginn von CSS funktioniert das Box-Modell standardmäßig so
breite + padding + border = tatsächliche sichtbare/gerenderte Breite des Rahmens eines Elements
höhe + padding + border = tatsächliche sichtbare/gerenderte Höhe des Rahmens eines Elements
Dies kann etwas kontraintuitiv sein, da die von Ihnen für ein Element festgelegte Breite und Höhe sofort verloren gehen, sobald Sie beginnen, Padding und Rahmen zum Element hinzuzufügen.
In den alten Tagen des Webdesigns verhielten sich frühe Versionen von Internet Explorer (<= IE6) im "Quirks Mode" anders mit dem Box-Modell. Das "Quirks"-Box-Modell funktionierte so: breite = tatsächliche sichtbare/gerenderte breite des Rahmens eines Elements höhe = tatsächliche sichtbare/gerenderte höhe des Rahmens eines Elements Die Rahmen- und Padding-Werte wurden in den Rahmen des Elements verschoben und schnitten in die Breite/Höhe des Rahmens ein, anstatt ihn zu erweitern.

Manche Leute bevorzugten diese "quirky" Interpretation des Box-Modells und hielten sie für intuitiver. Das ist ein valider Punkt. Dass die tatsächliche sichtbare Breite eines Rahmens anders ausfällt als deklariert, ist ein wenig verwirrend.
Aber zu Zeiten des Fixed-Width-Designs war es nicht besonders kompliziert, mit dem Standard-Box-Modell zu arbeiten, sobald man es verstanden hatte. Man konnte ein wenig rechnen, um herauszufinden, wie viele Pixel man von der deklarierten Breite oder Höhe eines Elements abziehen musste, um sein Padding und seinen Rahmen zu berücksichtigen. Das Problem für heutige Entwickler ist, dass diese absoluten Pixelmaße sich nicht auf responsives Design übertragen lassen, so dass die gleiche Rechnung nicht mehr gilt.
Als responsives Design (oder, wie es einst hieß, "flüssiges" oder "liquides" Layout) an Popularität gewann, wünschten sich Entwickler und Designer eine Aktualisierung des Box-Modells. Der großartige Designer Jon Hicks, bekannt für seine exzellenten Designs mit flüssiger Breite, sagte dazu in der CSS Wishlist, die wir 2008 zusammengestellt haben:
Ich würde mir ein anderes Box-Modell wünschen! Ich finde es bizarr, dass Padding und Border die Breite eines Objekts hinzufügen, und ich würde mir wünschen, einem Textbereich wie einem Textfeld 100% Breite und 3px Padding geben zu können, ohne sich Gedanken darüber machen zu müssen, was es mit dem Layout macht. Vielleicht so etwas wie padding-inside als neuen Selektor?
In diesem Sinne wünsche ich mir auch, dass ich eine 100% Breite für ein Element festlegen könnte, abzüglich einer festgelegten festen Breite. Auch das ist sehr nützlich bei der Erstellung von flüssigen Designs mit Formularelementen!
Heutiges box-sizing
Diese Wünsche wurden erfüllt, als die Eigenschaft box-sizing in CSS3 eingeführt wurde. Obwohl box-sizing drei mögliche Werte hat (content-box, padding-box und border-box), ist der beliebteste Wert border-box.
Heute verwenden die aktuellen Versionen aller Browser das ursprüngliche Box-Modell "Breite oder Höhe + Padding + Border = tatsächliche Breite oder Höhe". Mit box-sizing: border-box; können wir das Box-Modell in die einst "quirky" Weise ändern, bei der die spezifizierte Breite und Höhe eines Elements nicht durch Padding oder Rahmen beeinflusst werden. Dies hat sich im responsiven Design als so nützlich erwiesen, dass es seinen Weg in Reset-Styles gefunden hat.
An dieser Stelle fragen Sie sich vielleicht: "Ist es möglich, dass Old IE etwas richtig gemacht hat?" Viele Leute denken das.
Demo
Diese Demo zeigt, wie border-box responsive Layouts überschaubarer machen kann. Die Breite des übergeordneten divs beträgt 50%, und es hat 3 Kinder mit unterschiedlichen Breiten, Padding und Rändern. Klicken Sie auf den border-box-Button, um alle Kinder an den richtigen Platz innerhalb des Elternteils zu bringen.
Siehe den Pen Box Sizing Layout Demo von CSS-Tricks (@css-tricks) auf CodePen.
Gute, bessere und (wahrscheinlich) beste box-sizing Reset-Methoden
Das "alte" border-box Reset
Das früheste box-sizing: border-box; Reset sah so aus
* {
box-sizing: border-box;
}
Das funktioniert ziemlich gut, aber es lässt Pseudoelemente aus, was zu einigen unerwarteten Ergebnissen führen kann. Ein überarbeitetes Reset, das Pseudoelemente abdeckt, entstand schnell
Universelles Box-Sizing
*, *:before, *:after {
box-sizing: border-box;
}
Diese Methode wählte auch Pseudoelemente aus, was den normalisierenden Effekt von border-box verbesserte. Aber der Selektor * macht es Entwicklern schwer, content-box oder padding-box an anderer Stelle im CSS zu verwenden. Was uns zum aktuellen Favoriten für Best Practices bringt
Universelles Box-Sizing mit Vererbung
html {
box-sizing: border-box;
}
*, *:before, *:after {
box-sizing: inherit;
}
Dieses Reset bietet mehr Flexibilität als seine Vorgänger – Sie können content-box oder padding-box (wo unterstützt) nach Belieben verwenden, ohne sich Gedanken darüber machen zu müssen, dass ein universeller Selektor Ihr CSS überschreibt. Wir haben diese Technik und ihre Gründe in "Inheriting box-sizing Probably Slightly Better Best Practice" ausführlicher behandelt. Ein potenzieller Kritikpunkt ist, dass box-sizing normalerweise nicht vererbt wird, es ist also ein spezialisiertes Verhalten, nicht ganz dasselbe wie etwas, das man normalerweise in ein Reset aufnehmen würde.
Hersteller-Präfixe
Jeder aktuelle Browser unterstützt box-sizing: border-box; ohne Präfix, daher schwindet die Notwendigkeit für Hersteller-Präfixe. Aber wenn Sie ältere Versionen von Safari (< 5.1), Chrome (< 10) und Firefox (< 29) unterstützen müssen, sollten Sie die Präfixe -webkit und -moz wie folgt einfügen
html {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
*, *:before, *:after {
-webkit-box-sizing: inherit;
-moz-box-sizing: inherit;
box-sizing: inherit;
}
Bekannte Probleme
box-sizing: border-box; wird in den aktuellen Versionen aller wichtigen Browser unterstützt. Das weniger gebräuchliche padding-box wird derzeit nur in Firefox unterstützt. Umfassendere Informationen zur Browserunterstützung finden Sie in unserem Almanacheintrag zu box-sizing.
Es gibt einige Probleme mit älteren Versionen von Internet Explorer (8 und älter). IE 8 erkennt border-box nicht auf Elementen mit min/max-width oder min/max-height (dies beeinträchtigte früher auch Firefox, wurde aber 2012 behoben). IE 7 und älter erkennen box-sizing überhaupt nicht, aber es gibt ein Polyfill, das helfen kann.
Perfekter Eintrag! Danke!
Schönes nützliches Tutorial.
Schön, wusste nicht, dass das in IE8 funktioniert – also ist es eigentlich nutzbar ;)
Im Gegensatz zu "dekorativen" CSS3-Eigenschaften wie Text- oder Box-Schatten wird box-sizing Ihr Design total ruinieren, wenn der Browser es nicht versteht.
Sag nicht İE8, ich hasse ihn
Ich auch. Ich hasse IE-Versionen. Leider benutzen die Leute in meinem Land IE6 bis zu 10 Jahre später.
So wahr. Stellen Sie daher sicher, dass Sie Ihre Zielgruppe sehr gut kennen
Fantastisches Tutorial, das beste, das ich zu diesem Thema gesehen habe
Nur um es sinnvoller zu machen, könntest du die Zeile ändern….
„höhe + padding + border = tatsächliche sichtbare/gerenderte Breite des Rahmens“
Ich denke, es sollte heißen – gerenderte „Höhe“ des Rahmens.
Tolles Property, wenn man Layouts für Geräte mit Orientierungswechselmöglichkeit wie das iPhone erstellt.
Hallo,
Meine Lösung dafür: niemals Padding verwenden. Man erzielt den gleichen (optischen) Effekt, wenn man Innenabstände für innere Elemente festlegt. Dadurch wird alles richtig berechnet und behandelt.
Wenn Sie mehrere Elemente darin haben und nicht für jedes ein Margin festlegen möchten, gruppieren Sie sie in einem weiteren verschachtelten Div und legen Sie für dieses ein Margin fest, damit der Elternteil ein Padding erhält.
Beispiel
Natürlich fügt dies mehr Code hinzu, aber es ist so sicher wie möglich, browserübergreifend und sogar im Quirks Mode.
Aber wie macht man das mit dem Textfeld-Beispiel?
Interessanter Ansatz, Michael, *aber* verwirrt das nicht die Hintergründe? Paddings lassen mehr Hintergrund durchscheinen, während Margins die Hintergründe ganz ausschneiden. Ich denke, es könnte für einige Fälle funktionieren, in denen Ihr inneres Element 100% Inhalt ist.
Ich denke, wir können das verwenden
und
#elternteil {breite:35%; padding:15%; border:3px; }
#paddinghalter { padding:5%; border:2px;}
#inhalt { breite:100%; höhe:100px; }
Das ist etwas, das mich schon immer gestört hat.
Von Anfang an beim Erlernen von CSS/HTML dachte ich immer, es wäre logisch, dass hinzugefügtes Padding in die Box gelegt wird, nicht außerhalb. Es frustriert mich bis heute.
Bei mir genauso, Mann, ich denke auch definitiv, dass Padding zum Inneren der Elemente gehört, es ergibt einfach keinen Sinn…
Das Einzige, was IE richtig gemacht hat, hat der Standard falsch gemacht… c’est la vie
Du hast mir gerade den Verstand geraubt, yo.
*boom*
Toller Artikel! Ich komme aus Brasilien, ich verfolge Ihre Arbeiten schon seit einiger Zeit und lerne immer neue Dinge von Ihnen, herzlichen Glückwunsch.
Seltsamerweise habe ich gerade selbst damit gearbeitet! Bei der Erstellung eines Firefox-Addons verwende ich ein schönes flüssiges Layout, damit meine Abschnitte passen, egal welche Browsergröße Sie haben. Ich wollte aber auch einen sehr schönen "Facebook-Style"-Rahmen mit rgba-Farben, damit sie durchscheinend sind.
Wenn Sie eine Hintergrundfarbe für das Element festlegen und einen Rahmen anwenden, wird dieser nicht durchscheinend sein, da der Rahmen *technisch* über dem Inhalt liegt. Durch eine Mischung aus border-box und background-clip konnte ich den gewünschten Effekt erzielen, und das mit Leichtigkeit!
Ich hätte einen Link zu meinen Tests posten sollen… Ich entschuldige mich!
http://www.devseo.co.uk/examples/facebook-style-overlay-css/
Ich glaube, ich habe nie wirklich so darüber nachgedacht. Wenn man an cellpadding bei Tabellen denkt, hat es doch so funktioniert, dass das Padding in die Zelle eingreift und nicht hinzugefügt wird?
Ich muss Jason zustimmen und sagen, dass du mir damit definitiv den Verstand geraubt hast. Ein großes Grinsen lag auf meinem Gesicht, weil ich als großer Nerd es super faszinierend fand.
Hat mich immer wieder genervt, wenn ich eine Box mit einer spezifischen Größe erstellt habe, aber nach dem Einrichten mit Padding und einigen Rahmen war die Größe der Box völlig anders. Ich habe mir ein paar Mal den Kopf gekratzt, bis ich selbst experimentierte und herausfand, dass Padding + Rahmen die Ursache dafür waren.
Nichtsdestotrotz eine wunderbare Erklärung.
Man kann auch `display: table` verwenden, um Elemente in den Border-Box-Sizing-Modus zu versetzen.
LOL, was geht AJ? Wie läuft's bei Egghead? Wie zufällig.
Zum Thema: Wenn man sich für ein Box-Modell entscheiden muss, ist das W3-Box-Modell vielseitiger als das IE-Modell. Es stört mich, wenn Leute, die die Spezifikation nicht einmal gelesen haben, das W3-Modell als unterlegen betrachten, nur weil es weniger intuitiv ist.
Da wir jetzt die alternative Box-Größe haben, bekommen wir das Beste aus beiden Welten. Für IE6/7 im Standardsmodus konnte man CSS-Ausdrücke verwenden, um sie auf Linie zu bringen.
Ich vermute, dass diese Eigenschaft bald erweitert wird – ich kann mir andere Box-Sizing-Methoden vorstellen, die, ähnlich wie border-box, in speziellen Situationen nützlich wären. Ein Wert, um einem Blockelement anzuweisen, die gesamte verfügbare Höhe einzunehmen (so wie ein Blockelement die gesamte verfügbare Breite einnimmt), könnte unglaublich nützlich sein.
Du bekommst keine guten Themen mehr zum Schreiben.. stimmt das, Chris?
Ich habe festgestellt, dass border-box-Sizing so ziemlich zwingend erforderlich ist, wenn man einen Header und Footer mit fester Größe und scrollendem Inhalt, der in die Seite eingefügt ist (mit overflow-y: scroll), haben möchte. Es scheint der einzige Weg zu sein, um den Inhalt und alle seine übergeordneten Elemente zu 100% hoch zu machen, mit fester oberer und unterer Polsterung.
Sehr schön und nützlich. Es ist großartig, dass es in IE 8 funktioniert, und hoffentlich auch in IE 9.
All diese CSS3-Schönheiten und immer noch nicht so praktisch, endlich eine, die wirklich mit dem Design helfen könnte.
Die Idee von "praktischem" CSS3 ist zu diesem Zeitpunkt etwas außer Frage. Tatsächlich – wir nähern uns, aber wenn Sie eine Website entwerfen, die einen respektablen Traffic über einen Browser erhält, der CSS3 nicht unterstützt, möchten Sie Ihre Website nicht davon abhängig machen.
Nebenbei bemerkt, bin ich zuversichtlich, dass IE9 ziemlich standardkonform sein wird.
'border-box' muss ich mir merken, exzellenter Tipp. LT
Das ist definitiv gut zu wissen. Ich kämpfe damit jedes Mal, wenn ich ein neues Design mache. Ich habe die 3-spaltigen Eingabefelder über dem eigentlichen Kommentarformular schon seit einiger Zeit gemocht, aber ich bin für das neueste Design meiner persönlichen Website zum Standardlayout für das Kommentarformular zurückgekehrt, wegen dieses Problems. Auch wenn meine Website (noch) nicht flüssig ist, waren die Kommentare flüssig, seit sie diese coole neue Antwortfunktion in 2.8 oder so hinzugefügt haben. Ich werde diesen Artikel sicher bald wieder suchen.
Das ist einer der größten Fehler, die das W3C je gemacht hat. 1997 hatten über 95% des Browser-Marktes Browser, die das Box-Sizing-Modell (Quirk-Modell) verwendeten, oder Browser, die diese CSS überhaupt nicht verstanden. Das W3C hätte die Spezifikation an diesem Punkt ändern sollen, um die Realität (statt der Theorie) widerzuspiegeln und eine neue Eigenschaft hinzuzufügen: inner-padding.
Über box-sizing und border-box,
kann es auch in JQuery und traditionellem JS verankert werden
[identifier].style.boxSizing
und
[identifier].style.borderBox
Danke...
Als ich mir diesen Webbeitrag über die Behauptung von Facebook-Zielgruppen, die um das 17.000-fache daneben liegt, ansah, beschloss ich, dass CSS-Trick-Reguläre das überprüfen sollten
das aus! http://hubpages.com/hub/Lies-Damned-Lies-Statistics-ComScores-Facebook-Audience-Claims-Are-Wrong-By-A-Factor-Of-17-000 Laut ComScore ist der
durchschnittliche Facebook-Nutzer ist eine halbe Sekunde pro Tag online! Ja, klar!
Guter Artikel.
Sehr nützlicher Artikel! Das wird mir sehr helfen. Danke!
Hey, ich schätze diesen rechtlichen Trick sehr.
Exzellentes kurzes Tutorial. Ich hatte es satt, so viele verschiedene Werte deklarieren zu müssen, um Polsterungen und Rahmen zu beheben.
Danke!
„Aber hey, IE 9 steht kurz vor dem Start, das wird nicht mehr lange ein Problem sein“,
Außer, dass IE9 unter XP nicht läuft, was für manche Nutzer nicht nur einen neuen Browser, sondern einen neuen PC bedeutet.
IE9-Auslieferung ist kein magisches Heilmittel für Webentwickler. IE7 wird zum neuen IE6. Dann IE8. Und seien wir ehrlich, viele Entwickler werden sich noch jahrelang mit IE6 auseinandersetzen müssen (besonders diejenigen im Enterprise-Bereich).
IE7 stirbt schneller als IE6. Selbst wenn es das "neue IE6" wird, wird es kein weiteres "IE6" sein.
Die Leute rüsten ihre PCs langsam auf und das tötet stetig ältere IE-Versionen.
Ich glaube nicht, dass jemand einen neuen PC kaufen würde, nur um einen bestimmten Browser zu nutzen, aber wenn die meisten PCs, auf denen Vista und Win7 laufen, auf IE9 upgraden würden, könnten wir uns entspannen und wissen, dass zusätzliche 15 %+ CSS3 nutzen könnten. Offensichtlich wird das nicht über Nacht geschehen, aber der Anteil der IE9-Nutzung wird jeden Monat stetig wachsen.
IE9 ist vielleicht kein magisches Heilmittel, aber ich glaube, es qualifiziert sich zumindest als vergifteter Dolch.
Das ist ziemlich interessant. Ich wette, es stimmt… Hast du Daten gesehen, die das unterstützen?
http://marketshare.hitslink.com/browser-market-share.aspx?qprid=3
http://www.w3schools.com/browsers/browsers_explorer.asp
http://www.w3counter.com/trends
http://www.xmarks.com/topic/browser_statistics
Es gibt keine "weltweiten" Statistiken, aber die oben genannten zeigen einige Trends
Sehr cool.
Mir scheint, sie zeigen, dass sie ungefähr gleich schnell fallen, aber IE 7 hat noch einen größeren Anteil. Wenn sie also bei der gleichen Fallrate bleiben, wird IE 7 immer einen höheren Prozentsatz haben. Das wäre ziemlich verrückt, wenn IE 6 wieder höher als IE 7 wäre.
Interessant, aber nicht cross-browser : (
Ihr Demo-Code wird nicht funktionieren für
funktioniert nicht für doctype enthält
„http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“
Der beste Artikel aller Zeiten…
Das war schon immer mein größter Kritikpunkt am Erstellen von CSS-Layouts – nun ja, abgesehen von der Berücksichtigung aller Eigenheiten von Internet Explorer natürlich. Ironischerweise hat IE früher tatsächlich die Border-Box-Methode angewendet.
Danke für den Artikel. Ich werde das jetzt in all meine Websites einführen – scheiß auf IE 7. Habe ich das gesagt? Ich meine, wir werden eine fragwürdige Workaround-Lösung für IE in seinem eigenen Stylesheet finden oder so etwas.
Hallo, warum verwenden Sie im "lahmen Versuch" nicht einfach ein Padding von 3% und verwenden stattdessen einen Umriss statt eines Rahmens?
Danke für den tollen Artikel, er hat mir genau geholfen, worüber ich mich gewundert habe.
Ich hätte gerne ein "box-sizing: margin-box", dann wären Tricks wie dieser nicht nötig.
Hören W3C-Leute zu?
.navigation_main ul li a {
background-color: #FFFFFF;
border-radius: 5px 5px 0 0;
color: #003366;
font-size: 13px;
margin: 1.2px;
padding: 5px;
}
In diesem Code funktionieren Padding und Margin nur mit Chrome und Firefox, ich brauche, dass dieser Code auch für IE 9 funktioniert... aber die Ausrichtungsprobleme treten auf, helfen Sie mir, dieses Problem zu beheben..
http://jsfiddle.net/nsrau/ptt58/
SubtractJS bietet eine andere Perspektive auf das Box-Modell.
SubtractJS kann einen Rand eines Bildschirms oder einer beliebigen Box, die relativ oder absolut positioniert ist, ausfüllen. Es kann auch die gesamte Box ausfüllen.
Es passt die Größe des Inhalts so an, dass der Inhalt plus Polsterung, Rand und Abstand die enthaltende Box exakt ausfüllen.
Es ist großartig für die Erstellung von Sticky Headern, Footern oder Rändern sowie für das präzise Ausfüllen eines absolut oder relativ positionierten Elements.
Nur eine kleine Ergänzung.
Seien Sie gewarnt, dass Pseudo-Elemente ::after und ::before anscheinend nicht der Regel im allgemeinen Selektor folgen
* {box-sizing: border-box;
}
daher ist der beste Weg, sie so aussehen zu lassen, wie Sie es möchten, die box-sizing-Regel in der ::after/before-Deklaration selbst zu wiederholen.
Also, korrigieren Sie mich, wenn ich falsch liege, aber ich glaube, was ich höre, ist, dass Sie das Microsoft-Boxmodell bevorzugen und sich wünschen, dass alle Browser es standardmäßig immer so gemacht hätten.
Ich stimme zu.
Der Code wirft Warnungen in der Firefox-Konsole für (CSS-Warnungen)
box-sizing:border-box;Ist das ein Firefox-Bug?Hallo Chris,
Welche Lösung empfehlen Sie für IE7 – Kennen Sie einen leichten Polyfill?
Viele Grüße,
Dan
Persönlich würde ich nicht einmal versuchen, wenn ich IE 7 unterstützen müsste. Die alte Methode ist schwerer zu durchdenken, aber nicht SO viel schwerer. Ältere Browser mit einem Polyfill (mehr Code) zu bestrafen, fühlt sich nicht richtig an.
Danke für die schnelle Antwort, Chris.
Ich bin es so gewohnt, border-box zu verwenden und nicht einmal an IE7 zu denken, aber der Kunde, für den ich gerade arbeite, unterstützt ihn. Ich habe einen Polyfill in Erwägung gezogen, aber Sie haben Recht, das scheint ein bisschen übertrieben zu sein.
Wie immer eine tolle Teilung, danke Chris.
Für IE hängt die box-sizing-Eigenschaft vom IE Document Mode ab, sie funktioniert in „IE8 Standards Mode“ & höher. Sie wird also auch im IE8-Browser funktionieren, wenn der Document Mode „IE8 Standards Mode“ ist.