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!

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.


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


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).


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.


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.


¡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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.