Punkty w specyfice CSS

Badając specyfikę natknąłem się na tego bloga - http://www.htmldog.com/guides/cssadvanced/specificity/

Stwierdza, że specyficzność jest systemem punktacji dla CSS. Mówi nam, że elementy są warte 1 punkt, klasy są warte 10 punktów, a identyfikatory są warte 100 punktów. Na szczycie można też powiedzieć, że te punkty są sumowane, a ogólna kwota jest specyficzna dla selekcjonera.

Na przykład:

Body = 1 punkt
ciało .wrapper = 11 punktów
ciało .wrapper # container = 111 punktów

Więc, używając tych punktów z pewnością następujące CSS i HTML spowodują, że tekst będzie niebieski:

CSS:

#a {
    color: red;
}

.a .b .c .d .e .f .g .h .i .j .k .l .m .n .o {
  color: blue;
}

HTML:

<div class="a">
  <div class="b">
    <div class="c">
      <div class="d">
        <div class="e">
          <div class="f">
            <div class="g">
              <div class="h">
                <div class="i">
                  <div class="j">
                    <div class="k">
                      <div class="l">
                        <div class="m">
                          <div class="n">
                            <div class="o" id="a">
                              This should be blue.
                            </div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Wynik:

Http://jsfiddle.net/hkqCF/

Dlaczego tekst jest czerwony, gdy 15 klas równa się 150 punktów w porównaniu do 1 ID, które równa się 100 punkty?

EDIT:

Więc najwyraźniej punkty nie są tylko sumowane, są konkatenowane. Czytaj więcej na ten temat tutaj - http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html Ale czy to oznacza, że klasy w naszym selektorze = 0,0,15,0 lub0,1,5,0?

Mój instynkt podpowiada mi, że to ten pierwszy jak wiemy specyfika selektora ID wygląda tak: 0,1,0,0

Author: Igor Ivancha, 2010-05-11

7 answers

Odpowiedź Pekki jest praktycznie poprawna i prawdopodobnie najlepszym sposobem na przemyślenie problemu.

Jednak, jak wielu już zauważyło, zalecenie W3C CSS stwierdza, że " połączenie trzech liczb a-b-c (w systemie liczbowym z dużą bazą) daje specyfikę."Więc geek we mnie po prostu musiał dowiedzieć się, jak duża jest ta baza.

Okazuje się, że "bardzo duża baza" zastosowana (przynajmniej przez 4 najczęściej używane przeglądarki*) zaimplementować ten standardowy algorytm to 256 lub 28.

Oznacza to, że styl określony za pomocą 0 ID i 256 nazw klas spowoduje, że przekroczy styl określony za pomocą 1 id. Testowałem to na kilku skrzypcach:

Więc istnieje, w praktyce, "system punktowy", ale to nie jest baza 10. To baza 256. Oto jak to działa:

(28)2 lub 65536, razy liczba identyfikatorów w selektorze
+ (28)1 lub 256 razy więcej niż liczba nazw klas w selektor
+ (28)0 lub 1, krotność liczby nazw znaczników w selektorze

To nie jest zbyt praktyczne dla back-of-the-envelop ćwiczenia do komunikowania koncepcji.
Prawdopodobnie dlatego artykuły na ten temat używają bazy 10.

***** [Opera używa 216 (Zobacz komentarz karlcow). Niektóre inne silniki selektorowe wykorzystują infinity - w praktyce brak systemu punktów (Patrz komentarz Szymona Sapina).]

Aktualizacja, Lipiec 2014:
Jak zauważył Blazemonger na początku roku, przeglądarki webkit (chrome, safari) wydają się teraz używać wyższej bazy niż 256. Być może 216, jak Opera? IE i Firefox nadal używają 256.

 131
Author: Faust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:24

Dobre pytanie.

