Estou tentando descobrir por que uma das minhas classes css parece substituir a outra (e não o contrário)
Aqui eu tenho duas classes css
.smallbox {
background-color: white;
height: 75px;
width: 150px;
font-size:20px;
box-shadow: 0 0 10px #ccc;
font-family: inherit;
}
.smallbox-paysummary {
@extend .smallbox;
font-size:10px;
}
e na minha opinião eu chamo
<pre class = "span12 pre-scrollable smallbox-paysummary smallbox ">
A fonte (o elemento sobreposto) aparece como 10px em vez de 20 - alguém poderia explicar por que esse é o caso?
@extend .smallbox;
, que parece cSS fora do padrão.@extend
- se fizer o que eu acho que faz - e usar os dois seletores no mesmo elemento..smallbox-paysummary
) e, opcionalmente, tornar a declaração CSS mais claramente específica (sem depender da ordem de aparência no arquivo CSS) usando.smallbox.smallbox-paysummary { font-size: 10px; }
.smallbox-paysummary
fonte tenha uma fonte menor, por que você a está diminuindo?Respostas:
Existem várias regras (aplicadas nesta ordem):
!important
sempre tem precedência.No seu caso, aplica-se a regra 3.
Especificidade para seletores únicos do mais alto ao mais baixo:
#main
selects<div id="main">
).myclass
), selectores de atributos (ex .:[href=^https:]
) e pseudo-classes (ex .::hover
)div
) e pseudo-elementos (ex .:::before
)Para comparar a especificidade de dois seletores combinados, compare o número de ocorrências de seletores únicos de cada um dos grupos de especificidade acima.
Exemplo: compare
#nav ul li a:hover
com#nav ul li.active a::after
#nav
):hover
e.active
)ul li a
) para o primeiro e 4 para o segundo (ul li a ::after
), portanto, o segundo seletor combinado é mais específico.Um bom artigo sobre a especificidade do seletor css .
fonte
:hover
não é um seletor de classe , mas um seletor de pseudo-classe .Aqui está uma compilação da ordem de estilo CSS em um diagrama, no qual as regras CSS têm maior prioridade e têm precedência sobre o resto:
Aviso de isenção de responsabilidade : minha equipe e eu elaboramos essa parte em conjunto com uma postagem no blog ( https://vecta.io/blog/definitive-guide-to-css-styling-order ) que acho que será útil para todos os front-end desenvolvedores.
fonte
O que estamos vendo aqui é chamado de especificidade, conforme declarado pela Mozilla :
Gosto da explicação 0-0-0 em https://specifishity.com :
Bastante descritivo o quadro da
!important
diretiva! Mas às vezes é a única maneira de substituir ostyle
atributo embutido . Portanto, é uma prática recomendada evitar os dois.fonte
Em primeiro lugar, com base na sua
@extend
diretiva, parece que você não está usando CSS puro, mas um pré-processador como o SASS os Stylus.Agora, quando falamos sobre "ordem de precedência" em CSS, há uma regra geral envolvida: quaisquer regras definidas após outras regras (de cima para baixo) são aplicadas. No seu caso, apenas especificando
.smallbox
depois,.smallbox-paysummary
você poderá alterar a precedência de suas regras.No entanto, se você quiser ir um pouco mais longe, sugiro esta leitura: CSS cascade W3C especificação . Você verá que a precedência de uma regra é baseada em:
fonte
AS é o estado em W3: W3 Cascade CSS
a orden que as diferentes folhas de estilo são aplicadas é a seguinte (citação da seção em cascata W3):
declarações do agente do usuário
declarações normais do usuário
declarações normais do autor
autor declarações importantes
Mais informações sobre isso no referido documento W3
fonte
A ordem em que as classes aparecem no elemento html não importa, o que conta é a ordem em que os blocos aparecem na folha de estilo.
No seu caso,
.smallbox-paysummary
é definido após,.smallbox
portanto, a precedência de 10px.fonte
CSS embutido (atributo de estilo html) substitui as regras de css na tag de estilo e no arquivo css
Um seletor mais específico tem precedência sobre um menos específico.
As regras que aparecem posteriormente no código substituem as regras anteriores se ambas tiverem a mesma especificidade.
fonte
Também é importante observar que quando você tem dois estilos em um elemento HTML com precedência igual, o navegador dará precedência aos estilos que foram gravados no DOM por último ... portanto, se estiver no DOM:
... a largura do div será de 50 px
fonte