No es factible con CSS2.1, pero es posible con los selectores de coincidencia de subcadenas de atributos CSS3 (que son compatibles con IE7 +):
div[class^="status-"], div[class*=" status-"]
Observe el carácter de espacio en el segundo selector de atributos. Esto recoge div
elementos cuyo class
atributo cumple cualquiera de estas condiciones:
[class^="status-"]
- comienza con "estado-"
[class*=" status-"]
- contiene la subcadena "status-" que ocurre directamente después de un carácter de espacio. Los nombres de clase están separados por espacios en blanco según la especificación HTML , de ahí el carácter de espacio significativo. Esto verifica cualquier otra clase después de la primera si se especifican varias clases, y agrega una ventaja de verificar la primera clase en caso de que el valor del atributo esté rellenado con espacio (lo que puede suceder con algunas aplicaciones que generan class
atributos dinámicamente).
Naturalmente, esto también funciona en jQuery, como se demuestra aquí .
La razón por la que necesita combinar dos selectores de atributos como se describió anteriormente es porque un selector de atributos tal como [class*="status-"]
coincidirá con el siguiente elemento, lo que puede ser indeseable:
<div id='D' class='foo-class foo-status-bar bar-class'></div>
Si puede asegurarse de que tal escenario nunca sucederá, entonces es libre de usar dicho selector por simplicidad. Sin embargo, la combinación anterior es mucho más robusta.
Si tiene control sobre la fuente HTML o la aplicación que genera el marcado, puede ser más simple simplemente hacer que el status-
prefijo sea su propia status
clase, como sugiere Gumbo .
status-
y no quieres igualarla, el selector se vuelve aún más complicado:div[class^="status-"]:not(.status-), div[class*=" status-"]:not(.status-)
además, pierdes la compatibilidad con IE7 / IE8. Afortunadamente, si su marcado es correcto, no necesitará excluir dicha clase.