Immer wenn Sie eine Kurzschreibweise (Shorthand-Property) in CSS verwenden, legen Sie *alle* Werte für alle Eigenschaften fest, die diese behandelt. Das ist kein Bug, sondern einfach die Funktionsweise von CSS. Ich habe schon oft gesehen, wie dies Leute verwirrt hat. Lassen Sie uns das Problem beleuchten, um es hoffentlich besser verständlich zu machen.
Hier ist ein Beispiel:
.module {
background-repeat: no-repeat;
background: url(lion.jpg);
/* Oops! This will repeat. */
}
Die CSS-Kurzschreibweise background überschreibt alle Untereigenschaften. Der Standardwert für background-repeat ist repeat, also wird er auf diesen Standardwert gesetzt, wenn er nicht in der Kurzschreibweise deklariert wird.
Das funktioniert bei jeder einzelnen Hintergrund-Untereigenschaft so.
.module {
/* This will get set to `repeat` */
background-repeat: no-repeat;
/* This will get set to `0 0` */
background-position: top right;
/* This will get set to `auto auto` */
background-size: 100px;
/* This will get set to `scroll` */
background-attachment: fixed;
/* This will get set to `border-box` */
background-origin: content-box;
/* This will get set to `border-box` */
background-clip: padding-box;
/* This will get set to `transparent` */
background-color: red;
/* This will get overridden */
background-image: url(cool.png);
/* OVERRIDE */
background: url(lion.jpg);
}
Dies ist auch bei Box-Modell (und verwandten) Dingen der Fall, wie zum Beispiel
.module {
margin-right: 20px;
margin: 10px;
/* margin-right will be 10px now */
padding-top: 30px;
padding: 10px;
/* padding-top will be 10px now */
border-left: 1px;
border: 0;
/* border-left will be removed */
}
Schriften sind eine weitere Situation, in der Sie sich versehentlich zurücksetzen können.
p {
/* Will get reset to what is set in shorthand (required) */
font-family: Sans-Serif;
/* Will get reset to what is set in shorthand (required) */
font-size: 24px;
/* Will get reset to `normal` */
line-height: 2;
/* Will get reset to `normal` */
font-style: italic;
/* will get reset to `normal` */
font-weight: bold;
/* will get reset to `normal` */
font-variant: small-caps;
/* OVERRIDE */
font: 16px Serif;
}
Beachten Sie, dass die Kurzschreibweise mindestens font-family und font-size benötigt, um zu funktionieren.
Listen sind noch ein weiterer Fall.
ul {
/* Will get reset to what is set in shorthand */
list-style-type: square;
/* Will get reset to `outside` */
list-style-position: inside;
/* Will get reset to `none` */
list-style-image: url(cooldot.png);
/* OVERRIDE */
list-style: disc;
}
Die Eigenschaft flex als Teil des Flexbox-Layouts ist ebenfalls eine Kurzschreibweise.
.flex > span {
/* Will be reset to `auto` (or `main-size` if supported) */
flex-basis: 150px;
/* Will be reset to `1` */
flex-grow: 0;
/* Will be reset to `1` */
flex-shrink: 0;
/* OVERRIDE */
flex: auto;
}
Das ist jedoch ein ungewöhnlicher Fall, da die Kurzschreibweise nicht wie üblich Dinge zurücksetzt, die man nicht zurücksetzen möchte, sondern sie auf eine Weise zurücksetzt, wie man es wahrscheinlich möchte und vielleicht nicht einmal weiß. Fantasai
Wir (die Redakteure der Flexbox-Spezifikation) empfehlen dringend, die Langschreibweisen von 'flex' nicht zu verwenden, es sei denn, Sie möchten wirklich, wirklich Flexbox-Einstellungen von einer anderen Stilregel übernehmen. Daher schlage ich vor, die Verwendung von 'flex-grow/shrink/basis' hier irgendwie zu unterbinden (oder, vorzugsweise, sie wegzulassen/in einem erweiterten Abschnitt zu platzieren). Die Kurzschreibweise setzt Dinge auf angemessene Weise zurück und führt daher zu weniger Kaskadenfehlern. Bitte verwenden Sie die Kurzschreibweise!
Hier ist ein Pen mit einigen dieser Dinge im echten Code.
Ich denke, Sie sollten in diesem Fall erwähnen, dass es auch eine "inherit"-Eigenschaft gibt, so dass Sie z. B. schreiben können
Und es wird nur URL und Position neu geschrieben, aber Farbe und Wiederholung beibehalten.
Nun ja. `inherit` hat eine besondere Bedeutung. Es überschreibt immer noch andere Eigenschaften, die im selben Selektor gesetzt sind. Zum Beispiel:
Welche Hintergrundfarbe wird der Div haben? Blau, nicht rot.
Ich sage meinen Kunden und Praktikanten immer, sie sollen "Reset" vor allem anderen platzieren. Dann fügen Sie Ihre Stile danach hinzu. ;)
Ich sage ihnen die Quintessenz: Alles in der nächsten Zeile CSS ist die neueste "Überschreibung" wie in Ihren Beispielen oben. :)
Auch wenn man mit IE7 arbeitet, werden Kurzschreibweisen für Margins nicht zurückgesetzt, beide Margins werden addiert.
Z.B.
Eine ernste Frage: Lohnt es sich im Jahr 2015 überhaupt, über IE7 nachzudenken?
Nicht für jeden, es kommt ganz auf die Website an. Dafür gibt es Analysen. Leider bekomme ich immer noch viel davon.
Ohne böse Absicht, aber ich habe Kunden empfohlen, IE7 nicht mehr zu verwenden, da ihr Sicherheitssystem veraltet ist, während XP nicht mehr unterstützt wird. Nur so gesagt.
Genau aus diesem Grund versuche ich, Leute davon abzubringen, Kurzschreibweisen zu verwenden, es sei denn, Sie setzen absichtlich alle Eigenschaften in der Kurzschreibweise. (Und in einigen Fällen sind mehr Dinge impliziert, als Sie normalerweise berücksichtigen). Die Disziplin, immer jede Eigenschaft in der Kurzschreibweise festzulegen (mit `inherit`, wenn Sie möchten), vermeidet auch überraschendes Verhalten, wenn der Standardwert nicht ganz das ist, was Sie erwarten.
Ich glaube nicht, dass Sie durch die Verwendung von Kurzschreibweisen wirklich viel Platz sparen, da die Komprimierung einen Großteil der zusätzlichen Größe wieder wettmachen wird.
Es geht auch um Dokumentation. Die Verwendung von `background-color`, auch wenn Sie wissen, dass keine anderen Hintergrund-Eigenschaften gesetzt sind, macht deutlich, was Sie vorhaben.
Yup! Das ist etwas, auf das ich früher auch gestoßen bin. Ich benutze normalerweise die Kurzschreibweise für die "Basisstile" eines Elements und die spezifischeren Attribute für überschreibende Stile oder Modifikatorklassen. Funktioniert für mich meistens ziemlich gut.
Gerade die Anmerkung der Flexbox-Spezifikationsredakteure bemerkt. Yup, das ist fast genau so, wie ich normalerweise mit allen Kurzschreibweisen umgehe. Ich mag sie, es sei denn, sie überschreiben ausdrücklich etwas anderes.
@David: Ich glaube, Sie irren sich (nicht, dass es heutzutage so wichtig wäre :)), aber IE7 hat keine Probleme mit dem Zurücksetzen von horizontalen Rändern und addiert sie nicht zusammen (es sei denn, es gibt einen speziellen Fall, den ich nicht kenne).
Es gibt einen Fehler in IE6/7 bei margin:auto, bei dem die Standard-Vertikalränder eines Elements (wie z.B. eines p-Elements) nicht auf Null zurückgesetzt werden.
Es gibt auch den berühmten doppelten Margin-Bug bei Floats in IE6 (behoben mit display:inline), der aber in IE7 nicht auftritt.
Ich hatte irgendwie gehofft, `cool.png` und `lion.png` zu sehen. Sie klingen nach coolen Bildern.
ho. lee. crap.
die Menge an Herumfummelei, die das erklärt...
Ich liebe CSS. Ich hasse CSS. Ich liebe CSS. Ich hasse CSS
Wow, ich bin so froh, dass Sie das erwähnt haben! Ich hatte keine Ahnung! Ich wette, das ist die Ursache für viele meiner Probleme. Ich liebe diese Seite!
Ich bin ein bisschen süchtig nach Kurzschreibweisen, aber in letzter Zeit versuche ich, Kurzschreibweisen größtenteils aus meinem Code herauszuhalten, aus einigen der oben genannten Gründe. Schöner kleiner Beitrag, der sich für jeden Anfänger (und einige Veteranen) als kleiner Augenöffner lohnt.
Es ist nur ein Fehler, wenn Sie die Kurzschreibweise nach den anderen Langschreibweisen platzieren.
Ich stimme vollkommen zu. Ohne über Resets nachzudenken, hatte ich immer Kurzschreibweisen vor Langschreibweisen.
Das Problem ist fast nie, dass Sie Kurzschreibweisen und spezifische Eigenschaften in verschiedenen Selektoren platzieren und diese auf unerwartete Weise angewendet werden.
Es wäre eine interessante (wenn auch schwierige) Übung, Websites zu durchforsten und zu sehen, wie oft Dinge wie Selektor-Stopfen (`html body div > .allredborders`) und `!important` verwendet werden, um unerwartetes Verhalten von Kurzschreibweisen zu überwinden.
Meine pingeligen zwei Cents.
Die Box-Modell-Dinge sind anders als die anderen. Während die anderen fehlenden Werte auf ihren initialen (oder Standard-) Zustand zurücksetzen, tun dies die Eigenschaften `border`, `margin` und `padding` nicht. Sie erben einfach angenommene Werte von den vorhandenen. Daher würde ich diese nicht wirklich als dasselbe klassifizieren, da in diesem Fall immer beabsichtigt ist, die fehlenden Werte zurückzusetzen.
Außerdem ist die Schrift-Kurzschreibweise wirklich die einzige, die Leute in die Irre führt, da typografische Eigenschaften in Kindelemente weitergegeben werden. Wenn Sie also z.B. eine `font-size` für das `body`-Element festlegen und dann eine Schrift-Kurzschreibweise für Absätze festlegen, sehen Sie plötzlich, wie die Schriftgröße verschwindet, weil Sie erwarten, dass sie weitergegeben wird. Deshalb denke ich, dass die Schrift-Kurzschreibweise nur für das `html`-Element oder das `body`-Element verwendet werden sollte.
Bei Dingen wie der Listen-Kurzschreibweise (oder vielen der anderen, die Sie erwähnt haben) erwarten Sie nicht, dass ihre Werte wie typografische Werte weitergegeben werden (und das tun sie auch nicht), so dass das Zurücksetzen von Werten in diesen Fällen selten, wenn überhaupt, ein Problem darstellt.
Hoppla... Eine Korrektur: Ich sagte "font-size setzen" für den Body, aber das wird nicht angewendet, weil font-size für die Schrift-Kurzschreibweise erforderlich ist. Jede andere Eigenschaft (wie font-variant) würde meinen Punkt genauer veranschaulichen.
Eine etwas andere Perspektive aus einem spezifischen Szenario: Ich arbeite an einer großen Website (~400 Millionen Benutzer) und wir konzentrieren uns stark auf Leistung und geringes Seiten-Gewicht. Die Website hat viele Hintergrundfarben, und wir deklarieren die Eigenschaft mit "background" anstelle von "background-color", da sie 6 Zeichen kürzer ist. Wir haben sehr wenige Hintergrundbilder, daher müssen wir uns keine Sorgen über versehentliche Resets machen und können bei Bedarf einfach spezifischer werden.
Die beste Vorgehensweise, die ich anwende (und mit der ich absolut einverstanden bin), ist die Verwendung von Kurzschreibweisen, gefolgt von der Überschreibung mit Langschreibweisen (:D)
So stelle ich sicher, dass ich meine vorherigen Codes nicht versehentlich zurücksetze.
Danke für die Blogs! Man vergisst leicht manchmal das erste C von CSS, "Cascading" (Kaskadierend) und auch das unsichtbare dritte S von CSS "Specificity" (Spezifität).
Machen Sie weiter so!
In diesem Beispiel wird `border-radius` nicht zurückgesetzt.
`border-radius` ist nicht Teil der `border`-Kurzschreibsyntax. Deshalb wird es nicht zurückgesetzt.
@Homan
Die `border-image`-Eigenschaften sind ebenfalls nicht Teil der `border`-Kurzschreibweise, aber sie werden trotzdem zurückgesetzt.
Tatsächlich empfehlen die Spezifikationen ausdrücklich die Verwendung der `border`-Kurzschreibweise, um alle anderen grenzbezogenen Eigenschaften zu löschen.
Warum ist `border-radius` nicht enthalten? Vielleicht, weil es trotz seines Namens nicht nur den Rand, sondern auch den Padding-Bereich und alle Hintergründe beeinflusst. Oder vielleicht gab es keinen logischen Grund dafür, es ist einfach so passiert. So oder so, es ist eine zusätzliche Komplikation, die man sich merken sollte.
Google Chrome hat mir geholfen, CSS-Resets mit den "Developer Tools" zu verstehen, wie Sie hier sehen können.