Ce n'est pas faisable avec CSS2.1, mais c'est possible avec les sélecteurs de correspondance de sous-chaînes d'attributs CSS3 (qui sont pris en charge dans IE7 +):
div[class^="status-"], div[class*=" status-"]
Notez le caractère espace dans le deuxième sélecteur d'attribut. Cela récupère les div
éléments dont l' class
attribut remplit l'une de ces conditions:
[class^="status-"]
- commence par "status-"
[class*=" status-"]
- contient la sous-chaîne "status-" apparaissant directement après un caractère espace. Les noms de classe sont séparés par des espaces conformément aux spécifications HTML , d'où le caractère d'espace significatif. Cela vérifie toutes les autres classes après la première si plusieurs classes sont spécifiées, et ajoute un bonus de vérification de la première classe au cas où la valeur d'attribut serait remplie d'espace (ce qui peut arriver avec certaines applications qui produisent des class
attributs de manière dynamique).
Naturellement, cela fonctionne également dans jQuery, comme démontré ici .
La raison pour laquelle vous devez combiner deux sélecteurs d'attribut comme décrit ci-dessus est qu'un sélecteur d'attribut tel que [class*="status-"]
correspondra à l'élément suivant, ce qui peut être indésirable:
<div id='D' class='foo-class foo-status-bar bar-class'></div>
Si vous pouvez vous assurer qu'un tel scénario ne se produira jamais , vous êtes libre d'utiliser un tel sélecteur pour des raisons de simplicité. Cependant, la combinaison ci-dessus est beaucoup plus robuste.
Si vous avez le contrôle sur la source HTML ou l'application générant le balisage, il peut être plus simple de créer simplement le status-
préfixe dans sa propre status
classe, comme le suggère Gumbo .
status-
et que vous ne voulez pas correspondre à cela, le sélecteur devient encore plus compliqué: dediv[class^="status-"]:not(.status-), div[class*=" status-"]:not(.status-)
plus, vous perdez le support IE7 / IE8. Heureusement, si votre balisage est sain d'esprit, vous n'aurez pas besoin d'exclure une telle classe.