Nie mogę powiedzieć na pewno - wszystkie artykuły, które udało mi się znaleźć, unikają przykładu wielu klas, np. tutaj - ale zakładam, że jeśli chodzi o porównanie specyfiki pomiędzy selektorem klasy A ID, klasa jest obliczana z wartością 15, bez względu na to, jak szczegółowa jest.

To pasuje do mojego doświadczenia w tym, jak zachowuje się specyfika.

Jednak musi być jakieś układanie klas ponieważ

.a .b .c .d .e .f .g .h .i .j .k .l .m .n .o

Jest bardziej szczegółowe niż

.o

Jedyne wyjaśnienie, jakie mam, to to, że specyfika klas ułożonych jest obliczana tylko względem siebie, ale nie względem IDs.

Update: i połowicznie dostać go teraz. Nie jest to system punktowy, a informacja o klasach ważących 15 punktów jest błędna. Jest to 4-częściowy system numeracji bardzo dobrze wyjaśniony tutaj .

Punktem wyjścia są 4 cyfry:

style  id   class element
0,     0,   0,    0

Zgodnie z W3C Wyjaśnienie specyficzności , wartości szczegółowe dla wyżej wymienionych zasad są następujące:

#a            0,1,0,0    = 100
classes       0,0,15,0   = ... see the comments

Jest to system numeracji z bardzo dużym (nieokreślonym?) baza.

Rozumiem, że ponieważ baza jest bardzo duża, żadna liczba w kolumnie 4 nie może pokonać liczby > 0 w kolumnie 3, to samo dla kolumny 2, kolumny 1 .... Czy to prawda?

Byłbym ciekaw, czy ktoś, kto zna się lepiej na matematyce niż ja, mógłby wyjaśnić ten system numeracji i jak go przekształcić do dziesiętnego, gdy poszczególne elementy są większe niż 9.

 26
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-15 19:21:23

Obecnie korzystam z książki CSS Mastery: Advanced Web Standards Solutions.

Rozdział 1, Strona 16 mówi:

Aby obliczyć, jak specyficzna jest reguła, każdy typ selektora jest przypisany wartość liczbowa. Specyficzność reguły jest wówczas obliczana przez dodawanie wartości każdego z selektorów. niestety, specyficzność nie jest obliczana w bazie 10, ale wysoka, nieokreślona, baza numer. Ma to na celu zapewnienie, że bardzo specyficzny selektor, taki jako Selektor ID, nigdy nie jest zastępowany przez wiele mniej specyficznych selektorów, takich jak selektory typów.

(podkreślenie moje) i

Specyficzność selektora jest podzielona na cztery składowe poziomy: a, b, c i D.

  • jeśli styl jest stylem inline, to a = 1
  • b = całkowita liczba selektorów id
  • c = Liczba selektorów klasy, pseudoklasy i atrybutów
  • d = Liczba typu selektory i selektory pseudoelementów

Mówi się dalej, że często można wykonać obliczenia w bazie 10, ale tylko wtedy, gdy wszystkie kolumny mają wartości mniejsze niż 10.


W Twoich przykładach identyfikatory nie są warte 100 punktów; każdy jest wart [0, 1, 0, 0] punktów. Dlatego jeden identyfikator bije 15 klas, ponieważ [0, 1, 0, 0] jest większy niż [0, 0, 15, 0] w systemie liczb o wysokiej bazie.

 8
Author: Matt Fenwick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-16 19:01:41

Aktualny Selektor poziomu 4 roboczy szkic dobrze opisuje specyfikę w CSS:

Specyficzność porównuje się poprzez porównanie trzech składników w kolejności: specyficzność z większą wartością a jest bardziej specyficzna; Jeśli dwie wartości a są powiązane, to specyficzność z większą wartością B jest bardziej specyficzna; Jeśli dwie wartości {6]}B są również powiązane, to specyficzność z większą wartością {6]} c jest bardziej specyficzna; jeśli wszystkie wartości są powiązane, obie specyfiki są sobie równe.

