<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>
Comment un navigateur est-il censé rendre des CSS qui ne sont pas contigus? Est-il censé générer une structure de données en utilisant tous les styles CSS sur une page et l'utiliser pour le rendu?
Ou rend-il en utilisant les informations de style dans l'ordre qu'il voit?
CSS
etHTML
.<head>
balise<body>
plutôt que dans le<head>
.Réponses:
Comme d'autres l'ont déjà mentionné, HTML 4 nécessite que la
<style>
balise soit placée dans la<head>
section (même si la plupart des navigateurs autorisent les<style>
balises dans labody
).Cependant, HTML 5 inclut le
scoped
attribut (voir la mise à jour ci-dessous), qui vous permet de créer des feuilles de style qui sont limitées à l'élément parent de la<style>
balise. Cela vous permet également de placer des<style>
balises dans l'<body>
élément:Si vous restituez le code ci-dessus dans un navigateur compatible HTML-5 qui prend en charge
scoped
, vous verrez la portée limitée de la feuille de style.Il y a juste une mise en garde majeure ...
Au moment où j'écris cette réponse (mai 2013), presque aucun navigateur traditionnel ne prend actuellement en charge l'
scoped
attribut. (Bien que les versions développeur de Chromium le supportent apparemment .)TOUTEFOIS, il y a une implication intéressante de l'
scoped
attribut qui se rapporte à cette question. Cela signifie que les futurs navigateurs sont mandatés via la norme pour permettre<style>
éléments dans le<body>
(tant que les<style>
éléments sont limités.)Donc, étant donné que:
scoped
attribut<style>
balises dans le<body>
<style>
balises dans le<body>
... alors il n'y a littéralement aucun mal * à placer des
<style>
étiquettes dans le corps, tant que vous les testez avec unscoped
attribut. Le seul problème est que les navigateurs actuels ne limiteront pas réellement la portée de la feuille de style - ils l'appliqueront à l'ensemble du document. Mais le fait est que, à toutes fins pratiques, vous pouvez inclure des<style>
balises dans la<body>
condition que vous:scoped
attribut<body>
ne sera pas réellement étendue (car il n'existe pas encore de prise en charge du navigateur)* sauf bien sûr, pour faire chier les validateurs HTML ...
Enfin, en ce qui concerne l'affirmation courante (mais subjective) selon laquelle l'incorporation de CSS dans HTML est une mauvaise pratique, il convient de noter que l' intérêt de l'
scoped
attribut est de s'adapter aux cadres de développement modernes typiques qui permettent aux développeurs d'importer des morceaux de HTML en tant que modules ou contenu syndiqué. . Il est très pratique d'avoir un CSS intégré qui ne s'applique qu'à un morceau particulier de HTML, afin de développer des composants modulaires encapsulés avec des styles spécifiques.Mise à jour à partir de février 2019, selon la documentation de Mozilla , l'
scoped
attribut est obsolète. Chrome a cessé de le prendre en charge dans la version 36 (2014) et Firefox dans la version 62 (2018). Dans les deux cas, la fonctionnalité devait être explicitement activée par l'utilisateur dans les paramètres des navigateurs. Aucun autre navigateur majeur ne l'a jamais supporté.la source
head
. Si c'est votre seul CSS, et si la page est grande et si la connexion réseau n'est pas très rapide, alors vous verrez peut-être un flash de contenu sans style, mais cela me surprendrait dans la plupart des situations pratiques.@scoped
ouscoped
semble s'éteindre: ici et iciscoped
attribut a été supprimé des spécifications HTML5 actuelles.MAUVAISES NOUVELLES pour les amateurs de "style dans le corps": le W3C a récemment perdu la guerre HTML contre WHATWG, dont le HTML sans version "Living Standard" est devenu officiel, ce qui, hélas, ne le permet pas
STYLE
dans leBODY
. Les jours heureux de courte durée sont terminés. ;) Le validateur W3C fonctionne également selon les spécifications WHATWG maintenant. (Merci @FrankConijn pour l'avertissement!)(Remarque: c'est le cas "à partir d'aujourd'hui", mais comme il n'y a pas de versioning, les liens peuvent devenir invalides à tout moment sans préavis ni contrôle. À moins que vous ne souhaitiez créer un lien vers ses sources individuelles s'engage sur GitHub, vous ne pouvez pas faire plus longtemps des références stables au nouveau standard HTML officiel , AFAIK. Veuillez me corriger s'il existe une manière canonique de le faire correctement.)
BONNES NOUVELLES OBSOLÈTES:
Oui,
STYLE
est enfin valide dansBODY
, à partir de HTML5.2! (Etscoped
est parti aussi.)D'après les spécifications du W3C ( savourez la dernière ligne! ):
NOTE MÉTALLIQUE:
Le simple fait que, malgré les dégâts de la «guerre des navigateurs», nous devions continuer à nous développer contre deux normes «officielles» HTML « concurrentes ridiculement » (citations pour
1 standard + 1 standard < 1 standard
) signifie que l'approche «de retour au bon sens dans les tranchées» le développement web n'a jamais vraiment cessé de s'appliquer.Cela peut enfin changer maintenant, mais en citant la sagesse conventionnelle: les auteurs / développeurs Web et donc, à leur tour, les navigateurs devraient finalement décider ce qui devrait (et ne devrait pas) être dans les spécifications, quand il n'y a aucune bonne raison contre ce qui a déjà été fait dans réalité. Et la plupart des navigateurs ont longtemps pris
STYLE
en chargeBODY
(d'une manière ou d'une autre; voir par exemple l'scoped
attr.), Malgré ses performances inhérentes (et éventuellement d'autres) pénalités (que nous devrions décider de payer ou non, pas les spécifications). Donc, pour commencer, je continuerai à parier sur eux, et je ne perdrai pas espoir. ;) Si le WHATWG a le même respect pour la réalité / les auteurs qu'ils le prétendent, ils peuvent finir par faire ici ce que le W3C a fait.la source
style
bloc dans lebody
qui valide?STYLE
comme des métadonnées et du contenu de flux, mais la dernière spécification WHATWG "vivante" raconte la vieille et ennuyeuse histoire "métadonnées uniquement" (ne l'autorisant que dans HEAD). Et, pour ajouter l'insulte à la blessure, le validateur W3C semble suivre la saveur WHATWG. Je n'ai pas encore décidé de rire ou de pleurer, mais j'ai décidé, personnellement, de "se tromper" avec le cas "navigateurs + W3C - validateur", et d'autoriser STYLE dans le CORPS. (BTW, n'oubliez pas: nous devrions être la source ultime de la norme , en fait.)Quand je vois que les systèmes de gestion de contenu pour grands sites mettent régulièrement certains éléments <style> (certains, pas tous) près du contenu qui repose sur ces classes, je conclus que le cheval est sorti de la grange.
Allez voir les sources de pages de cnn.com, nytimes.com, huffingtonpost.com, le journal de votre grande ville le plus proche, etc. Tous le font.
S'il y a une bonne raison de mettre une section <style> supplémentaire quelque part dans le corps - par exemple si vous incluez () des éléments de page divers et indépendants en temps réel et que chacun a son propre <style> intégré, et l'organisation sera plus propre, plus modulaire, plus compréhensible et plus maintenable - je dis juste mordre la balle. Bien sûr, ce serait mieux si nous pouvions avoir un style "local" avec une portée restreinte, comme les variables locales, mais vous allez travailler avec le HTML que vous avez, pas avec le HTML que vous voudrez ou voudrez avoir plus tard.
Bien sûr, il y a des inconvénients potentiels et de bonnes raisons (sinon toujours convaincantes) de suivre l'orthodoxie, comme d'autres l'ont expliqué. Mais pour moi, cela ressemble de plus en plus à une utilisation réfléchie de <style> dans <body>.
la source
HTML non valide, de toute façon, presque tous les navigateurs semblent considérer uniquement la deuxième instance.
Testé sous les dernières versions de FF et Google Chrome sous Fedora, et FF, Opera, IE et Chrome sous XP.
la source
Je suppose que cela variera d'un navigateur à l'autre: les règles d'affichage globales seront probablement mises à jour au fur et à mesure que le navigateur parcourt le code.
Vous pouvez parfois voir ces modifications dans les règles d'affichage globales lorsqu'une feuille de style externe est chargée avec un retard. Quelque chose de similaire pourrait se produire ici, mais dans une succession si courte qu'elle ne sera pas réellement rendue.
Ce n'est pas du HTML valide de toute façon, donc je dirais que c'est une chose futile à penser.
<style>
les balises appartiennent à lahead
section de la page.la source
Comme d'autres l'ont dit, ce n'est pas du HTML valide car les balises de style appartiennent à la tête.
Cependant, la plupart des navigateurs n'appliquent pas vraiment cette validation. Au lieu de cela, une fois le document chargé, les styles sont fusionnés et appliqués. Dans ce cas, le deuxième ensemble de styles remplacera toujours le premier car ce sont les dernières définitions rencontrées.
la source
La
<style>
balise appartient au<head>
section, séparée de tout le contenu.Références: Spécifications W3C et W3Schools
la source
Dans votre exemple, un navigateur n'est "censé" rien faire. Le HTML n'est pas valide. Soit la récupération d'erreur est déclenchée, soit l'analyseur en fait comme il le fera.
Dans une instance valide, plusieurs feuilles de style sont simplement traitées comme apparaissant les unes après les autres, la cascade est calculée comme normale.
la source
Je suppose que cela peut être un problème concernant des contextes limités, par exemple les éditeurs WYIWYG sur un système Web utilisé par des utilisateurs non programmeurs , ce qui limite les possibilités de suivre les normes. Parfois (comme TinyMCE), c'est une bibliothèque qui place votre contenu / code dans une
textarea
balise, qui est rendue par l'éditeur comme une grandediv
balise. Et parfois, il peut s'agir d'une ancienne version de ces éditeurs.Je suppose que:
stylesheets
. En fait, il serait peu pratique pour les administrateurs (ou webdevs), compte tenu du nombre de demandes en ce sens qu'ils auraient.Dans certains cas, sans
style
règles d' utilisation , il peut s'agir d'une expérience de conception très médiocre. Donc, oui, ces utilisateurs ont besoin de personnalisation. D'accord, mais quelles seraient les solutions, dans ce scénario? Compte tenu des différentes façons d'insérer CSS dans unehtml
page, je suppose que ces solutions:1ère option: demandez à votre administrateur système
Demandez à votre administrateur système d'inclure certaines règles CSS au niveau du système
stylesheets
. Ce sera une solution CSS externe ou interne . Comme déjà dit, cela pourrait ne pas être possible.2ème option:
<link>
sur<body>
Utilisez une feuille de style externe sur la
body
balise, c'est-à-dire l'utilisation de lalink
balise à l' intérieur de la zone à laquelle vous avez accès (qui sera, sur le site, à l'intérieur de labody
balise et non dans lahead
balise). Certaines sources disent que c'est correct, mais "pas une bonne pratique", comme MDN :Certains autres, limitez-le à la
<head>
section, comme w3schools :Essai
Je l'ai testé ici (environnement de bureau, sur un navigateur) et cela fonctionne pour moi. Créez un fichier
foo.html
:Et puis un fichier CSS, dans le même répertoire, appelé
bar.css
:Eh bien, cela semble possible si vous savez comment télécharger un fichier CSS quelque part dans le système de l'institution. Ce serait peut-être le cas.
Option 3:
<style>
sur<body>
Utilisez une feuille de style Internet sur la
body
balise, c'est-à-dire l'utilisation de lastyle
balise à l'intérieur de la zone à laquelle vous avez accès (ce sera, sur le site, à l'intérieur de labody
balise et non dans lahead
balise). C'est à cela que répondent les réponses de Charles Salvia et Sz . En choisissant cette option, tenez compte de leurs préoccupations.4e, 5e et 6e options: voies JS
Alerte Ceux-ci sont liés à la modification de l'
<head>
élément de la page. Peut-être que cela ne sera pas autorisé par les administrateurs système de l'institution. Il est donc recommandé de leur demander d'abord la permission.D'accord, en supposant l'autorisation accordée, la stratégie est d'accéder à la
<head>
. Comment? Méthodes JavaScript.4ème option: nouveau
<link>
sur<head>
Ceci est une autre version de la 2e option. Utilisez une feuille de style externe sur la
<head>
balise, c'est-à-dire l'utilisation de l'<link>
élément en dehors de la zone à laquelle vous avez accès (ce sera, sur le site, pas à l'intérieur de labody
balise et oui à l'intérieur de lahead
balise). Cette solution est conforme aux recommandations de MDN et w3schools , telles que citées ci-dessus, sur la solution de 2ème option. Un nouvelLink
objet sera créé.Pour résoudre le problème via JS, il existe de nombreuses façons, mais dans les lignes de code suivantes, je démontre une solution simple.
Essai
Je l'ai testé ici (environnement de bureau, sur un navigateur) et cela fonctionne pour moi. Créez un fichier
f.html
:À l'intérieur du
script
tag:Et puis dans le fichier CSS, dans le même répertoire, appelé
bar.css
(comme à la 2ème option):Comme je l'ai déjà dit: cela semblera possible si vous savez comment télécharger un fichier CSS quelque part dans le système de l'institution.
5ème option: nouveau
<style>
sur<head>
Utilisez une nouvelle feuille de style interne sur la
<head>
balise, c'est-à-dire l'utilisation d'un nouvel<style>
élément en dehors de la zone à laquelle vous avez accès (ce sera, sur le site, pas à l'intérieur de labody
balise et oui à l'intérieur de lahead
balise). Un nouvelStyle
objet sera créé.Ceci est résolu via JS. Une manière simple est illustrée ci-dessous.
Essai
Je l'ai testé ici (environnement de bureau, sur un navigateur) et cela fonctionne pour moi. Créez un fichier
foobar.html
:À l'intérieur du
script
tag:6ème option: utiliser un existant
<style>
sur<head>
Utilisez une feuille de style interne existante sur la
<head>
balise, c'est-à-dire l'utilisation d'un<style>
élément en dehors de la zone à laquelle vous avez accès (qui sera, sur le site, pas à l'intérieur de labody
balise et oui à l'intérieur de lahead
balise), s'il en existe. Un nouvelStyle
objet sera créé ou unCSSStyleSheet
objet sera utilisé (dans le code de la solution adoptée ici).C'est à un certain point de vue risqué. Tout d'abord , car il peut ne pas exister un
<style>
objet. Selon la façon dont vous implémentez cette solution, vous pouvez obtenir unundefined
retour (le système peut utiliser une feuille de style externe ). Deuxièmement , parce que vous éditez le travail de l'auteur de la conception du système (problèmes de paternité). Troisièmement , parce que cela peut ne pas être autorisé dans la politique de sécurité informatique de votre établissement. Alors, demandez l'autorisation de le faire (comme dans les autres solutions JS) .En supposant, encore une fois, l'autorisation a été accordée:
Vous devrez considérer certaines restrictions de la méthode à la disposition de la façon suivante :
insertRule()
. La solution proposée utilise le scénario par défaut, et une opération au premierstylesheet
, s'il en existe.Essai
Je l'ai testé ici (environnement de bureau, sur un navigateur) et cela fonctionne pour moi. Créez un fichier
foo_bar.html
:À l'intérieur du
script
tag:Une autre approche de cette solution consiste à utiliser un
CSSStyleDeclaration
objet (documentation sur w3schools et MDN ). Mais cela peut ne pas être intéressant, compte tenu du risque de remplacer les règles existantes sur le CSS du système.7ème option: CSS en ligne
Utiliser le CSS en ligne . Cela résout le problème, bien qu'en fonction de la taille de la page (en lignes de code), la maintenance (par l'auteur lui-même ou une autre personne affectée) du code puisse être très difficile.
Mais selon le contexte de votre rôle au sein de l'institution, ou ses politiques de sécurité du système Web, cela pourrait être la solution unique disponible pour vous.
Essai
Créez un fichier
_foobar.html
:Répondre strictement à la question posée par Gagan
(devis adapté)
Pour une réponse plus précise, je suggère à Google ces articles:
la source
Parce que c'est HTML n'est pas valide n'a pas d'effet sur le résultat ... cela signifie simplement que le HTML adhère à la norme (simplement à des fins d'organisation). Pour être valide, il aurait pu être écrit de cette façon:
Je suppose que le navigateur applique le dernier style qu'il rencontre.
la source
Oui il peut. J'ai vérifié sur la page de Mozilla. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style
la source