Чи повинен <STYLE> бути в <HEAD> HTML-документі?


136

Власне кажучи, чи styleповинні теги знаходитися всередині headдокумента HTML? Стандарт 4.01 передбачає це, але прямо не вказано:

Елемент STYLE дозволяє авторам розміщувати правила таблиці стилів у голові документа. HTML дозволяє будь-яку кількість елементів STYLE в розділі HEAD документа.

Я кажу "строго кажучи", тому що у мене є додаток, який розміщує елементи стилю всередині тіла, і всі браузери, з якими я тестував, начебто використовують елементи стилю. Мені просто цікаво, чи це насправді легально.


1
Якщо ви сумніваєтесь, валідатор розмітки W3C завжди допомагає :) http://validator.w3.org/
Lazlo

Один з винятків із правила "put <style> in <head>" - це html-електронна пошта, оскільки багато сервісів веб-пошти просто викреслять будь-які головні елементи, що означає, що ваших стилів немає.
user132837

1
Технічні характеристики вимагають браузерів підтримувати styleв body, тому це для мене досить добре, незалежно від того, що мається на увазі в розділах керівництва автора.
WraithKenny

Відповіді:


104

styleПередбачається, що вона буде включена лише headдо документа.

Окрім точки валідації, одним із застережень, який може зацікавити вас при використанні styleна, bodyє спалах невмілого контенту . Веб-переглядач отримає елементи, які будуть стилізовані після їх відображення, змушуючи їх змінювати розмір / форму / шрифт та / або мерехтіння. Це взагалі ознака поганої майстерності. Як правило, ви можете піти з styleмісця, куди хочете, але намагайтеся уникати цього, коли це можливо.

HTML 5 представив scopedатрибут, який дозволяв styleтеги включати всюди в тілі, але потім вони знову його видалили.


6
На сьогоднішній день здається, що лише Firefox підтримує scopedатрибут, див. Caniuse.com/#feat=style-scoped .
Хайме Хаблуцель

2
Пов'язана стаття випала в гнилі інших посилань, тому ось остання доступна заархівована версія: web.archive.org/web/20150525042412/http://bluerobot.com/web/css/…
Zachary Murray

@ZacharyMurray дякую за голову! Я оновив посилання в тілі до веб-архіву.
Естебан Кюбер

1
Специфікація вимагає відповідних веб-переглядачів для підтримки styleтегів, bodyтому, незважаючи на авторську частину специфікації, я вважаю, що стилі кузова є дійсними. github.com/whatwg/html/isissue/1605#issuecomment-235961103
WraithKenny

19

Коротка відповідь

  • Відповідно до поточної специфікації, так, styleелементи завжди повинні бути в head. Винятків немає (за винятком styleелемента всередині templateелемента , якщо ви хочете це порахувати).

  • Це не завжди було так історично. Якщо ви дбаєте про деталі специфікації та її історію, продовжуйте читати.

  • Незалежно від того , що говорить специфікація, використовуючи styleелементи в body робить більш-менш роботу у всіх основних браузерах. Однак це вважається поганою практикою як через те, що воно порушує специфікацію, так і тому, що це може спричинити небажані наслідки, такі як погіршення продуктивності рендерингу або "спалах невмілого контенту".


Історія спец

styleелементів не існувало в HTML 2 . Вони були введені в HTML 3.0, де вони були включені до списку елементів, які могли б бути включені до головного елемента , але не були включені до списку елементів, які можуть бути присутніми в елементі тіла . Таким чином, в момент, коли елемент був вперше прорисований, він міг бути включений лише до head.

Це залишалося так (хоч і виражалося з використанням різних формулювань) до HTML 5, який ввів scopedатрибут (з моменту вилучення) для styleелементів. Цей атрибут, якщо він присутній, мав на меті дати можливість styleелементу розміщуватись в елементі в тілі, щоб стилізувати лише його нащадків. Однак ця функція ніколи не переходила в будь-який реальний веб-переглядач (принаймні, не вимагаючи включення через прапор розробника), і була видалена як із специфікацій W3C, так і з WhatWG, "через відсутність інтересу до програми" . Після цього styleелементи були дозволені лише в контекстах, які дозволяють вміст метаданих, який є лише заголовком. Таким чином, ми повернулися до тих же правил, що й до HTML 5.

Однак через помилку, допущену обома спецорганізаціями, ненормативний покажчик елементів, включений як додаток до обох специфікацій, не був належним чином оновлений для відображення видалення scoped, що робить його невідповідним нормативним специфікаціям. Я вказав на це і на WhatWG, і на W3C , і тим самим мимоволі запускав події, що призвели до розбіжності двох специфікацій.

Рішення WhatWG щодо невідповідності між нормативним специфікацією та ненормативним індексом полягало в тому, щоб прийняти мій виправлення, виправляючи ненормативний індекс.

W3C, з іншого боку, відхилив мій еквівалентний патч на користь замість того, щоб оновити нормативну специфікацію, щоб дозволити використання styleелементів у програмі body, одночасно вказуючи це на зауваження, що це може спричинити проблеми і слід робити "обережно". Причина цієї зміни полягала в тому, щоб примірник узгоджувався з поведінкою в реальному житті.

