Heute ist der 1. Februar, den ich zum Internationalen Tag des Bewusstseins für box-sizing erklärt habe. Zu Ehren, Sie ahnten es bereits, der bescheidensten und am wenigsten gefeierten, aber dennoch großartigen und nützlichen CSS-Eigenschaft: box-sizing.
Das Datum entspricht Paul Irishs Beitrag, in dem er das Konzept vorstellte, es für jedes einzelne Element auf der Seite zu verwenden. Wir haben auch hier schon ein paar Mal darüber gesprochen.
Hier ist es, in all seiner Pracht
*, *:before, *:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
box-sizing vererbt sich normalerweise nicht, und Sie würden sie dazu zwingen, aber es erleichtert das Überschreiben auf Komponentenebene erheblich.Der Standardwert für box-sizing ist content-box, den wir hier überschreiben. Es gibt auch einen padding-box-Wert, der aber... ziemlich nutzlos ist, wenn Sie mich fragen. Wir werden gleich darauf eingehen, was das bedeutet.
Beachten Sie, dass wir den Selektor * verwenden, um alle Elemente auszuwählen, und auch Pseudo-Elemente dasselbe Modell verwenden lassen, die sonst nicht allein vom *-Selektor ausgewählt würden.
Hier ist die Situation der Browserunterstützung. „-“ = „diese Version und älter“. „+“ = „diese Version und neuer“.
*, *:before, *:after {
/* Chrome 9-, Safari 5-, iOS 4.2-, Android 3-, Blackberry 7- */
-webkit-box-sizing: border-box;
/* Firefox (desktop or Android) 28- */
-moz-box-sizing: border-box;
/* Firefox 29+, IE 8+, Chrome 10+, Safari 5.1+, Opera 9.5+, iOS 5+, Opera Mini Anything, Blackberry 10+, Android 4+ */
box-sizing: border-box;
}
In nicht allzu ferner Zukunft werden wir dafür überhaupt keine Präfixe mehr benötigen, aber ich überlasse diese Art von Dingen gerne Autoprefixer.
Warum die ganze Aufregung?!
Es macht die Arbeit mit Boxen so viel angenehmer.
Wenn Sie die Breite eines Elements festlegen, dann ist das die Breite, die es hat. Wenn Sie die Breite auf 25 % festlegen, nimmt sie 1/4 des horizontalen Platzes ein, der in ihrem übergeordneten Element verfügbar ist. Das war's.
Das ist nicht immer der Fall. Mit der Standard-Box-Sizing ist die tatsächlich gerenderte Breite, sobald ein Element entweder Padding oder einen Rand hat, breiter als die von Ihnen festgelegte Breite.
Tatsächliche Breite = Breite + linker Rand + rechter Rand + linker Abstand + rechter Abstand
Die Mathematik ist schlimm genug, aber in Kombination mit Prozentangaben (oder eigentlich jeder gemischten Einheit) ist das Ergebnis unmöglich im Kopf zu berechnen und, was noch wichtiger ist, führt zu einer nutzlosen Zahl, mit der man nichts anfangen kann.
Man kann es sich so vorstellen: Mit box-sizing: border-box drängen sich Padding und Rand in die Box hinein, anstatt die Box zu vergrößern. Das Ergebnis ist eine Box mit genau der Breite, die Sie festgelegt haben und auf die Sie sich verlassen können.
Spalten sind ein besonders nützlicher Anwendungsfall, aber dies ist jederzeit nützlich und wird zu einer dieser Dinge, die einfach die CSS-Entwicklung verbessern.
Denken Sie daran, Paul's Originalbeitrag zu lesen, der sich mit weiteren Themen wie Leistung (machen Sie sich keine Sorgen), jQuery (machen Sie sich keine Sorgen) und Drittanbieterinhalten (leicht zu beheben) befasst.
Frohen Internationalen Tag des Bewusstseins für box-sizing! Vielleicht können wir uns nächstes Jahr organisieren und alle coole eckige Sonnenbrillen oder so tragen.
Ich liebe das. Ich benutze es schon eine Weile und es ist einer meiner Lieblingsbestandteile von CSS. Erstellen Sie ein kleines Sass-Mixin, und Sie müssen sich nicht einmal alle Präfixe merken.
Dann
@include box-sizing;Das ist nützlicher, wenn Sie es nicht auf ALLES anwenden müssen, was in das Stylesheet eingebunden ist.
Das funktioniert einwandfrei! Nur ein paar Anmerkungen...
Oder verwenden Sie einfach einen Präprozessor, der die Präfixe für Sie erstellt, das hilft, Ihren Code sauber zu halten! Ich empfehle Prepros.
@chris Ich hatte keine Ahnung, dass Compass ein Mixin dafür hat. Wahrscheinlich sollte ich mir mal ansehen, was sie anbieten. Ich habe nur die Übergangs- und Transformations-Mixins verwendet.
Ich muss mich auch mehr mit der @extend-Eigenschaft beschäftigen, sie scheint großartig zu sein!
Ich habe einige Probleme damit, Autoprefixer mit CodeKit zum Laufen zu bringen. Ich werde weiter damit spielen.
Danke Chris! :)
Ich bin auf der Seite von Chris. Der universelle Selektor ist sehr passend für box-sizing, besonders bei responsivem Design, das Layouts zu allen Prozenten und so weiter macht.
Was nützt ein Mixin, wenn es nicht wiederholt werden muss. Ich finde Mixins am nützlichsten, wenn es sich um eine Eigenschaft handelt, die ich mehrmals verwenden muss und die Vendor-Präfixe benötigt. Der Wildcard
*kann alles abdecken, wie bereits im Artikel gezeigt*,*:before,*:after{box-sizing: border-box;}Border-box ist nett, aber content-box ist immer noch nützlich. Hier ist ein nützlicher Fall: Sie möchten, dass ein Element ein flüssiger Container ist, der zentriert ist und nicht mehr als 1000px breit wird, und trotzdem Padding hat, wenn das Browserfenster kleiner als 1000px ist.
Ich bin mir nicht sicher, ob ich das ganz verstehe. Einfache Demo. Wie beeinflusst box-sizing Ihre Fähigkeit, das zu tun?
Es ist einfach schön, zwischen den beiden wechseln zu können. In meinem Beispiel fungiert Padding als zweiter Rand, da ich den Rand verwende, um meinen Container zu zentrieren.
In meinem Fall möchte ich einen Container, in den ich Elemente legen kann, der nicht größer als genau 1000px wird. Da ich einen prozentualen Abstand an den Seiten verwenden möchte, ist es schwieriger, border-box zu verwenden, damit mein Innenbereich nicht größer als 1000px wird.
Hier ist ein Beispiel, wie man dasselbe tut wie im obigen content-box-Beispiel, nur mit border-box.
Ich musste calc verwenden, um das Padding zur max-width hinzuzufügen. Messen Sie nun das P-Element innerhalb des DIV, wenn Sie Ihren Browser breiter als 1048px dehnen, es ist genau 1000px.
Als ich vor zehn Jahren begann, HTML und CSS zu erkunden, war ich ein Kind (~12 Jahre alt) und habe es mit IE unter Windows ME versucht (ja, Sie lachen, ich weiß). :D
Dann entdeckte ich die „normalen“ CSS-Sachen (mit Firefox) und begann, das wahre Box-Modell zu lernen. Das Einzige, was ich an IE immer vermisst habe, war seine falsche Interpretation des Modells (ich meine, IE6 machte alles wie bei
border-box). Alsborder-boxherauskam, war ich so froh, dass meine Idee von„width: 100%“wieder verfügbar war. :)Um das klarzustellen, das ist ein kleines Missverständnis. Vor IE 6 war es so, aber IE 6 war das normale Box-Modell, außer im Quirks-Modus, der durch Dinge wie einen falschen oder fehlenden DOCTYPE ausgelöst wurde.
Dieser Wikipedia-Artikel erklärt es ziemlich gut.
Traditionell wurde aus Leistungsgründen ein robusteres Reset wie Eric Meyers empfohlen.
Wenn Sie bereits den universellen Selektor zur Anwendung von
box-sizingverwenden, gibt es dann einen Grund, nicht dieselbe Deklaration für Ihr Reset zu verwenden?Das ist mein Standard-Reset.
Sie sollten zu normalize wechseln. Universelle Resets sind so altmodisch.
An der Sache ist nichts „altmodisch“. Unterschiedliches Konzept mit unterschiedlichen Zielen. Persönliche Präferenz.
Persönliche Präferenz, ja. Allerdings sind universelle Resets „traditionell“ in der Tat „altmodisch“. Es ist nichts falsch an „altmodischen“ Ansätzen, solange sie noch funktionieren, aber Sie werden wahrscheinlich eher Normalize in Zukunft verwenden sehen, da Normalize ein feiner abgestimmter Ansatz ist, der nicht viel zusätzlichen manuellen Aufwand erfordert.
Letztendlich könnte man argumentieren, dass Normalize ein DRYer Ansatz ist. Natürlich ist Normalize nur ein Leitfaden. Jeder kann seine eigene „Normalize“-Routine haben, und Präprozessoren leisten derzeit gute Arbeit, um diese Art von Anpassung zu ermöglichen.
Das Standard-Box-Modell ist einer der schlimmsten Fehler, die das W3C je gemacht hat.
Microsoft hatte gelegentlich Recht mit der Annahme, dass Designer das Container und nicht den Inhalt dimensionieren wollten.
Als Ergebnis unterstützten IE6-7 (nativ – es gibt Workarounds mit CSS-Ausdrücken) kein Border-box-Sizing, es sei denn im Quirks-Modus, den niemand jemals verwenden sollte. Jemals.
Hoffentlich wird nächstes Jahr der Internationale Tag des Bewusstseins für FlexBox sein.
Ich wünschte, ich hätte überhaupt von dieser Art der Größenänderung gewusst. Ich muss so viele verschachtelte Elemente verwenden, um das zu erreichen – das wird einige meiner Codes wirklich aufräumen.
Als babygesichtiger Webdesigner hat das seine Vorteile; seit ich vor einem Jahr angefangen habe, CSS zu lernen, musste ich wegen der soliden Browserunterstützung auf breiter Front nie den älteren
box-sizing-Wert verwenden. Es machte das Erlernen des Float-basierten Layouts viel, viel einfacher und verhinderte viele potenzielle Frustrationen.Bootstrap 3 und Foundation 5 verwenden heutzutage standardmäßig
box-sizing: border-boxfür jedes Element. Das zementiert es für mich praktisch als Best Practice.Ich frage mich, ob Mozilla den Präfix jemals fallen lassen wird. Es gab Diskussionen darüber, ihn seit 2004(!) fallen zu lassen: https://bugzilla.mozilla.org/show_bug.cgi?id=243412
Sie haben es getan, es wird in Version 29 stabil sein, soweit ich weiß.
Großartiger Beitrag! Ich habe mehrere Blogbeiträge gelesen und von
box-sizing:border-boxgelesen, aber ich habe heute Abend tatsächlich einen CodePen erstellt, nachdem ich diesen Artikel gelesen hatte. Es ist ziemlich verdammt süß!Ich erinnere mich, als ich vor ein paar Jahren HTML/CSS lernte, hatte ich keine Ahnung von border-box oder calc. Eine Box zu erstellen, die einen bestimmten Prozentsatz der Seite ausfüllt UND einen Rand hat, war fast unmöglich. Man musste entweder wirklich seltsame Dinge mit HTML/CSS tun, keine Ränder verwenden oder JavaScript verwenden, was ich damals nicht sehr gut konnte. Ich bin so froh, dass diese Eigenschaft existiert, sie ist viel intuitiver.
Nachdem ich mit box-sizing gelernt hatte
border-box. Aber ein albernes Argument, das ich von alten Designern bekam (die immer nochtable tr tdbefolgen, ist, dass es sehr schwierig ist, das Layout separat von IE-6/6-Versionen zu dimensionieren. Daher ist es besser, für alle Inhalte
content-boxzu verwenden, anstatt Resets!„— Aber ich dachte, es ist richtig für Leute, die PSD-Webvorlagen mit Photoshop-Slicern kopieren!
Wenn Sie für IE 5 und darunter entwickeln, ist das das geringste Ihrer Probleme.
Ich bin nur wenige Tage bevor Paul seinen Originalbeitrag veröffentlichte auf den fantastischen Vorteil dieses Code-Snippets gestoßen und benutze es seitdem.
Wie MaxArt oben erwähnt, wird dieses CSS nicht von IE6 und IE7 unterstützt, was wahrscheinlich für die meisten Leute kein Problem ist.
Ich musste IE7 für ein Projekt unterstützen, als ich noch LESS verwendete. Also habe ich auf CodePen ein einfaches Mixin geschrieben, um einen Fallback für IE6-7 zu erstellen, indem eine bedingte Klasse zum HTML hinzugefügt wurde.
Ich benutze jetzt Sass und das schon seit Mitte 2012, also habe ich beschlossen, dieses Mixin mit Sass neu zu erstellen, das ich ebenfalls auf CodePen habe.
Ich habe auch Ende letzten Jahres auf meinem Blog darüber geschrieben, wie es funktioniert.
Dieses Mixin ist auch in meiner kleinen Sass-Bibliothek enthalten – Sassifaction
In der Tat ein GROSSES HOCH! All das Herumfummeln mit Prozentangaben ist jetzt Geschichte! Danke!!!
Der Stern (
*) vor dem Pseudoelement-Namen ist unnötig.*, :before, :afterist ausreichend.Übrigens konnte
box-sizingzum Zeitpunkt von Pauls Schreiben noch nicht wirklich global verwendet werden, da Firefox einen Bug hatte, der zu einer falschen Berechnung vonmin-height/max-heightin Verbindung mitbox-sizing: border-boxführte. Seitdem wurde der Bug in Firefox 17, veröffentlicht im November 2012, behoben, und nun kann die Standard-box-sizing: border-boxtatsächlich verwendet werden.Wahr bei der Selektornamengebung! Der Stern steht im Grunde für „jedes Element“, was dasselbe bedeutet, wie nichts zu sagen. Genau wie
*.classdasselbe ist wie.class, auch in Bezug auf die Spezifität, da*keine hat. (Testfall).Gute Erinnerung an diese Min-/Max-Saga. Ich bin mir nicht sicher, ob sie es unbrauchbar gemacht hätte, aber es war sicherlich etwas, das Aufmerksamkeit brauchte.
Bis vor kurzem habe ich es hauptsächlich verwendet, um responsive Formulare richtig zu verhalten, und ich war ein wenig schockiert, als jemand bei der Arbeit vorschlug, es global zu verwenden. Jetzt ist es als Teil meines Resets in jedem Projekt enthalten.
Wundervoll! Ich wusste es nicht! Das wird das Leben so viel einfacher machen. Danke Chris!
Ich bin noch ganz neu in der Webentwicklung und ehrlich gesagt scheint das alles viel komplizierter zu sein, als es sein muss; dieser kleine Trick hat meine Karriere in der Webentwicklung definitiv erleichtert. Vielen Dank.
Ich habe in einigen Projekten JavaScript verwendet, um diese Probleme zu beheben, und Divs in Divs verschachtelt, um zu verhindern, dass Inhalte aus den Grenzen austreten. Danke für diese Information! Sie ist sehr nützlich für mich! ;)
Ich versuche, jeden Tag zum Internationalen Tag des Box-Sizing zu machen. Ich kann seine Vorzüge nicht genug loben. Jedes Mal, wenn ich ein Layout von einem der Designer bei der Arbeit zur Behebung erhalte, ist das Hinzufügen die erste Korrektur, die ich vornehme. Voilà, die Dinge richten sich aus.
Warum benutze ich kein box-sizing?!
Ich persönlich hasse Resets, aber dies ist ein Code-Snippet, das ich zuerst auf alles anwende. Und seitdem ich es benutze, habe ich einen Bruchteil der Cross-Browser-Probleme. Es hat mich wahrscheinlich Hunderte von Stunden bei der Fehlersuche zwischen IE und allen anderen erspart.
Wieder einmal muss ich nur zufällig diese Seite besuchen und lerne etwas super Nützliches. Danke Chris (und ursprünglich Paul)!
Ich bin überrascht, dass Leute das noch nicht kannten… das allein bläst mich um.
Ich stimme zu! Guter Grund für jemanden mit dem weitreichenden Publikum, das Chris hat, weiterhin über solche Dinge zu bloggen. Manchmal konzentrieren wir uns so sehr auf die Zukunft und die Gegenwart, dass wir vergessen, wie herausfordernd es sein kann, Schritt zu halten. Manchmal bedeutet, in einem Projekt für 6 Monate stecken zu bleiben, in dem man keine Zeit hat, Schritt zu halten, dass man wichtige Dinge wie diese verpasst.
Bin ich der Einzige, der es vorzieht, die Browser-Standard-Content-Box zu belassen und nur dann Border-Box anzuwenden, wenn es nötig ist? Dann muss ich in meinem CSS nicht mehr auf Content-Box zurückstellen, wann immer das sinnvoll ist. Beide Box-Modelle sind in bestimmten Situationen sinnvoll und auf den meisten Elementen einer Seite machen sie keinen Unterschied.
Jedenfalls fühlt es sich für mich sauberer an, Border-Box nur dort anzuwenden, wo es nötig ist, keine große Sache, wenn Leute es anders bevorzugen.
Ich weiß, worauf Sie hinauswollen, aber sobald Sie zu einem universellen Selektor wechseln, finden Sie alle möglichen Stellen, an denen er nützlich war. Besonders gilt das für alles Responsive.
Da es nur sehr wenige Nebenwirkungen gibt, ist es eine Sache weniger, die man berechnen muss. Es funktioniert einfach.
Border Box ist mein bester Freund in der CSS-Welt.
Ich sterbe immer noch ein bisschen innerlich, jedes Mal, wenn ich erkenne: „Mann, der IE6 hatte es mit dem Box-Modell ehrlich gesagt richtig.“
Unabhängig davon ist es die Wahrheit.
Warum? Damals war IE6 der beste und modernste Browser bei weitem.
Es war nicht IE6, es war IE5.5 und früher. IE6 tat dies nur im Quirks-Modus (der meiner Meinung nach absichtlich war, um abwärtskompatibel mit dem IE5.5-Box-Modell zu sein). IE6 rendert das Box-Modell einwandfrei, abgesehen von einigen (zugegebenermaßen schwerwiegenden) Float/Margin-Bugs und anderen Layout-Problemen.
Nichts war falsch an IE6, als er herauskam. Er war dem Rest der Browser weit voraus, als er herauskam. Es ist nur so, dass sie aufgehört haben zu innovieren, bis das Monopol bedroht war.
Das wird mein Leben so viel einfacher machen. Danke Chris!
Dieses Snippet ist ohne Zweifel in meinem Standard-CSS enthalten. Endlich jemand, der Bewusstsein für etwas schafft, das mir wirklich am Herzen liegt! (Vielleicht ironisch gemeint, aber trotzdem)
Danke, ich hatte keine Ahnung, dass das existiert... danke.
Danke Chris, dass Sie diesen wichtigen Artikel geteilt haben. Ich hatte dieses Problem vor ein paar Wochen, als ein Kunde eine feste Box mit 300px Breite benötigte, und nachdem ich dieser Box Rand und Padding hinzugefügt hatte, stellte ich fest, dass die Breite der Box über 300px hinausging. Bei näherer Inspektion in Firebug-Layout berechnete ich die Breite mit der von Ihnen erwähnten Formel als 305px. Jetzt ist es gut, box-sizing anstelle der Berechnung von Breiten zu verwenden. Danke
Jemand sollte CSSLint benachrichtigen. Ich benutze das Programm nicht, weil es das Verwenden des globalen Elements zum Stylen von irgendetwas hasst, und ich werde nicht jedes bekannte und möglicherweise unbekannte HTML-Element mit einer Reset-Datei laden. Ich mag Linting-Tools wirklich, ich wünschte nur, erstaunliche Korrekturen wie diese kämen in dieses hinein.
Ich liebe box-sizing.
Ich stellte fest, dass ich es immer zu vielen Elementen hinzufügte, dann erfuhr ich von der Methode der Auswahl von Elementen (
*)Ich gebe zu, es hat mir Kopfschmerzen bereitet, als ein Element einfach nicht richtig funktionierte, es lag am box-sizing. Aber sobald ich verstand, was die Ursache war, war es eine einfache Lösung (vielleicht am Container usw.).
Daher bevorzuge ich die Auswahl aller Elemente und die eine Modifikation, um ein kleines Problem zu beheben.
Ich habe mich gefragt, ob ich das tun soll – jetzt werde ich es tun!
Entschuldigen Sie meine Unwissenheit, aber ich kann nicht verstehen, warum Sie die Pseudo-Elemente before und after brauchen?
Weil der globale Selektor sie nicht auswählt.
Oh ja, danke!
Wow!!! Ich habe das schon eine Weile gesehen, aber ich habe mich nie darum gekümmert, herauszufinden, was es bedeutet. Jetzt, wo ich weiß, was es tut, werde ich es die ganze Zeit verwenden. Danke
Sass + Compass
Ich benutze box-sizing wie ich Deo benutze.
Ein Projekt, an dem ich arbeite, verwendete den Ansatz mit globalen und Pseudo-Selektoren. Eines unserer wichtigen Layout-Elemente wurde in Firefox, von allen Browsern, überhaupt nicht richtig gerendert. Es dauerte ewig, bis ich die Lösung fand (einfach width: 100% angeben: was man für unnötig halten würde). Viel zu lange sah es wie ein Rendering-Problem aus, das durch das globale box-sizing: border-box; verursacht wurde.
Ich glaube, ich bin der Einzige, der den globalen Ansatz ablehnt. Entschuldigung Chris (und Entschuldigung Paul Irish, der eine ähnliche Veröffentlichung hat). Ich verstehe die Frustration, die das Content-Box-Modell verursacht (ich habe diesen Schmerz auch erlebt), aber ich glaube, die Probleme, die es verursacht, treten nur bei einer Handvoll Containern pro Seite auf. Für mich rechtfertigt das nicht die Verwendung eines globalen Selektors, der das Layoutmodell der gesamten Seite radikal verändert.
Ich stelle fest, dass dies nicht für das Button-Element funktioniert.
http://codepen.io/NickToye/pen/rCmED