2012-07-20 3 views
12

De acuerdo con los documentos CSS: http://www.w3.org/TR/CSS21/cascade.html#specificityCSS repetición de clase para aumentar la especificidad

especificidad se define por (entre otras cosas) la cantidad de atributos y pseudo-clases en el selector.

Entonces, mi pregunta es, ¿es posible aumentar la especificidad repitiendo el mismo nombre de clase una y otra vez?

Por ejemplo:

haría

.qtxt.qtxt.qtxt.qtxt.qtxt 
{ 
} 

tienen una mayor especificidad que

.qtxt.lalgn 
{ 
} 

o

.lalgn .qtxt//(space added to create child selector) 
{ 
} 

?

+0

Voy a suponer que esto va a ser específico del navegador. –

Respuesta

20

Sí, es posible e intencional. Si bien esto no se menciona en la especificación CSS2, se menciona explícitamente en el Selectors 3 spec:

Nota: ocurrencias repetidas [sic] del mismo selector simple son permitidos y no aumentan la especificidad.

Por lo tanto Navegadores debe aumentar la especificidad cuando se enfrentan a los selectores simples repetidas, siempre y cuando el selector es válida y aplicable. Esto no solo se aplica a las clases repetidas, sino que también se aplica a identificaciones repetidas, atributos y pseudo-clases.

Dado su código, .qtxt.qtxt.qtxt.qtxt.qtxt tendrá la especificidad más alta. Los otros dos selectores son igualmente específicos; combinadores no tienen ninguna incidencia en los cálculos de especificidad en absoluto:

/* 5 classes -> specificity = 0-5-0 */ 
.qtxt.qtxt.qtxt.qtxt.qtxt 

/* 2 classes -> specificity = 0-2-0 */ 
.qtxt.lalgn 

/* 2 classes -> specificity = 0-2-0 */ 
.lalgn .qtxt 

Además, el espacio en su última selector es el descendiente combinador; el niño combinador es >.

+1

Acabo de encontrarlo en Material Design Lite y tengo que decir que tiene que ser la abominación de spaghetti CSS más extraña que he encontrado. No puedo entender que algunas personas pensaron que sería una buena idea usar algo como esto en una biblioteca de CSS. – Senthe

-3

No debería necesitar modificar especificidades como esta ... si necesita forzar un valor, use !important.

+0

Gracias por la sugerencia, y lo más probable es que lo use, pero ... todavía no sé la respuesta a mi pregunta –

+0

! Importante no se debe utilizar a la ligera. Realmente debes considerar que realmente no hay otra forma de evitar el uso de la especificidad, etc.Solo entonces deberías usar el! Important. – brunoais

+0

La combinación de clases no es un truco, es la especificación oficial de CSS para aumentar la especificidad. El uso de '! Important' señala el estado de noob y la ignorancia de css. Muy rara vez debería alguien usar! Importante porque derrota el punto de especificidad de CSS. Cuando tienes 5 clases declarando '! Important' en la misma propiedad, ¿cómo encuentras tu cordura? Solo uso '! Important' como último recurso o cuando trato con otros noobs css horribles y es la única forma de hacerlo funcionar sin reescribir toda la biblioteca – TetraDev

1

.qtxt.qtxt.qtxt tendría la más alta especificidad ...

http://jsfiddle.net/nXBTp/1/

Sin embargo, esto es sólo el caso si se repite el nombre de la clase más veces que cualquier otro selector, por ejemplo:

http://jsfiddle.net/nXBTp/2/

+0

¡Gracias! :) ¿Qué navegador usaste por curiosidad? Funciona aquí en safari, yendo a probar firefox –

+0

Probé en la última versión de Chrome, Firefox, Safari e IE. Obtuve los mismos resultados para cada uno. – smilledge

+0

Este comportamiento es intencionado y obligatorio para los navegadores. Ver mi respuesta para una referencia. – BoltClock

Cuestiones relacionadas