Oznacza to, że wartości A, B I C są całkowicie niezależne od siebie.

15 klas nie daje selektorowi 150 punktów, daje mu B wartość 15. Jedna wartość a wystarczy, aby to pokonać.

Jako metafora wyobraź sobie rodzinę składającą się z 1 dziadka, 1 rodzica i 1 dziecka. Można to przedstawić jako 1,1,1. Jeśli rodzic ma 15 dzieci, to nie czyni ich nagle kolejnym rodzicem (1,2,0). Oznacza to, że rodzic ma o wiele więcej odpowiedzialności niż miał z zaledwie 1 dzieckiem (1,1,15). ;)

Ta sama dokumentacja również mówi:

Ze względu na ograniczenia pamięci, implementacje mogą mieć ograniczenia wielkości A, B lub c . Jeśli tak, wartości wyższe niż limit muszą być zaciśnięte do tego limitu, a nie przepełnienie.

To zostało dodane aby rozwiązać problem przedstawiony w odpowiedzi Fausta, według której implementacje CSS w 2012 roku pozwoliły na przepełnienie wartości specyficzności.

W 2012 roku większość przeglądarek wprowadziła ograniczenie 255, ale ograniczenie to było dozwolone do przepełnienia. 255 klas miało A,B,c 0,255,0, ale 256 klas przepełniło się i miało A,B,c wynik 1,0,0. Nagle nasza B wartość stała się naszą a {7]} wartością. Na Dokumentacja selektorów poziomu 4 całkowicie napromieniowuje ten problem, stwierdzając, że limit nigdy nie może być dopuszczony do przepełnienia. Z tą implementacją, obie klasy 255 i 256 będą miały ten samA,B,c wynik 0,255,0.

Problem podany w odpowiedzi Fausta został naprawiony w większości nowoczesnych przeglądarek.

 7
Author: James Donnelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:35

Lubię porównywać ranking specyficzny do tabeli medalowej Igrzysk Olimpijskich (najpierw złoto-najpierw na podstawie liczby złotych medali, potem srebro, a potem brąz).

Działa również z twoim pytaniem (ogromna liczba selektorów w jednej grupie specyficzności). Specyficzność rozpatrywana oddzielnie dla każdej grupy. W realu bardzo rzadko widziałem przypadek z kilkunastu selektorów).

Dostępny jest również całkiem dobry kalkulator specyficzności tutaj . Możesz umieścić swój przykład (#a i .a .b .c .d .B .f .B .h .i .j .1000000l .m .N.o) tam i zobaczyć wyniki.

Przykładowa tabela medalowa Igrzysk Olimpijskich Rio 2016 wygląda następująco Tutaj wpisz opis obrazka

 4
Author: rkarczmarczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 23:09:43

Nie wierzę, że Wyjaśnienie bloga jest poprawne. Specyfikacja jest tutaj:

Http://www.w3.org/TR/CSS2/cascade.html#specificity

"punkty" z selektora klas nie mogą sumować się jako ważniejsze niż selektor "id". To tak nie działa.

 3
Author: Matthew Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-11 08:44:50

Powiedziałbym, że:

Element < Class < ID

Myślę, że układają się w zależności od tego, co dostajesz, jeśli jest wielokrotnością tego samego. Tak więc Klasa będzie zawsze nad elementem, A ID zawsze nad klasą, ale jeśli spadnie do tego, który z 4 elementów, gdzie 3 jest na niebiesko, a 1 na czerwono, będzie niebieski.

Na Przykład:

.a .b .c .d .e .f .g .h .i .j .k .l
{
color: red;
}

 .m .n .o
{
color blue;
}
Powinno być czerwone.

Zobacz przykład http://jsfiddle.net/RWFWq/

"if 5things say red and 3 say blue well ima go czerwony "

 1
Author: Sphvn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-11 08:49:16