2013-10-24 13 views
5

ich über ein Stück CSS Code wie folgt gekommen sind:Seltsam Backslash und Verhalten in CSS

p { 
 
    color: white; 
 
} 
 
\p { 
 
    background: green; 
 
} 
 
\* { 
 
    background: #bcc; 
 
} 
 
body \2a { 
 
    background: red; 
 
} 
 
.recover { 
 
    background: #6ea; 
 
    color: black; 
 
} 
 
div { 
 
    border: 2px solid blue; 
 
} 
 
ul, 
 
li, 
 
a { 
 
    background: none; 
 
}
<p>This should have a green background</p> 
 
<div>This should have no background color</div> 
 
<p class="recover">CSS has recovered</p>

In Firefox und Internet Explorer 10 das Ergebnis wird, wie in der HTML beschrieben. Aber in Chrome ist es total anders.

Was ist die Verwendung der umgekehrten Schrägstriche in diesem Beispiel?

+6

Sie sind CSS-Hacks, Ziel und Stil, eine Interpretation des CSS des bestimmten Browser; Referenz: [http://css-tricks.com/snippets/css/browser-specific-hacks/](http://css-tricks.com/snippets/css/browser-specific-hacks/). –

+2

Es ist, was @DavidThomas erzählt, aber es wird auch verwendet, um die Sonderzeichen zu entkommen, die in den Selektoren verwendet werden http://reference.sitepoint.com/css/hacks –

+0

@fabregaszy Ich realisiere, dass dies eine alte Frage ist, aber hat meine Antwort geklärt Ihre Fragen? –

Antwort

2

Die Schrägstriche in dieser Instanz werden zum Maskieren von Zeichen verwendet.

body \2a ist effektiv body * als \2a die Version von * codiert ist. W3C stellt fest, dass (fett für Klarheit hinzugefügt):

In CSS-IDs (einschließlich Elementnamen, Klassen und IDs in Selektoren) nur die Zeichen enthalten [a-zA-Z0-9] und ISO 10646 Zeichen U + 00A0 und höher, plus Bindestrich (-) und Unterstrich (_); Sie können nicht mit einer Ziffer, zwei Bindestrichen oder einem Bindestrich beginnen, gefolgt von einer Ziffer. Bezeichner können auch maskierte Zeichen und jedes ISO 10646-Zeichen als numerischen Code enthalten (siehe nächster Punkt). Zum Beispiel die Kennung "B & W?" kann geschrieben werden als "B \ & W \?" oder "B \ 26 W \ 3F".

Characters und Fall (https://www.w3.org/TR/CSS2/syndata.html#characters)

Die folgende Tabelle zeigt, dass 2a der Code hex für *:

Unicode code point character UTF-8 (hex.) name
U+002A    *   2a    ASTERISK

UTF-8-Codierung Tabelle und Unicode-Zeichen ers (http://www.utf8-chartable.de/)

\* und \p ist eine weitere Methode Zeichen zu entkommen, wie durch W3C (fett hinzugefügt für Klarheit) erwähnt:

Zweitens ist es, die Bedeutung von speziellen CSS-Zeichen löscht. Jedes Zeichen (außer einer hexadezimalen Ziffer, Zeilenvorschub, Wagenrücklauf oder Seitenvorschub) kann mit einem Backslash versehen werden, um seine spezielle Bedeutung zu entfernen. Zum Beispiel: „\““ist eine Zeichenfolge aus einem doppelten Anführungszeichen besteht. Stylesheet Preprozessoren dürfen diese Schrägstriche aus einem Stylesheet entfernen, da dies die Bedeutung des Stylesheet ändern würde.

Charaktere und Fall (https://www.w3.org/TR/CSS2/syndata.html#characters)

p ist keine hexadezimale Ziffer (das sind die Zahlen 0-9 und die Buchstaben AF), daher behandelt es \p als Standardregel.Wenn die Regel \a wäre, würde sie ignoriert, da a eine hexadezimale Ziffer ist, während \s geehrt werden würde, wie es nicht ist (siehe \a und \s im Schnipsel unten).

Firefox akzeptiert maskierte Zeichen in Klassenbezeichnern (siehe unten im Snippet unter .B\26 W\3F), scheint sie jedoch als universellen Selektor zu ignorieren (*), weshalb die Stile nicht angewendet werden. Sowohl Chrome als auch Firefox ignorieren angrenzende Selektoren (+).

Aus diesem Grund ist in Chrome es verursacht:

  • Die background-colour von <p>This should have a green background</p> zu sein red als body * gleich Spezifität p hat, aber nachdem es im Stylesheet platziert
  • Die background-colour von <div>This should have no background color</div> zu sein red wie es die Regel entspricht und es gibt keine anderen zu überschreiben background-colour dieses Elements
  • Die background-colour von html, body usw. zu sein #bcc wie die \* Regel
  • angepasst wird ist

Schwer zu sagen, welches das richtige Verhalten ist, wäre es einfach scheint, dass der spec auf leicht unterschiedliche Weise interpretiert wurde.

Warum diese Regeln verwendet werden, ist die einzige mögliche Erklärung, dass der Autor versucht, bestimmte Browser mit bestimmten Stilen zu zielen.

p { 
 
    color: white; 
 
} 
 
\p { 
 
    background: green; 
 
} 
 
\* { 
 
    background: #bcc; 
 
} 
 
body \2a { 
 
    background: red; 
 
} 
 
.recover { 
 
    background: #6ea; 
 
    color: black; 
 
} 
 
.recover:after { 
 
    content: '\2a'; 
 
    display: block; 
 
} 
 
div { 
 
    border: 2px solid blue; 
 
} 
 
.B\26 W\3F { 
 
    background: black; 
 
    color: white; 
 
} 
 
.B\26 W\3F \2b div { 
 
    background: purple; 
 
    color: white; 
 
} 
 
\a { 
 
    border: 2px solid blue; 
 
} 
 
\s { 
 
    border: 2px solid blue; 
 
}
<p>This should have a green background</p> 
 
<div>This should have no background color</div> 
 
<p class="recover">CSS has recovered</p> 
 
<p class="B&W?">Encoded test</p> 
 
<div>Encoded adjacent test</div> 
 
<a href="#">Hexadecimal digit</a> 
 
<s>Non hexadecimal digit</s>