<html>
<body>
<style type="text/css">
p.first {color:blue}
p.second {color:green}
</style>
<p class="first">Hello World</p>
<p class="second">Hello World</p>
<style type="text/css">
p.first {color:green}
p.second {color:blue}
</style>
<p class="first">Hello World</p>
<p class="second">Hello World</p>
</body>
</html>
W jaki sposób przeglądarka ma renderować css, który nie jest ciągły? Czy ma generować strukturę danych przy użyciu wszystkich stylów css na stronie i używać jej do renderowania?
Czy też renderuje przy użyciu informacji o stylu w kolejności, w jakiej widzi?
CSS
iHTML
.<head>
tagu<body>
zamiast w<head>
.Odpowiedzi:
Jak już wspomniano inni, HTML 4 wymaga umieszczenia
<style>
znacznika w<head>
sekcji (nawet jeśli większość przeglądarek zezwala na<style>
znaczniki w obrębiebody
).Jednak HTML 5 zawiera
scoped
atrybut (patrz aktualizacja poniżej), który pozwala tworzyć arkusze stylów, których zakres obejmuje element nadrzędny<style>
znacznika. Umożliwia to również umieszczanie<style>
znaczników w<body>
elemencie:Jeśli wyrenderujesz powyższy kod w przeglądarce obsługującej HTML-5, która obsługuje
scoped
, zobaczysz ograniczony zakres arkusza stylów.Jest tylko jedno ważne zastrzeżenie ...
W chwili pisania tej odpowiedzi (maj 2013 r.) Prawie żadna przeglądarka głównego nurtu nie obsługuje obecnie tego
scoped
atrybutu. (Chociaż najwyraźniej kompilacje Chromium dla programistów obsługują to.)JEDNAK istnieje ciekawa implikacja
scoped
atrybutu odnoszącego się do tego pytania. Oznacza to, że przyszłe przeglądarki są zobowiązane za pośrednictwem standardu, aby zezwalać na<style>
elementy w<body>
(dopóki zakres<style>
elementów jest ograniczony).Biorąc pod uwagę, że:
scoped
atrybut<style>
tagi w<body>
<style>
tagi w obrębie<body>
... wtedy dosłownie nie ma żadnej szkody * w umieszczaniu
<style>
tagów w ciele, o ile w przyszłości udowodnisz jescoped
atrybutem. Jedynym problemem jest to, że obecne przeglądarki faktycznie nie ograniczają zakresu arkusza stylów - zastosują go do całego dokumentu. Chodzi o to, że do wszystkich praktycznych celów możesz dołączyć<style>
tagi pod<body>
warunkiem, że:scoped
atrybut<body>
rzeczywistości nie będzie miał zasięgu (ponieważ nie ma jeszcze obsługi głównego nurtu przeglądarki)* z wyjątkiem oczywiście sikania walidatorów HTML ...
Wreszcie, odnosząc się do powszechnego (ale subiektywnego) twierdzenia, że osadzanie CSS w HTML jest słabą praktyką, należy zauważyć, że sednem tego
scoped
atrybutu jest dostosowanie typowych nowoczesnych ram programistycznych, które pozwalają programistom importować fragmenty HTML jako moduły lub zawartość syndykowaną . Bardzo wygodnie jest mieć osadzony CSS, który dotyczy tylko określonej części HTML, w celu opracowania zamkniętych, modułowych komponentów o określonych stylach.Aktualizacja od lutego 2019 r., Zgodnie z dokumentacją Mozilli ,
scoped
atrybut jest nieaktualny. Chrome przestał go obsługiwać w wersji 36 (2014) i Firefox w wersji 62 (2018). W obu przypadkach funkcja musiała zostać wyraźnie włączona przez użytkownika w ustawieniach przeglądarki. Żadna inna główna przeglądarka nigdy go nie obsługiwała.źródło
head
. Jeśli jest to Twoja tylko css, i jeśli strona jest duża i jeśli połączenie sieciowe nie jest bardzo szybki, to może zobaczysz błysk pierwotnych ustawień treści, ale dziwi mnie to, że w większości praktycznych sytuacjach.@scoped
lubscoped
wydaje się wymierać: tu i tutajscoped
Atrybut został usunięty z aktualnych specyfikacji HTML5.Niepomyślnych wiadomości dla „ciała” w stylu lubiących W3C niedawno przegrali wojnę HTML przed WHATWG, którego versionless HTML „Living Standard” stała się obecnie oficjalny jeden, który, niestety, nie nie pozwalają
STYLE
wBODY
. Krótkie szczęśliwe dni minęły. ;) Walidator W3C działa teraz również według specyfikacji WHATWG. (Dzięki @FrankConijn za heads-up!)(Uwaga: jest to przypadek „na dzień dzisiejszy”, ale ponieważ nie ma wersji, łącza mogą w dowolnym momencie stać się nieważne bez powiadomienia lub kontroli. O ile nie chcesz połączyć się z poszczególnymi zatwierdzeniami źródła w GitHub, zasadniczo nie możesz nie wprowadzaj już stabilnych odniesień do nowego oficjalnego standardu HTML AFAIK. Popraw mnie, jeśli istnieje kanoniczny sposób, aby zrobić to poprawnie.)
OBSOLETED GOOD NEWS:
Tak, w
STYLE
końcu obowiązujeBODY
od wersji HTML5.2! (Iscoped
nie ma.)Ze specyfikacji W3C ( rozkoszuj się ostatnią linią! ):
UWAGA NA STRONIE META:
Sam fakt, że pomimo szkód związanych z „wojną przeglądarek” wciąż musieliśmy rozwijać się przeciwko dwóm śmiesznie konkurującym „oficjalnym” standardom „HTML” (cytaty
1 standard + 1 standard < 1 standard
) oznacza, że podejście „do normalnego rozsądku” tworzenie stron internetowych nigdy tak naprawdę nie przestało obowiązywać.To może się wreszcie zmienić teraz, ale powołując się na konwencjonalną mądrość: autorzy / programiści stron internetowych, a tym samym przeglądarki powinny ostatecznie zdecydować, co powinno (a nie powinno) być w specyfikacjach, gdy nie ma żadnego dobrego powodu, aby to, co już zostało zrobione rzeczywistość. I większość przeglądarek dawna obsługiwane
STYLE
wBODY
(w taki czy inny sposób, patrz npscoped
. Attr) (który mimo swojej wrodzonej wydajności (i ewentualnie innych) kary my . Powinien zdecydować płacić czy nie, specyfikacje). Tak więc, po pierwsze, będę dalej na nie stawiać i nie rezygnuję z nadziei. ;) Jeśli WHATWG ma taki sam szacunek dla rzeczywistości / autorów, jak twierdzą, mogą po prostu zrobić to, co zrobiła W3C.źródło
style
bloku wbody
walidacji?STYLE
jak metadane i treści, ale najnowsza specyfikacja WHATWG „żywa” opowiada starą, nudną historię „tylko metadanych” (dopuszczając ją tylko w HEAD). Aby dodać obrażenia do obrażeń, walidator W3C wydaje się podążać za smakiem WHATWG. Nie zdecydowałem jeszcze, czy się śmiać, czy płakać, ale na pewno osobiście zdecydowałem się „pomylić” z przypadkiem „przeglądarki + W3C - walidator” i pozwolić STYLE w BODY. (BTW, nie zapominaj: powinniśmy być ostatecznym źródłem standardu .)Kiedy widzę, że duże systemy zarządzania treścią rutynowo umieszczają niektóre elementy <style> (niektóre, nie wszystkie) w pobliżu treści, która opiera się na tych klasach, dochodzę do wniosku, że koń jest poza stodołą.
Przejrzyj źródła stron z cnn.com, nytimes.com, huffingtonpost.com, najbliższej gazety wielkomiejskiej itp. Wszyscy to robią.
Jeśli istnieje dobry powód, aby umieścić dodatkową sekcję <style> gdzieś w ciele - na przykład, jeśli dołączasz () różnorodne i niezależne elementy strony w czasie rzeczywistym, a każdy z nich ma własną <style> własną, i organizacja będzie czystsza, bardziej modułowa, zrozumiała i łatwiejsza w utrzymaniu - mówię, po prostu ugryź kulę. Na pewno byłoby lepiej, gdybyśmy mogli mieć styl „lokalny” z ograniczonym zakresem, np. Zmienne lokalne, ale idziesz do pracy z posiadanym HTML-em, a nie z HTML-em, który możesz chcieć lub chcieć mieć później.
Oczywiście istnieją potencjalne wady i dobre (jeśli nie zawsze istotne) powody, by postępować zgodnie z ortodoksją, jak to rozwinęli inni. Ale dla mnie wygląda to bardziej na przemyślane użycie <style> w <body> już weszło do głównego nurtu.
źródło
Niepoprawny HTML, w każdym razie wydaje się, że każda przeglądarka bierze pod uwagę tylko drugą instancję.
Testowane pod ostatnimi wersjami FF i Google Chrome pod Fedorą oraz FF, Opera, IE i Chrome pod XP.
źródło
Sądzę, że będzie się to różnić w zależności od przeglądarki: globalne reguły wyświetlania prawdopodobnie zostaną zaktualizowane wraz z przeglądaniem kodu.
Takie zmiany można zobaczyć w globalnych regułach wyświetlania czasami, gdy zewnętrzny arkusz stylów jest ładowany z opóźnieniem. Coś podobnego może się tu zdarzyć, ale w tak krótkim odstępie czasu, że tak naprawdę nie jest renderowane.
W każdym razie to nie jest poprawny HTML, więc powiedziałbym, że to daremna rzecz do przemyślenia.
<style>
tagi należą dohead
sekcji strony.źródło
Jak powiedzieli inni, nie jest to prawidłowy HTML, ponieważ znaczniki stylu należą do głowy.
Jednak większość przeglądarek tak naprawdę nie wymusza tej weryfikacji. Zamiast tego po załadowaniu dokumentu style są scalane i stosowane. W takim przypadku drugi zestaw stylów zawsze zastąpi pierwszy, ponieważ były ostatnimi napotkanymi definicjami.
źródło
<style>
Tag należy w<head>
części, oddzielone od wszystkich treści.Odniesienia: W3C Specs i W3Schools
źródło
W twoim przykładzie przeglądarka nie powinna „nic robić”. HTML jest nieprawidłowy. Wyzwalane jest albo odzyskiwanie po błędzie, albo analizator składni robi to tak, jak chce.
W prawidłowym przypadku wiele arkuszy stylów jest po prostu traktowanych jako pojawiających się jeden po drugim, kaskada jest obliczana normalnie.
źródło
Myślę, że może to być problem z ograniczonymi kontekstami, np. Edytory WYIWYG w systemie internetowym używanym przez użytkowników niebędących programistami , co ogranicza możliwości przestrzegania standardów. Czasami (jak TinyMCE) jest to biblioteka, która umieszcza twoją treść / kod wewnątrz
textarea
tagu, który jest renderowany przez edytor jako dużydiv
tag. Czasami może to być stara wersja tych edytorów.Przypuszczam, że:
stylesheets
. W rzeczywistości byłoby to niepraktyczne dla administratorów (lub webdevów), biorąc pod uwagę liczbę żądań w tym sensie, jakie mieliby.W niektórych przypadkach bez
style
zasad użytkowania może to być bardzo słaba jakość projektowania. Tak, ci użytkownicy potrzebują dostosowania. OK, ale jakie byłyby rozwiązania w tym scenariuszu? Biorąc pod uwagę różne sposoby wstawiania CSS nahtml
stronie, przypuszczam, że te rozwiązania:Pierwsza opcja: zapytaj swojego systemu
Poproś system o przyznanie się do włączenia niektórych reguł CSS w systemie
stylesheets
. To będzie zewnętrzne lub wewnętrzne rozwiązanie CSS . Jak już powiedziano, może to nie być możliwe.Druga opcja:
<link>
wł<body>
Użyj zewnętrznego arkusza stylów na
body
znaczniku, tj. Użyjlink
znacznika w obszarze, do którego masz dostęp (to znaczy w witrynie, wewnątrzbody
znacznika, a nie whead
znaczniku). Niektóre źródła podają, że jest to w porządku, ale „nie jest dobrą praktyką”, np. MDN :Niektóre inne ograniczają go do
<head>
sekcji, na przykład w3schools :Testowanie
Przetestowałem to tutaj (środowisko pulpitu, w przeglądarce) i działa dla mnie. Utwórz plik
foo.html
:A następnie plik CSS, w tym samym katalogu, o nazwie
bar.css
:Cóż, będzie to tylko możliwe, jeśli masz jak załadować plik CSS gdzieś w systemie instytucji. Może tak by było.
Trzecia opcja:
<style>
wł<body>
Użyj internetowego arkusza stylów na
body
znaczniku, tj. Użyjstyle
znacznika w obszarze, do którego masz dostęp (to znaczy w witrynie, wewnątrzbody
znacznika, a nie whead
znaczniku). O to właśnie tutaj odpowiadają odpowiedzi Charlesa Salvii i Sz . Wybierając tę opcję, rozważ ich obawy.Czwarta, piąta i szósta opcja: sposoby JS
Alert Te są związane z modyfikowaniem
<head>
elementu strony. Może to nie będzie administratorzy systemu pozwolą na to. Dlatego zaleca się, aby najpierw zapytać ich o zgodę.Okej, zakładając, że udzielono pozwolenia, strategią jest dostęp do
<head>
. W jaki sposób? Metody JavaScript.Czwarta opcja: nowa w
<link>
dniu<head>
To kolejna wersja drugiej opcji. Użyj zewnętrznego arkusza stylów na
<head>
znaczniku, tj. Użyj<link>
elementu poza obszarem, do którego masz dostęp (to znaczy, że w witrynie nie będzie wewnątrzbody
znacznika, a tak wewnątrzhead
znacznika). To rozwiązanie jest zgodne z zaleceniami MDN i w3schools , jak cytowano powyżej, w sprawie rozwiązania drugiej opcji. NowyLink
obiekt zostanie utworzony.Aby rozwiązać problem za pomocą JS, istnieje wiele sposobów, ale w poniższych kodelinach pokazuję jeden prosty.
Testowanie
Przetestowałem to tutaj (środowisko pulpitu, w przeglądarce) i działa dla mnie. Utwórz plik
f.html
:Wewnątrz
script
tagu:A następnie w pliku CSS, w tym samym katalogu, zwanym
bar.css
(jak w 2. opcji):Jak już powiedziałem: będzie to wyglądać tylko wtedy, gdy masz jak załadować plik CSS gdzieś w systemie instytucji.
Piąta opcja: nowa w
<style>
dniu<head>
Użyj nowego wewnętrznego arkusza stylów na
<head>
znaczniku, tj. Użyj nowego<style>
elementu poza obszarem, do którego masz dostęp (to znaczy, że w witrynie nie będzie wewnątrzbody
znacznika, a tak wewnątrzhead
znacznika). NowyStyle
obiekt zostanie utworzony.Rozwiązuje to JS. Poniżej przedstawiono jeden prosty sposób.
Testowanie
Przetestowałem to tutaj (środowisko pulpitu, w przeglądarce) i działa dla mnie. Utwórz plik
foobar.html
:Wewnątrz
script
tagu:6 opcja: użycie istniejącej
<style>
na<head>
Użyj istniejącego wewnętrznego arkusza stylów na
<head>
znaczniku, tj. Użyj<style>
elementu poza obszarem, do którego masz dostęp (to znaczy w witrynie, nie wewnątrzbody
znacznika i tak wewnątrzhead
znacznika), jeśli taki istnieje. NowyStyle
obiekt zostanie utworzony lubCSSStyleSheet
przedmiot zostanie użyty (w kodzie rozwiązania przyjętego tutaj).Jest to w pewnym punkcie ryzykowne. Po pierwsze , ponieważ może nie istnieć jakiś
<style>
obiekt. W zależności od sposobu wdrożenia tego rozwiązania możesz uzyskaćundefined
zwrot (system może użyć zewnętrznego arkusza stylów ). Po drugie , ponieważ będziesz edytować prace autora projektu systemu (problemy z autorstwem). Po trzecie , ponieważ może to nie być dozwolone w polityce bezpieczeństwa IT Twojej instytucji. Zapytaj więc o pozwolenie (tak jak w innych rozwiązaniach JS) .Przypuśćmy, że ponownie udzielono pozwolenia:
Trzeba będzie wziąć pod uwagę pewne ograniczenia dotyczące sposobu dostępną ten sposób:
insertRule()
. Proponowane rozwiązanie wykorzystuje scenariusz domyślny i operację na początkustylesheet
, jeśli takie istnieją.Testowanie
Przetestowałem to tutaj (środowisko pulpitu, w przeglądarce) i działa dla mnie. Utwórz plik
foo_bar.html
:Wewnątrz
script
tagu:Innym podejściem do tego rozwiązania jest użycie
CSSStyleDeclaration
obiektu (dokumenty w w3schools i MDN ). Ale może to nie być interesujące, biorąc pod uwagę ryzyko zastąpienia istniejących reguł CSS systemu.7. opcja: wbudowany CSS
Użyj wbudowanego CSS . To rozwiązuje problem, chociaż w zależności od rozmiaru strony (w wierszach kodu) utrzymanie kodu (przez samego autora lub inną wyznaczoną osobę) kodu może być bardzo trudne.
Jednak w zależności od kontekstu roli w instytucji lub jej zasad bezpieczeństwa systemu internetowego może to być unikalne dostępne rozwiązanie.
Testowanie
Utwórz plik
_foobar.html
:Odpowiadając ściśle na pytanie zadane przez Gagana
(dostosowany cytat)
Aby uzyskać dokładniejszą odpowiedź, sugeruję Google następujące artykuły:
źródło
Ponieważ ten kod HTML jest niepoprawny, nie ma żadnego wpływu na wynik ... oznacza to po prostu, że HTML jest zgodny ze standardem (wyłącznie w celach organizacyjnych). Ze względu na ważność można to napisać w następujący sposób:
Domyślam się, że przeglądarka stosuje ostatni styl, na jaki się natknie.
źródło
Tak, może. Sprawdziłem na stronie Mozilli. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style
źródło