<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>
Wie soll ein Browser CSS rendern, das nicht zusammenhängend ist? Soll es eine Datenstruktur mit allen CSS-Stilen auf einer Seite generieren und diese zum Rendern verwenden?
Oder wird mit Stilinformationen in der angezeigten Reihenfolge gerendert?
CSS
und zu verwechselnHTML
.<head>
Tag definierte CSS<body>
als in der<head>
.Antworten:
Wie bereits erwähnt, muss das
<style>
Tag in HTML 4 in den<head>
Abschnitt eingefügt werden (obwohl die meisten Browser<style>
Tags innerhalb des Abschnitts zulassenbody
).HTML 5 enthält jedoch das
scoped
Attribut (siehe Update unten), mit dem Sie Stylesheets erstellen können, die innerhalb des übergeordneten Elements des<style>
Tags liegen. Auf diese Weise können Sie auch<style>
Tags innerhalb des<body>
Elements platzieren:Wenn Sie den obigen Code in einem HTML-5-fähigen Browser rendern, der dies unterstützt
scoped
, wird der begrenzte Umfang des Stylesheets angezeigt .Es gibt nur eine große Einschränkung ...
Zum Zeitpunkt, an dem ich diese Antwort schreibe (Mai 2013), unterstützt derzeit fast kein Mainstream-Browser das
scoped
Attribut. (Obwohl anscheinend Entwickler-Builds von Chromium dies unterstützen.)Es gibt jedoch eine interessante Implikation des
scoped
Attributs, das sich auf diese Frage bezieht. Dies bedeutet, dass zukünftige Browser über den Standard beauftragt werden,<style>
Elemente innerhalb der zuzulassen<body>
(solange die<style>
Elemente einen Gültigkeitsbereich haben).Angesichts dessen:
scoped
Attribut<style>
Tags innerhalb der<body>
<style>
Tags mit Gültigkeitsbereich innerhalb des zuzulassen<body>
... dann schadet es buchstäblich nicht ,
<style>
Tags im Körper zu platzieren, solange Sie sie mit einemscoped
Attribut zukunftssicher machen . Das einzige Problem ist, dass aktuelle Browser den Umfang des Stylesheets nicht einschränken , sondern auf das gesamte Dokument anwenden. Aber der Punkt ist , dass für alle praktischen Zwecke, Sie können umfassen<style>
Tags innerhalb der ,<body>
dass Sie zur Verfügung gestellt:scoped
Attributs<body>
sofort keinen Gültigkeitsbereich mehr hat (da noch keine Unterstützung für Mainstream-Browser vorhanden ist).* außer natürlich, um HTML-Validatoren zu verärgern ...
In Bezug auf die allgemeine (aber subjektive) Behauptung, dass das Einbetten von CSS in HTML eine schlechte Praxis ist, sollte angemerkt werden, dass der Sinn des
scoped
Attributs darin besteht, typische moderne Entwicklungsframeworks zu berücksichtigen, mit denen Entwickler HTML-Blöcke als Module oder syndizierten Inhalt importieren können . Es ist sehr praktisch, eingebettetes CSS zu haben, das nur für einen bestimmten HTML-Teil gilt, um gekapselte, modulare Komponenten mit bestimmten Stilen zu entwickeln.Aktualisierung ab Februar 2019 Laut Mozilla-Dokumentation ist das
scoped
Attribut veraltet. Chrome unterstützt es nicht mehr in Version 36 (2014) und Firefox in Version 62 (2018). In beiden Fällen musste die Funktion vom Benutzer in den Browsereinstellungen explizit aktiviert werden. Kein anderer großer Browser hat dies jemals unterstützt.quelle
head
. Wenn dies Ihre einzige CSS, und wenn die Seite groß ist und wenn die Netzwerkverbindung nicht sehr schnell ist, dann vielleicht werden Sie einen Blitz von unstyled Inhalt sehen, aber es würde mich überraschen , in den meisten praktischen Situationen.@scoped
oderscoped
scheint auszusterben: hier und hierscoped
Attribut wurde aus den aktuellen HTML5-Spezifikationen entfernt.BREAKING NEWS BAD für „Stil in Körper“ Liebhaber: W3C hat vor kurzem den HTML - Krieg verloren gegen WHATWG, dessen versions HTML „Living Standard“ hat nun die offizielle, die leider nicht nicht erlauben
STYLE
in derBODY
. Die kurzlebigen glücklichen Tage sind vorbei. ;) Der W3C-Validator funktioniert jetzt auch nach den WHATWG-Spezifikationen. (Danke @FrankConijn für das Heads-up!)(Hinweis: Dies ist "ab heute" der Fall, aber da es keine Versionierung gibt, können Links jederzeit ohne vorherige Ankündigung oder Kontrolle ungültig werden. Wenn Sie nicht bereit sind, auf die einzelnen Quell-Commits bei GitHub zu verlinken, können Sie dies grundsätzlich nicht Machen Sie länger stabile Verweise auf den neuen offiziellen HTML-Standard AFAIK. Bitte korrigieren Sie mich, wenn es einen kanonischen Weg gibt, dies richtig zu machen.)
OBSOLETED GOOD NEWS:
Yay,
STYLE
ist abBODY
HTML5.2 endlich gültig ! (Undscoped
ist auch weg.)Aus den W3C-Spezifikationen ( genieße die letzte Zeile! ):
META SEITLICHER HINWEIS:
Die bloße Tatsache, dass wir uns trotz der Schäden des "Browserkrieges" immer noch gegen zwei lächerlich konkurrierende "offizielle" HTML "-Standards (Anführungszeichen für
1 standard + 1 standard < 1 standard
) weiterentwickeln mussten, bedeutet, dass der Ansatz" Rückgriff auf den gesunden Menschenverstand "in den Graben geht Die Webentwicklung hat nie wirklich aufgehört, sich zu bewerben.Dies mag sich jetzt endgültig ändern, aber unter Berufung auf die konventionelle Weisheit: Webautoren / -entwickler und damit wiederum sollten Browser letztendlich entscheiden, was in den Spezifikationen enthalten sein soll (und was nicht), wenn es keinen guten Grund gegen das gibt, was bereits getan wurde Wirklichkeit. Und die meisten Browser sind seit langem unterstützt
STYLE
inBODY
(in der einen oder anderen, siehe zB dasscoped
. Attr) (das trotz seiner inhärenten Leistung (und möglicherweise andere) Strafen wir . Zu Bezahlung entscheiden sollte oder nicht, nicht die Spezifikationen). Zum einen werde ich weiter auf sie wetten und die Hoffnung nicht aufgeben. ;) Wenn WHATWG den gleichen Respekt vor der Realität / den Autoren hat, wie sie behaupten, können sie hier einfach das tun, was das W3C getan hat.quelle
style
Blockbody
angeben, der validiert?STYLE
als Metadaten- und Flow-Inhalt behandelt, aber die neueste WHATWG-Spezifikation "living" erzählt die alte, langweilige Geschichte "nur Metadaten" (nur in HEAD zulässig). Und um die Verletzung noch schlimmer zu machen, scheint der W3C-Validator dem WHATWG-Geschmack zu folgen. Ich habe mich noch nicht entschieden, ob ich lachen oder weinen soll, aber ich habe mich persönlich entschieden, mich mit dem Fall "Browser + W3C - Validator" zu "irren" und STYLE in the BODY zuzulassen. (Übrigens, vergessen Sie nicht: Wir sollten eigentlich die ultimative Quelle des Standards sein .)Wenn ich sehe, dass die Content-Management-Systeme auf großen Websites routinemäßig einige <style> -Elemente (einige, nicht alle) in die Nähe des Inhalts bringen, der auf diesen Klassen basiert, komme ich zu dem Schluss, dass das Pferd nicht im Stall ist.
Schauen Sie sich die Seitenquellen von cnn.com, nytimes.com, huffingtonpost.com, der nächstgelegenen Großstadtzeitung usw. an. Alle tun dies.
Wenn es einen guten Grund gibt, irgendwo im Text einen zusätzlichen <style> -Abschnitt einzufügen - zum Beispiel, wenn Sie verschiedene und unabhängige Seitenelemente in Echtzeit einfügen () und jeder einen eigenen <style> für sich hat, und Die Organisation wird sauberer, modularer, verständlicher und wartbarer sein - ich sage, beißen Sie einfach die Kugel. Sicher wäre es besser, wenn wir einen "lokalen" Stil mit eingeschränktem Umfang haben könnten, wie lokale Variablen, aber Sie arbeiten mit dem HTML, das Sie haben, und nicht mit dem HTML, das Sie zu einem späteren Zeitpunkt haben möchten oder möchten.
Natürlich gibt es potenzielle Nachteile und gute (wenn auch nicht immer zwingende) Gründe, der Orthodoxie zu folgen, wie andere ausgeführt haben. Aber für mich sieht es immer mehr so aus, als wäre die durchdachte Verwendung von <style> in <body> bereits zum Mainstream geworden.
quelle
Kein gültiges HTML, jedenfalls scheint so ziemlich jeder Browser nur die zweite Instanz zu berücksichtigen.
Getestet unter den letzten Versionen von FF und Google Chrome unter Fedora und FF, Opera, IE und Chrome unter XP.
quelle
Ich denke, dies wird von Browser zu Browser unterschiedlich sein: Die globalen Anzeigeregeln werden wahrscheinlich aktualisiert, wenn der Browser den Code durchläuft.
Sie können solche Änderungen manchmal in den globalen Anzeigeregeln sehen, wenn ein externes Stylesheet mit einer Verzögerung geladen wird. Ähnliches könnte hier passieren, aber in so kurzer Folge, dass es nicht wirklich gerendert wird.
Es ist sowieso kein gültiger HTML-Code, daher würde ich sagen, dass es sinnlos ist, darüber nachzudenken.
<style>
Tags gehören in denhead
Bereich der Seite.quelle
Wie andere gesagt haben, ist dies kein gültiger HTML-Code, da die Style-Tags in den Kopf gehören.
Die meisten Browser erzwingen diese Validierung jedoch nicht wirklich. Sobald das Dokument geladen ist, werden die Stile zusammengeführt und angewendet. In diesem Fall überschreibt der zweite Satz von Stilen immer den ersten, da dies die letzten gefundenen Definitionen waren.
quelle
Das
<style>
Tag gehört in den<head>
Abschnitt, getrennt vom gesamten Inhalt.Referenzen: W3C Specs und W3Schools
quelle
In Ihrem Beispiel soll ein Browser nichts tun. Der HTML-Code ist ungültig. Entweder wird eine Fehlerbehebung ausgelöst, oder der Parser macht es so, wie er will.
In einer gültigen Instanz werden mehrere Stylesheets nur so behandelt, als würden sie nacheinander angezeigt. Die Kaskade wird wie gewohnt berechnet.
quelle
Da dies nicht gültig ist, hat HTML keinen Einfluss auf das Ergebnis. Dies bedeutet lediglich, dass der HTML-Code dem Standard entspricht (lediglich aus organisatorischen Gründen). Um gültig zu sein, hätte es so geschrieben werden können:
Ich vermute, dass der Browser den letzten Stil anwendet, auf den er stößt.
quelle
Ich denke, dies kann ein Problem in Bezug auf begrenzte Kontexte sein, z. B. WYIWYG-Editoren auf einem Web-System, das von Nicht-Programmierer-Benutzern verwendet wird und die Möglichkeiten zur Einhaltung der Standards einschränkt. Manchmal (wie bei TinyMCE) ist es eine Bibliothek, die Ihren Inhalt / Code in ein
textarea
Tag einfügt, das vom Editor als großesdiv
Tag gerendert wird . Und manchmal kann es eine alte Version dieser Editoren sein.Ich nehme an, dass:
stylesheets
. Tatsächlich wäre es für die Administratoren (oder Webdevs) unpraktisch, wenn man die Anzahl der Anfragen in diesem Sinne berücksichtigt, die sie haben würden.In einigen Fällen kann es ohne Verwendungsregeln
style
zu einer sehr schlechten Entwurfserfahrung kommen. Ja, diese Benutzer müssen angepasst werden. Okay, aber was wären die Lösungen in diesem Szenario? In Anbetracht der verschiedenen Möglichkeiten, CSS in einehtml
Seite einzufügen , nehme ich folgende Lösungen an:1. Option: Fragen Sie Ihren Systemadministrator
Bitten Sie Ihren Systemadministrator, einige CSS-Regeln in das System aufzunehmen
stylesheets
. Dies ist eine externe oder interne CSS- Lösung. Wie bereits gesagt, ist dies möglicherweise nicht möglich.2. Option:
<link>
ein<body>
Verwenden Sie ein externes Stylesheet für das
body
Tag, dh die Verwendung deslink
Tags in dem Bereich, auf den Sie Zugriff haben ( dh auf der Site, innerhalb desbody
Tags und nicht imhead
Tag). Einige Quellen sagen, dass dies in Ordnung ist, aber "keine gute Praxis", wie MDN :Einige andere beschränken es auf den
<head>
Abschnitt, wie z. B. w3schools :Testen
Ich habe es hier getestet (Desktop-Umgebung, in einem Browser) und es funktioniert für mich. Erstellen Sie eine Datei
foo.html
:Und dann eine CSS-Datei im selben Verzeichnis mit dem Namen
bar.css
:Nun, dies scheint nur möglich zu sein, wenn Sie wissen, wie Sie eine CSS-Datei irgendwo im Institutionssystem hochladen. Vielleicht wäre das der Fall.
3. Option:
<style>
auf<body>
Verwenden Sie das Internet-Stylesheet für das
body
Tag, dh die Verwendung desstyle
Tags in dem Bereich, auf den Sie Zugriff haben ( dh auf der Site, innerhalb desbody
Tags und nicht imhead
Tag). Dies ist , was Charles Salvia ‚s und Sz ‘ s Antworten hier sind ungefähr. Wenn Sie diese Option auswählen, berücksichtigen Sie deren Bedenken.4., 5. und 6. Option: JS-Wege
Warnung Diese beziehen sich auf das Ändern des
<head>
Elements der Seite. Möglicherweise wird dies von den Systemadministratoren der Institution nicht zugelassen. Es wird daher empfohlen, sie zuerst um Erlaubnis zu bitten.Okay, wenn die Erlaubnis erteilt wurde, ist die Strategie der Zugriff auf die
<head>
. Wie? JavaScript-Methoden.4. Option: neu
<link>
an<head>
Dies ist eine andere Version der 2. Option. Verwenden Sie ein externes Stylesheet für das
<head>
Tag, dh die Verwendung des<link>
Elements außerhalb des Bereichs, auf den Sie Zugriff haben ( dh auf der Site nicht innerhalb desbody
Tags und ja innerhalb deshead
Tags). Diese Lösung entspricht den oben genannten Empfehlungen von MDN und w3schools zur Lösung der zweiten Option. Ein neuesLink
Objekt wird erstellt.Um die Angelegenheit durch JS zu lösen, gibt es viele Möglichkeiten, aber an den folgenden Codelines zeige ich eine einfache.
Testen
Ich habe es hier getestet (Desktop-Umgebung, in einem Browser) und es funktioniert für mich. Erstellen Sie eine Datei
f.html
:Innerhalb des
script
Tags:Und dann in der CSS-Datei, im selben Verzeichnis, aufgerufen
bar.css
(wie bei der 2. Option):Wie ich bereits sagte: Dies sieht nur dann möglich aus, wenn Sie eine CSS-Datei irgendwo im Institutionssystem hochladen.
5. Option: neu
<style>
am<head>
Verwenden Sie ein neues internes Stylesheet für das
<head>
Tag, dh ein neues<style>
Element außerhalb des Bereichs, auf den Sie Zugriff haben ( dh auf der Site, nicht innerhalb desbody
Tags und ja innerhalb deshead
Tags). Ein neuesStyle
Objekt wird erstellt.Dies wird durch JS gelöst. Ein einfacher Weg wird im Folgenden demonstriert.
Testen
Ich habe es hier getestet (Desktop-Umgebung, in einem Browser) und es funktioniert für mich. Erstellen Sie eine Datei
foobar.html
:Innerhalb des
script
Tags:6. Option: Verwenden eines vorhandenen
<style>
auf<head>
Verwenden Sie ein vorhandenes internes Stylesheet für das
<head>
Tag, dh ein<style>
Element außerhalb des Bereichs, auf den Sie Zugriff haben ( dh auf der Site, nicht innerhalb desbody
Tags und ja innerhalb deshead
Tags), falls vorhanden. Ein neuesStyle
Objekt wird erstellt oder einCSSStyleSheet
Objekt wird verwendet (im Code der hier verwendeten Lösung).Dies ist unter bestimmten Gesichtspunkten riskant. Erstens , weil es möglicherweise kein
<style>
Objekt gibt. Abhängig von der Art und Weise, wie Sie diese Lösung implementieren, erhalten Sie möglicherweise eineundefined
Rückgabe (das System verwendet möglicherweise ein externes Stylesheet ). Zweitens , weil Sie die Arbeit des Systemdesign-Autors bearbeiten (Autorenprobleme). Drittens , weil dies in der IT-Sicherheitspolitik Ihrer Institution möglicherweise nicht zulässig ist. Bitten Sie daher um Erlaubnis, dies zu tun (wie bei anderen JS-Lösungen) .Angenommen, die Erlaubnis wurde erneut erteilt:
Sie müssen einige Einschränkungen der auf diese Weise verfügbaren Methode berücksichtigen :
insertRule()
. Die vorgeschlagene Lösung verwendet das Standardszenario und eine Operation am erstenstylesheet
, falls vorhanden.Testen
Ich habe es hier getestet (Desktop-Umgebung, in einem Browser) und es funktioniert für mich. Erstellen Sie eine Datei
foo_bar.html
:Innerhalb des
script
Tags:Ein anderer Ansatz für diese Lösung ist die Verwendung von
CSSStyleDeclaration
Objekten (Dokumente bei w3schools und MDN ). Angesichts des Risikos, vorhandene Regeln im CSS des Systems zu überschreiben, ist dies möglicherweise nicht interessant.7. Option: Inline-CSS
Verwenden Sie Inline-CSS . Dies löst das Problem, obwohl abhängig von der Seitengröße (in Codezeilen) die Wartung (durch den Autor selbst oder eine andere zugewiesene Person) des Codes sehr schwierig sein kann.
Abhängig vom Kontext Ihrer Rolle in der Institution oder den Sicherheitsrichtlinien für das Websystem ist dies möglicherweise die einzigartige verfügbare Lösung für Sie.
Testen
Erstellen Sie eine Datei
_foobar.html
:Die Frage von Gagan genau beantworten
(Zitat angepasst)
Für eine genauere Antwort schlage ich Google diese Artikel vor:
quelle
Ja, kann es. Ich habe auf Mozillas Seite nachgesehen. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style
quelle