Próbuję dowiedzieć się, dlaczego jedna z moich klas css wydaje się zastępować drugą (a nie na odwrót)
Tutaj mam dwie klasy 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;
}
i moim zdaniem dzwonię
<pre class = "span12 pre-scrollable smallbox-paysummary smallbox ">
Czcionka (nakładający się element) jest wyświetlana jako 10 pikseli zamiast 20 - czy ktoś mógłby wyjaśnić, dlaczego tak jest?
@extend .smallbox;
, co wygląda jak niestandardowy CSS.@extend
- jeśli robi to, co myślę, że robi - i używać obu selektorów na tym samym elemencie..smallbox-paysummary
) I opcjonalnie uczynić deklarację CSS bardziej precyzyjną (bez polegania na kolejności pojawiania się w pliku CSS) przy użyciu opcji.smallbox.smallbox-paysummary { font-size: 10px; }
.smallbox-paysummary
aby czcionka była mniejsza, dlaczego w pierwszej kolejności ją zmniejszasz?Odpowiedzi:
Istnieje kilka zasad (stosowanych w tej kolejności):
!important
zawsze ma pierwszeństwo.W twoim przypadku obowiązuje zasada 3.
Specyfika dla pojedynczych selektorów od najwyższego do najniższego:
#main
wybiera<div id="main">
).myclass
), selektory atrybutów (np .:[href=^https:]
) i pseudo-klas (np .::hover
)div
), a pseudo-elementów (np .:::before
)Aby porównać specyficzność dwóch połączonych selektorów, porównaj liczbę wystąpień pojedynczych selektorów każdej z powyższych grup specyficzności.
Przykład: porównaj
#nav ul li a:hover
z#nav ul li.active a::after
#nav
):hover
i.active
)ul li a
) dla pierwszego i 4 dla drugiego (ul li a ::after
), więc drugi selektor kombinowany jest bardziej szczegółowy.Dobry artykuł o specyfice selektora CSS .
źródło
:hover
nie jest selektorem klasy , ale selektorem pseudoklasy .Oto kompilacja kolejności stylów CSS na diagramie, na którym reguły CSS mają wyższy priorytet i mają pierwszeństwo przed resztą:
Zastrzeżenie : razem z moim zespołem opracowaliśmy ten artykuł wraz z wpisem na blogu ( https://vecta.io/blog/definitive-guide-to-css-styling-order ), który moim zdaniem przyda się wszystkim front-endowi deweloperzy.
źródło
To, na co tutaj patrzymy, nazywa się specyficznością, jak stwierdza Mozilla :
Podoba mi się wyjaśnienie 0-0-0 na https://specifishity.com :
Całkiem opisowy obraz
!important
dyrektywy! Ale czasami jest to jedyny sposób na zastąpieniestyle
atrybutu inline . Dlatego najlepszą praktyką jest unikanie obu.źródło
Po pierwsze, na podstawie twojej
@extend
dyrektywy wydaje się, że nie używasz czystego CSS, ale preprocesora, takiego jak SASS os Stylus.Teraz, kiedy mówimy o „porządku pierwszeństwa” w CSS, obowiązuje zasada ogólna : stosowane są wszelkie reguły ustawione po innych regułach (odgórnie). W twoim przypadku, po prostu określając
.smallbox
po.smallbox-paysummary
byłbyś w stanie zmienić pierwszeństwo reguł.Jeśli jednak chcesz pójść trochę dalej, sugeruję przeczytanie: Specyfikacja kaskady CSS W3C . Przekonasz się, że pierwszeństwo reguły jest oparte na:
źródło
AS jest stanem w W3: W3 Cascade CSS
kolejność stosowania różnych arkuszy stylów jest następująca (cytat z sekcji kaskadowej W3):
deklaracje klienta użytkownika
normalne deklaracje użytkownika
autor normalnych deklaracji
autor ważnych deklaracji
Więcej informacji na ten temat w przywołanym dokumencie W3
źródło
Kolejność, w jakiej klasy pojawiają się w elemencie html nie ma znaczenia, liczy się kolejność, w jakiej bloki pojawiają się w arkuszu stylów.
W twoim przypadku
.smallbox-paysummary
jest zdefiniowane po.smallbox
stąd pierwszeństwo 10px.źródło
Inline css (atrybut stylu html) przesłania reguły css w tagu stylu i pliku css
Bardziej szczegółowy selektor ma pierwszeństwo przed mniej szczegółowym.
Reguły, które pojawiają się później w kodzie, zastępują wcześniejsze reguły, jeśli obie mają taką samą specyfikę.
źródło
Należy również zauważyć, że jeśli masz dwa style w elemencie HTML o równym priorytecie, przeglądarka da pierwszeństwo stylom, które zostały zapisane w modelu DOM last ... więc jeśli w DOM:
... szerokość elementu div będzie wynosić 50 pikseli
źródło