Como substituir as propriedades de uma classe CSS usando outra classe CSS


95

Eu sou bastante novo em CSS3 e quero ser capaz de fazer o seguinte:

Quando adiciono uma classe a um elemento, ele substitui as propriedades de outra classe usada neste elemento específico.

Digamos que eu tenho

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

Eu quero ser capaz de adicionar uma classe chamada bakground-none, que substituirá o plano de fundo padrão da classe left.

Obrigado!

Respostas:


90

Existem diferentes maneiras de substituir as propriedades. Supondo que você tenha

.left { background: blue }

por exemplo, qualquer um dos seguintes o substituiria:

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

Os dois primeiros “ganham” por especificidade do seletor; o terceiro vence por !important, um instrumento contundente.

Você também pode organizar suas folhas de estilo para que, por exemplo, a regra

.background-none { background: none; }

ganha simplesmente por ordem, ou seja, por estar atrás de uma regra igualmente “poderosa”. Mas isso impõe restrições e exige que você seja cuidadoso em qualquer reorganização de folhas de estilo.

Todos esses são exemplos do CSS Cascade , um conceito crucial, mas amplamente mal compreendido. Ele define as regras exatas para resolver conflitos entre as regras da folha de estilo.

PS Eu usei lefte background-nonecomo eles foram usados ​​na pergunta. Eles são exemplos de nomes de classes que não devem ser usados, pois refletem renderizações específicas e não funções estruturais ou semânticas.


Você escreveu. Eles são exemplos de nomes de classes que não devem ser usados, pois refletem renderização específica e não funções estruturais ou semânticas. Você poderia explicar, por favor? Por que deve lefte deve background-noneser evitado?
— Sócrates

1
@Socrates: Algumas pessoas sentem que classes CSS só deve ser dada nomes que identificam o que o elemento que está sendo aplicada a é ou faz (por exemplo button, name-label, etc.). Outros acham que CSS torna-se incontrolável, se você usar essa abordagem e você deve usar "utilitário de primeira" ou css "funcional" onde as aulas correspondem a valores de propriedade (por exemplo margin-top-4, width-10, etc.). Historicamente, a abordagem "semântica" tem sido dominante, enquanto recentemente a abordagem "funcional" vem ganhando adeptos. Experimente ambos em um projeto de tamanho médio e decida por si mesmo o que é superior.
— Mattia


25

Como alternativa à importantpalavra - chave, você pode tornar o seletor mais específico, por exemplo:

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

(Nota: nenhum espaço entre os nomes das classes).

Nesse caso, a regra será aplicada quando ambos .lefte .background-noneestiverem listados no atributo de classe (independentemente da ordem ou proximidade).


25

Você deve substituir aumentando a especificidade de seu estilo. Existem diferentes maneiras de aumentar a Especificidade. O uso de !importantespecificidade de efeitos é uma prática ruim porque quebra a cascata natural em sua folha de estilo.

O diagrama a seguir retirado de css-tricks.com o ajudará a produzir a especificidade certa para o seu elemento com base em uma estrutura de pontos. Qualquer especificidade que tiver pontos mais altos, vencerá. Parece um jogo - não é?

insira a descrição da imagem aqui

Confira exemplos de cálculos aqui em css-tricks.com . Isso ajudará você a entender o conceito muito bem e levará apenas 2 minutos.

Se você gosta de produzir e / ou comparar diferentes especificidades por si mesmo, tente esta Calculadora de Especificidade: https://specificity.keegan.st/ ou você pode usar apenas papel / lápis tradicional.

Para ler mais, experimente o MDN Web Docs .

Tudo de bom por não usar !important.


9

Se você listar a bakground-noneclasse após as outras classes, suas propriedades substituirão as já definidas. Não há necessidade de usar !importantaqui.

Por exemplo:

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

e

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

O link não terá um fundo vermelho. Observe que isso só substitui as propriedades que têm um seletor que é menos ou igualmente específico.


Obrigado pela resposta! Tentei isso como primeira solução, mas por algum motivo não funcionou!
— user3075049

Esta forma de sobrescrever classes css não funcionará se os estilos forem definidos de uma maneira específica como .form-horizontal .form-group {margin-left: -15px}. Aqui você terá que usar! Important
— DanKodi

add! important to .background-none {background: none! importatn; } isso funciona bem
— santhosh

1

LIFO é a forma como o navegador analisa as propriedades CSS. Se você estiver usando Sass, declare uma variável chamada como

"$ header-background: red;"

use-o em vez de atribuir valores diretamente como vermelho ou azul. Quando você quiser substituir, basta reatribuir o valor para

"$ header-background: blue"

então

cor de fundo: $ header-background;

ele deve substituir suavemente. Usar "! Important" nem sempre é a escolha certa ... É apenas um hotfix

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.