¿Cómo apunto elementos con un atributo que tiene algún valor en CSS?

89

Sé que puedo apuntar a elementos que tienen un atributo específico en CSS, por ejemplo:

input[type=text]
{
    font-family: Consolas;
}

Pero, ¿es posible apuntar a elementos que tienen un atributo de cualquier valor (excepto nada, es decir, cuando el atributo no se ha agregado al elemento)?

Aproximadamente algo como:

a[rel=*]
{
    color: red;
}

Que debería apuntar a la primera y tercera <a>etiquetas en este HTML:

<a href="#" rel="eg">red text</a>
<a href="#">standard text</a>
<a href="#" rel="more">red text again</a>

Supongo que es posible porque, de forma predeterminada, cursor: pointerparece aplicarse a cualquier <a>etiqueta que tenga un valor para su hrefatributo.

Marty
fuente

Respuestas:

119

Lo siguiente hará coincidir cualquier etiqueta de anclaje con un relatributo definido:

a[rel]
{
    color: red;
}

http://www.w3.org/TR/CSS2/selector.html#pattern-matching


Actualización: Para tener en cuenta el escenario @vsync mencionó, en la sección de comentarios (diferenciando entre los valores emtpy / no vacíos), se puede incorporar el CSS :not pseudo-clase :

a[rel]:not([rel=""])
{
    color: red;
}

https://developer.mozilla.org/en-US/docs/Web/CSS/:not

xandercoded
fuente
Esto también se dirige a los valores vacíos, ya veces se quiere ningún valor, salvoempty
VSYNC
3
El último ejemplo debería sera[rel]:not( [rel=""] )
cameronjonesweb
Desafortunadamente, el nottruco termina siendo no dinámico. Intenté hacer esto para resaltar los inputcampos cuando tenían valores en lugar de cuando no tenían valores, y parece que una vez que se carga la página, el estilo no se vuelve a evaluar si se escribe un valor (o cuando está allí para empezar y se quita).
Christopher Schultz
47

Sí, en los selectores de CSS 3 hay varios selectores de atributos .

P.ej

[att] Representa un elemento con el atributo att, sea cual sea el valor del atributo.

[att = val] Representa un elemento con el atributo att cuyo valor es exactamente "val".

[att ~ = val] Representa un elemento con el atributo att cuyo valor es una lista de palabras separadas por espacios en blanco, una de las cuales es exactamente "val". Si "val" contiene espacios en blanco, nunca representará nada (ya que las palabras están separadas por espacios). Además, si "val" es la cadena vacía, nunca representará nada.

[att ^ = val] Representa un elemento con el atributo att cuyo valor comienza con el prefijo "val". Si "val" es la cadena vacía, entonces el selector no representa nada.

[att $ = val] Representa un elemento con el atributo att cuyo valor termina con el sufijo "val". Si "val" es la cadena vacía, entonces el selector no representa nada.

[att * = val] Representa un elemento con el atributo att cuyo valor contiene al menos una instancia de la subcadena "val". Si "val" es la cadena vacía, entonces el selector no representa nada.

Narciso
fuente
1

Debería agregar que si un navegador establece un atributo de forma predeterminada, es posible que deba solucionarlo. Esto no parece ser un problema en los brosers "modernos", sin embargo, es un problema que he visto, así que asegúrese de verificar el rendimiento de varios navegadores.

Por ejemplo, descubrí que en IE antes de 9, colSpan está configurado para todos los TD en una tabla, por lo que cualquier celda tiene el valor de colspan oculto de 1.

Entonces, si estaba apuntando a "cualquier TD con atributo colspan" que aplique en su webdoc, incluso los td que no tengan ningún conjunto de atributos colspan, como cualquier TD que sea una sola celda, recibirán el estilo css. ¡IE menos de 9 básicamente les dará estilo a todos!

La única razón para preocuparse por esto son todos los usuarios de XP restantes que no pueden actualizar por encima de IE8.

Entonces, por ejemplo, tengo un grupo de tablas donde el contenido puede cambiar de un extremo a otro, dejando entre 1 y 7 celdas en blanco al final o al principio.

Quiero aplicar un color a cualquier celda en blanco al final o al principio utilizando el atributo colspan. Usar lo siguiente no funcionará en IE menos de 9

#my td[colspan] {background-color:blue;}

... todos los TD se diseñarán (gracioso ya que el estilo de atributo condicional era supuestamente superior en IE, pero estoy divagando ...).

El uso de lo siguiente funciona en todos los navegadores cuando configuro el valor de colspan en 'single' para cualquier celda solitaria / TD que desee incluir en el esquema de estilo, sin embargo, es un 'truco' y no validará correctamente ...

#my td[colspan="single"] {background-color:blue;} /* 'single' could be anything */
#my td[colspan="2"] {background-color:blue;}
#my td[colspan="3"] {background-color:blue;}
#my td[colspan="4"] {background-color:blue;}
#my td[colspan="5"] {background-color:blue;}
#my td[colspan="6"] {background-color:blue;}
#my td[colspan="7"] {background-color:blue;}

Alternativamente, debería poder abordar el problema de manera más apropiada usando estilo condicional usando "if lt IE 9" para anular. Sería la forma correcta de hacer esto, solo tenga en cuenta que debe ocultar el "CSS correctamente construido" de IElt9 en el proceso, y creo que la única forma correcta de hacerlo es con hojas de estilo selectivas.

La mayoría de nosotros ya lo hacemos de todos modos, pero de todos modos, todavía hace bien en considerar y probar si un navegador aplica un atributo automático cuando no ve ninguno, y cómo puede manejar su sintaxis de otra manera correcta para aplicar estilos a los valores de los atributos.

(Por cierto, resulta que colspan aún no está en la especificación css [a partir de css3], por lo que este ejemplo no arroja ningún error de validación).

TwoHawks
fuente
1
> La única razón para preocuparse por esto son todos los usuarios de XP restantes que no pueden actualizar por encima de IE8. Pensaría eso, hasta que se encuentre con entornos empresariales con IE8 en Win7.
Bob