Jaka jest kolejność pierwszeństwa dla CSS?


109

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?


2
Czy używasz preprocesora CSS? Widzę, że masz to @extend .smallbox;, co wygląda jak niestandardowy CSS.
— Jared Farrish

Naprawdę nie powinieneś łączyć @extend- jeśli robi to, co myślę, że robi - i używać obu selektorów na tym samym elemencie.
— millimoose

Wydaje się, że SMACSS zaleca włączenie tylko zmienionych właściwości do „podklasy” (tj. .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; }
— millimoose

1
A jeśli NIE chcesz, .smallbox-paysummaryaby czcionka była mniejsza, dlaczego w pierwszej kolejności ją zmniejszasz?
— millimoose

Teraz zastanawiam się, dlaczego obie reguły mają taką samą specyfikę, jak ta zadeklarowana później w elemencie, atrybut class nie ma pierwszeństwa, niezależnie od kolejności reguł CSS.
— Andy

Odpowiedzi:


186

Istnieje kilka zasad (stosowanych w tej kolejności):

  1. inline css (atrybut stylu html) przesłania reguły css w tagu stylu i pliku css
  2. bardziej szczegółowy selektor ma pierwszeństwo przed mniej szczegółowym
  3. reguły, które pojawiają się później w kodzie, zastępują wcześniejsze reguły, jeśli obie mają taką samą specyfikę.
  4. Reguła CSS z !importantzawsze ma pierwszeństwo.

W twoim przypadku obowiązuje zasada 3.

Specyfika dla pojedynczych selektorów od najwyższego do najniższego:

  • identyfikatory (przykład: #mainwybiera <div id="main">)
  • klas (np .: .myclass), selektory atrybutów (np .: [href=^https:]) i pseudo-klas (np .: :hover)
  • elementy (np .: 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:hoverz#nav ul li.active a::after

  • policz liczbę selektorów identyfikatora: jest jeden dla każdego ( #nav)
  • policz liczbę selektorów klas: jest jeden dla każdego ( :hoveri .active)
  • policzyć liczbę selektorów elementów: są 3 ( 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 .


W jaki sposób specyficzność zastępuje deklaracje stylu wbudowanego?
— Jared Farrish

3
„… reguły css w znaczniku stylu… zastępują reguły w pliku css”. Ostatnio widziałem ten mit kilka razy. Nie wiem, skąd się bierze, ale to nonsens.
— Alohci,

@jared Zamieniłem dwa pierwsze punkty. Czy to masz na myśli?
— Lorenz Meyer

Tak, to miałem na myśli.
— Jared Farrish

2
@PakiPat :hovernie jest selektorem klasy , ale selektorem pseudoklasy .
— Lorenz Meyer

30

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ą: Kolejność stylów CSS

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.


3
Ten diagram wymaga specjalnego sposobu myślenia. Dla mnie jest to dużo trudniejsze do zrozumienia tego schematu niż samo dziedziczenie stylu.
— Lorenz Meyer

10

To, na co tutaj patrzymy, nazywa się specyficznością, jak stwierdza Mozilla :

Specyfika to sposób, za pomocą którego przeglądarki decydują, które wartości właściwości CSS są najbardziej odpowiednie dla elementu i dlatego zostaną zastosowane. Specyfika opiera się na regułach dopasowania, które składają się z różnego rodzaju selektorów CSS.

Specyfika to waga przypisana danej deklaracji CSS, określona przez liczbę każdego typu selektora w pasującym selektorze. Gdy wiele deklaracji ma taką samą specyficzność, ostatnia deklaracja znaleziona w CSS jest stosowana do elementu. Specyfika ma zastosowanie tylko wtedy, gdy ten sam element jest objęty wieloma deklaracjami. Zgodnie z regułami CSS, bezpośrednio docelowe elementy zawsze będą miały pierwszeństwo przed regułami, które element dziedziczy po swoim przodku.

Podoba mi się wyjaśnienie 0-0-0 na https://specifishity.com :

wprowadź opis obrazu tutaj

Całkiem opisowy obraz !importantdyrektywy! Ale czasami jest to jedyny sposób na zastąpienie styleatrybutu inline . Dlatego najlepszą praktyką jest unikanie obu.


1
doskonały. właśnie tego szukałem. Ta grafika jest znakomita lol.
— saran3h

7

Po pierwsze, na podstawie twojej @extenddyrektywy 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 .smallboxpo .smallbox-paysummarybył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:

  1. Bieżący typ mediów;
  2. Znaczenie;
  3. Pochodzenie;
  4. Specyfika selektora i wreszcie nasza znana reguła:
  5. Który z nich jest określony.

5

AS jest stanem w W3: W3 Cascade CSS

kolejność stosowania różnych arkuszy stylów jest następująca (cytat z sekcji kaskadowej W3):

  1. deklaracje klienta użytkownika

  2. normalne deklaracje użytkownika

  3. autor normalnych deklaracji

  4. autor ważnych deklaracji

  5. ważne deklaracje użytkownika

Więcej informacji na ten temat w przywołanym dokumencie W3


4

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-paysummaryjest zdefiniowane po .smallboxstąd pierwszeństwo 10px.


4
Element, Pseudo Element: d = 1 – (0,0,0,1)
Class, Pseudo class, Attribute: c = 1 – (0,0,1,0)
Id: b = 1 – (0,1,0,0)
Inline Style: a = 1 – (1,0,0,0)

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



1
@Mahi Przez ten czas machałem twoją sugerowaną edycją, ale w przyszłości nie dodawaj śmieci do edycji tylko po to, aby była wystarczająco długa. Posiadanie drugiej edycji, która „cofa” szkody spowodowane przez pierwszą, jest bardzo złą praktyką, bardzo nieintuicyjną dla recenzentów i wymaga więcej pracy niż to konieczne. Zamiast tego poszukaj innych rzeczy, które można by poprawić (takich jak pisownia lub gramatyka).
— Siguza

0

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:

<html>
<head>
<style>.container-ext { width: 100%; }</style>
<style>.container { width: 50px; }</style>
</head>
<body>
<div class="container container-ext">Hello World</div>
</body>

... szerokość elementu div będzie wynosić 50 pikseli


To nie jest tak naprawdę pierwszeństwo, to jest kaskadowa część kaskadowych arkuszy stylów.
— TylerH
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.