Elemente können mehrere Klassennamen haben. Zum Beispiel
<div class="module accordion expand"></div>
Dann könnten Sie in CSS dieses Element anhand einer beliebigen davon abgleichen
/* All these match that */
.module { }
.accordion { }
.expand { }
Sie können Ihre Selektoren so einschränken, dass sie nur dann übereinstimmen, wenn mehrere davon vorhanden sind, zum Beispiel
// Will only match if element has both
.accordion.expand { }
Aber was ist mit anderen Attributen?
Klassen sind in der oben genannten Fähigkeit einzigartig. Andere Attribute werden nicht als „mehrere Werte“ behandelt, nur weil sie ein Leerzeichen enthalten. Zum Beispiel
<div data-type="module accordion expand"></div>
Dieses Element hat nur ein data-type-Attribut mit dem Wert „module accordion expand“, nicht drei eindeutige Werte „module“, „accordion“ und „expand“. Aber sagen wir, wir *wollten* Elemente anhand einzelner Werte auswählen können, so wie wir es mit Klassennamen können.
Das könnten wir tun, indem wir einen „*“ Substring-Matching Attributselektor verwenden, der übereinstimmt, wenn die angegebene Zeichenfolge irgendwo im Wert vorkommt
[data-type*="module"] {
}
oder nur übereinstimmen, wenn mehrere bestimmte „Werte“ vorhanden sind
[data-type*="accordion"][data-type*="expand"] {
}
Noch besser, verwenden Sie den durch Leerzeichen getrennten Selektor (z.B. [data-type~="expand"]). So werden Sie nicht durch etwas wie „expand“ getäuscht, das „expander“ abgleicht, obwohl Sie das nicht wollten.
[data-type~="accordion"][data-type~="expand"] {
}
Funktioniert in IE7+ (weil IE 7 der erste IE war, der Attributselektoren unterstützte)
Cool!
Würden Sie das persönlich jemals auf einer Ihrer Websites verwenden, Chris? Ich kann mir vorstellen, Datenattribute mit JavaScript zu kombinieren, aber CSS-Selektoren für Datenattribute erscheinen seltsam. Es müsste bis zu einem gewissen Grad generisch sein und wäre meiner Meinung nach leicht als Klasse implementierbar. Es ist auch weitaus vertrauenswürdiger, da die Kompatibilität für CSS-Klassen und sogar für mehrere Klassen im selben Selektor viel weiter zurückreicht als die für Datenattribute.
Wenn ich Sie kenne, der Sie all die bahnbrechenden, grenzwertigen Entwicklungen betreiben, gibt es vielleicht einen besonderen Grund dafür. Ich kann das jedenfalls nicht aus Ihrem Artikel herauslesen. Wollen Sie uns aufklären?
Ich habe versucht, diesen Artikel drei- oder viermal zu schreiben. Der Ursprung war, dass ich herausfinden wollte, wozu der durch Bindestriche getrennte Attributselektor dient, z.B. [rel|=value]. Er schien ziemlich nutzlos, zumal er nur ein Attribut abgleicht, das mit „value-“ beginnt. Das bedeutet, [rel^=value] ist genauso nützlich. Ich konnte buchstäblich keinen einzigen Anwendungsfall dafür finden.
Ich dachte daran, wie nützlich es sein könnte, Klassen wie „module-a“ und „module-b“ für Elemente zu verwenden und sie gleichzeitig und getrennt auswählen zu können.
Aber auch das ist nicht besonders nützlich. Vor allem, wenn Sie mehrere Klassen verwenden (z.B. class=„module module-a“), erhalten Sie eine tiefere Browserunterstützung.
Dann dachte ich über Klassen nach und wie einzigartig es ist, dass es durch die Trennung mit Leerzeichen wie mehrere eindeutige Werte ist und wie es das einzige Attribut ist, das so funktioniert.
So verschmolzen dann die Ideen und somit dieser Artikel.
Würde ich das in einem realen Projekt verwenden? Sicher. Um ehrlich zu sein, habe ich das nie getan, aber ich würde es tun, wenn es sich ergeben würde. Ein Anwendungsfall wäre, wenn Sie ein Datenattribut verwenden würden, um ohnehin Daten zu speichern. Nehmen wir zum Beispiel geografische Koordinaten in einem data-geo-Attribut. Und Sie bieten eine geografische Suche auf der Seite an. Sie könnten einen Selektor schreiben, der Elemente basierend auf dem data-geo-Attribut abgleicht, ohne einen zusätzlichen willkürlichen Haken zum Auswählen hinzufügen zu müssen.
Der „durch Bindestriche getrennte Attributselektor“ ist speziell für Sprachattribute konzipiert. Die Idee ist, Dinge wie en, en-US, en-GB usw. abzugleichen.
Ich hätte nie gedacht, dass Leerzeichen CSS-Selektoren beeinflussen könnten. (bis HTML5 kam).
Könnten Sie auch den Selektor
[att~=val]verwenden? Aus der SpezifikationJa! Das ist offensichtlich besser. Artikel aktualisiert.
Auch, eine bessere Spezifikation zum Verlinken für die Zukunft: http://dev.w3.org/csswg/selectors4/#attribute-representation
Anstatt der seltsamen Leerzeichen-Konstruktion könnten Sie natürlich den Whitespace-Attributselektor [att~=value] verwenden.
Auch unterstützt IE7+ glaube ich: White-Space-Attributselektor-Fiddle
@Brendan Ha! Das gab es nicht, als ich anfing zu tippen, ich schwöre.
Ich kannte die grundlegende Technik schon lange – aber ich wusste nie, dass man das auch mit Dingen wie Attributselektoren machen kann!
Kann wirklich helfen, wenn man entscheidet, dass DreamWeaver für JS-Skripte einfach nicht gut funktioniert.
Klassen-Selektoren sind viel, viel schneller als Attribut-Selektoren, und obwohl das interessant ist, kann ich mir keine reale Situation vorstellen, in der Sie
data-attributezur Stileinrichtung gegenüberKlassenbevorzugen würden.Hast du dazu irgendwelche Daten?
Betrifft Ihr CSS-Beispiel zur Übereinstimmung beider Klassennamen („
.accordion.expand { }“), betrifft dies nur Fälle, in denen ‚accordion‘ direkt von ‚expand‘ gefolgt wird? Oder ist die Reihenfolge unerheblich?Reihenfolge unerheblich
Unterstützt das id-Attribut nicht auch mehrere Leerzeichen-getrennte Werte?
Nein: http://jsfiddle.net/chriscoyier/3qgwZ/
Hmmm, denke nicht.
Tolle Tricks! Danke Chris, mach weiter so!
Nur eine Warnung: Die Verwendung von [attr=val]-Typ-Selektoren in Ihrem CSS und jQuery kann in den meisten Browsern ziemlich langsam sein, da es (noch) keine einfachen Verknüpfungen/Nachschlagetabellen/Methoden dafür gibt. Für statische Seiten ist dies kein großes Problem, aber wenn Sie diese CSS-Klassen dynamisch verwenden möchten (d.h. sie als Reaktion auf Benutzeraktionen im Laufe der Zeit hinzufügen und entfernen), können Sie auf echte Verlangsamungen stoßen.
Wir denken nicht oft über die Effizienz von CSS-Regeln nach, aber sie sind auf komplexen, dynamischen Seiten wichtig. Sparsam verwenden, wenn möglich.
Das ist wirklich gut, danke, können wir Span anstelle von Div verwenden?
Vielleicht erwähnenswert, dass von allen hier gezeigten Beispielen IE6 das erste nicht ignorieren würde
.accordion.expand {…}
sondern es als
.expand {…}
Ich denke, es lohnt sich auch zu erwähnen, dass Attributauswahlen die gleiche Spezifität haben wie Klassen. Die Verwendung der Methode für mehrere Attribute ist daher eine hervorragende Lösung, wenn Sie keine Kontrolle über das HTML haben – wie bei generierten Formularen.