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!

user3075049
fonte

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.

Jukka K. Korpela
fonte
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
62

Basta usá- !importantlo ajudará a substituir

background:none !important;

Embora seja considerada uma prática ruim, !importantpode ser útil para classes de utilitários, você só precisa usá-lo com responsabilidade, verifique isto: Ao usar o importante é a escolha certa

Pranav C Balan
fonte
40
! importante é uma má prática. Logo, todo código se torna! Importante.
TPAKTOPA
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).

Marc Audet
fonte
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.

Usman
fonte
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.

Ruud
fonte
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

Inácio André
fonte