Cómo anular las propiedades de una clase CSS usando otra clase CSS

95

Soy bastante nuevo en CSS3 y quiero poder hacer lo siguiente:

Cuando agrego una clase a un elemento, anula las propiedades de otra clase utilizada en este elemento específico.

Digamos que tengo

<a class="left carousel-control" href="#carousel" data-slide="prev">

Quiero poder agregar una clase llamada bakground-none, que anulará el fondo predeterminado en la clase left.

¡Gracias!

usuario3075049
fuente

Respuestas:

90

Hay diferentes formas en las que se pueden anular las propiedades. Asumiendo que tienes

.left { background: blue }

por ejemplo, cualquiera de los siguientes lo anularía:

a.background-none { background: none; }
body .background-none { background: none; }
.background-none { background: none !important; }

Los dos primeros "ganan" por la especificidad del selector; el tercero gana con !importantun instrumento contundente.

También puede organizar sus hojas de estilo para que, por ejemplo, la regla

.background-none { background: none; }

gana simplemente por orden, es decir, por ser después de una regla de otra manera igualmente “poderoso”. Pero esto impone restricciones y requiere que tenga cuidado al reorganizar las hojas de estilo.

Todos estos son ejemplos de CSS Cascade , un concepto crucial pero ampliamente incomprendido. Define las reglas exactas para resolver conflictos entre las reglas de la hoja de estilo.

PD Usé lefty background-nonecomo se usaron en la pregunta. Son ejemplos de nombres de clases que no deben usarse, ya que reflejan una representación específica y no roles estructurales o semánticos.

Jukka K. Korpela
fuente
Usted escribió Son ejemplos de nombres de clases que no deben usarse, ya que reflejan una representación específica y no roles estructurales o semánticos. ¿Podría darnos más detalles, por favor? ¿Por qué debería lefty background-nonedebe evitarse?
Sócrates
1
@Socrates: Algunas personas sienten que las clases css sólo debe administrarse nombres que identifican lo que el elemento que se está aplicando a es o hace (por ejemplo button, name-label, etc.). Otros creen que el CSS se vuelve inmanejable si se utiliza este enfoque y se debe utilizar "utilidad de primera" o css "funcional" donde las clases se corresponden con los valores de propiedad (por ejemplo margin-top-4, width-10, etc.). Históricamente, el enfoque "semántico" ha sido dominante, mientras que recientemente el enfoque "funcional" ha ido ganando adeptos. Pruebe ambos en un proyecto de tamaño mediano y luego decida por sí mismo cuál es superior.
Mattia
62

Solo utilícelo !importantayudará a anular

background:none !important;

Aunque se dice que es una mala práctica, !importantpuede ser útil para las clases de servicios públicos, solo necesita usarlo de manera responsable, verifique esto: Cuando Usar importante es la opción correcta

Pranav C Balan
fuente
40
! important es una mala práctica. Pronto, todo el código se vuelve! Importante.
TPAKTOPA
25

Como alternativa a la importantpalabra clave, puede hacer que el selector sea más específico, por ejemplo:

.left.background-none { background:none; }

(Nota: no hay espacio entre los nombres de las clases).

En este caso, la regla se aplicará cuando ambos .lefty .background-noneestén enumerados en el atributo de clase (independientemente del orden o la proximidad).

Marc Audet
fuente
25

Debe anular aumentando la especificidad de su estilo. Hay diferentes formas de aumentar la especificidad. El uso de lo !importantque afecta la especificidad, es una mala práctica porque rompe la cascada natural en su hoja de estilo.

El siguiente diagrama tomado de css-tricks.com lo ayudará a producir la especificidad correcta para su elemento en función de una estructura de puntos. La especificidad que tenga puntos más altos, ganará. Suena como un juego, ¿no?

ingrese la descripción de la imagen aquí

Consulte los cálculos de muestra aquí en css-tricks.com . Esto te ayudará a comprender muy bien el concepto y solo te llevará 2 minutos.

Si luego le gusta producir y / o comparar diferentes especificidades usted mismo, pruebe esta Calculadora de especificidad: https://specificity.keegan.st/ o simplemente puede usar papel / lápiz tradicional.

Para obtener más información, pruebe MDN Web Docs .

Todo lo mejor para no usar !important.

Usman
fuente
9

Si enumera la bakground-noneclase después de las otras clases, sus propiedades anularán las ya establecidas. No es necesario utilizarlo !importantaquí.

Por ejemplo:

.red { background-color: red; }
.background-none { background: none; }

y

<a class="red background-none" href="#carousel">...</a>

El enlace no tendrá fondo rojo. Tenga en cuenta que esto solo anula las propiedades que tienen un selector que es menos o igualmente específico.

Ruud
fuente
¡Gracias por la respuesta! Intenté esto como primera solución, ¡pero por alguna razón no funcionó!
user3075049
Esta forma de anular las clases css no funcionará si los estilos se definen de una manera específica como .form-horizontal .form-group {margin-left: -15px}. ¡Aquí tendrás que usar! Importante
DanKodi
agregar! importante a .background-none {background: none! importatn; } esto funciona bien
santhosh
1

LIFO es la forma en que el navegador analiza las propiedades de CSS. Si está utilizando Sass, declare una variable llamada como

"$ fondo-encabezado: rojo;"

utilícelo en lugar de asignar directamente valores como rojo o azul. Cuando desee anular, simplemente reasigne el valor a

"$ fondo-encabezado: azul"

luego

color de fondo: $ fondo de encabezado;

debería anular sin problemas. Usar "! Important" no siempre es la elección correcta. Es solo una revisión

Ignacio Andrés
fuente