Таким чином, з березня 2017 року випадок офіційної відповіді на це питання залежав від того, яку організацію зі стандартів ви обрали для прослуховування. Якщо ви перерахували до (загалом більш поважних) специфікацій WhatWG, то styleелемент не був дозволений у body. Якщо ви перерахували специфікацію W3C, це було дозволено, але не рекомендується.

Цей дурний стан речей було закінчено (можливо, як і багато інших подібних невідповідностей) мирним договором у квітні 2019 року між W3C та WhatWG , який погодився, що специфікація WhatWG стане єдиним справжнім живим стандартом HTML, і W3C просто випустить знімки з нього як пронумеровані. Специфікації HTML замість того, щоб паралельно розробляти конкуруючу специфікацію. Таким чином, зміна з 2017 року на вилку W3C, яка дозволила styleелементам у body, більше не є частиною жодної поточної специфікації; це просто цікавість історії.

Отже, сьогодні нам потрібно лише звернутися до специфікації WhatWG, щоб визначити, що дозволено офіційно. Це має сказати:

4.2.6. styleелемент

Категорії :

Вміст метаданих .

Контексти , в яких цей елемент може бути використаний :

Там, де очікується вміст метаданих .
У <noscript>елементі, який є дочірньою частиною <head>елемента.

CTRL-Fing через односторінкову специфікацію виявляє, що єдиним елементом, модель вмісту якого містить вміст метаданих, є headелемент.

Ненормативний індекс елементів, про який я згадував фіксуючи раніше, також підтверджує, що єдиними допустимими батьками для styleелемента є headабо noscriptелемент.


18

Хоча інші відповіді правильні, я дивуюсь, що ніхто не пояснив, де стандарти забороняють стилі поза head.

Це насправді в розділі про headЕлемент (і в DTD ):

<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
<!ENTITY % head.content "TITLE & BASE?">

<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->

Так, я знаю. DTD важко читати.

Це єдине місце, де STYLEелемент зустрічається, тому явно він недійсний в іншому місці.


6
Я так розгублений.
dav_i

1
Має використовувати HTML5 зараз, у IIRC немає DTD. Що говорить лише специфікація HTML5, це те, що є чи ні.
Ян Кю Пеблик

14

Вони не повинні виходити за межі голови, але вони все одно працюють; хоча ви можете помітити швидке мерехтіння. Сайт не повинен підтверджувати тег стилю поза головою, але чи це насправді має значення? Крім того, теги посилань працюють і поза головою, хоча вони і не повинні.


5
Сказати "вони працюють" - трохи хитро. У кращому випадку ви можете сказати, що більшість сучасних браузерів все одно візуалізуватимуть стилі, але в цій помилці нічого, що по суті, «працює», немає. Він не може працювати в будь-якій майбутній версії будь-якого браузера, і вони не роблять нічого поганого.
Чак

6
imo, надані стилі = працює; нічого хитрого. що останнє речення потрібно переписати; це не має сенсу. Я згадав, як це було не правильно ", коли сказав, що це не підтверджує, тому я не повинен розуміти, що ви мали на увазі під цим реченням".
geowa4

Проблема полягає в тому, що навіть якщо вони будуть стилізовані, у вас з'явиться деякий мерехтіння вмісту, коли вони style
запускаються

2
якщо тільки тег стилю не вперше в тілі
geowa4

Не спробуйте цього вдома.
TechNyquist

3

Як і інші відповіді, вони заявили, що насправді не потрібно там бути. Однак це не буде підтверджено. Це може не мати значення в цьому випадку, але врахуйте, що ренделінг HTML повністю залежить від браузерів. Наскільки я знаю, всі використовувані сьогодні браузери підтримуватимуть його розміщення поза головою, але ви не можете гарантувати це для майбутніх браузерів та майбутніх версій браузера.

Дотримуйтесь стандарту і вам безпечніше. Наскільки безпечніше - дуже багато дебатів.


3

Рекомендація HTML5.2 W3C від 14 грудня 2017 року (не раніше проект, про який було сказано вище) тепер говорить, що ви можете їх включити <style>.

"В тілі, де очікується вміст потоку". (розділ 4.2.6)


Хоча зараз, W3C офіційно заявляє, що специфікація WhatWG застаріває всі попередні характеристики, а специфікація WhatWG не дозволяє styleце body, тому ми повертаємось до того, що це однозначно заборонено. Дивіться мою відповідь, якщо вас цікавить крутий шлях, яким ми потрапили сюди.
Марк Амері

2

Тег стилів у будь-якому місці, але всередині <head>, не підтверджується правилами W3C.


2

Відповідно до цього сайту, HTML5.1 (у чернетці) та WHATWG дозволяють розміщувати <style>тег у тілі:

http://www.html.am/tags/html-style-tag.cfm

Схоже, він досить довго підтримувався браузерами. Відповідно до цієї відповіді StackOverflow, Firefox 3+, IE6 +, Safari 2+ та Chrome 12+ підтримують її:

https://stackoverflow.com/a/10989663/297793



-1

Ви також можете використовувати тег стилів у розділі голови чи корпусу, а також поза тегом html (сторонній html не рекомендується). У проектах у режимі реального часу ви можете бачити, що вони використовують тег стилів із боку тегів html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.