<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>
Как браузер должен отображать CSS, который не является смежным? Предполагается ли создать некоторую структуру данных, используя все стили CSS на странице, и использовать ее для рендеринга?
Или он использует информацию о стиле в том порядке, в котором он видит?
CSS
иHTML
.<head>
теге<body>
а не в<head>
.Ответы:
Как уже упоминали другие, HTML 4 требует, чтобы
<style>
тег размещался в<head>
разделе (хотя большинство браузеров допускают<style>
теги внутриbody
).Однако HTML 5 включает в себя
scoped
атрибут (см. Обновление ниже), который позволяет создавать таблицы стилей, которые находятся в родительском элементе<style>
тега. Это также позволяет вам размещать<style>
теги внутри<body>
элемента:Если вы отобразите приведенный выше код в браузере с поддержкой HTML-5, который поддерживает
scoped
, вы увидите ограниченную область применения таблицы стилей.Есть только одна серьезная оговорка ...
На момент написания этого ответа (май 2013 г.) почти ни один из основных браузеров в настоящее время не поддерживает этот
scoped
атрибут. (Хотя, видимо, сборки разработчика Chromium поддерживают его.)ОДНАКО, есть интересное значение
scoped
атрибута, который относится к этому вопросу. Это означает, что будущие браузеры получают мандат через стандарт, чтобы разрешить<style>
элементы внутри<body>
(до тех пор, пока<style>
элементы ограничены).Итак, учитывая, что:
scoped
атрибут<style>
теги в<body>
<style>
теги внутри<body>
... тогда размещение тегов в теле буквально не вредно *
<style>
, если в будущем вы подтвердите их с помощьюscoped
атрибута. Единственная проблема заключается в том, что современные браузеры не будут на самом деле ограничивать область применения таблицы стилей - они будут применять ее ко всему документу. Но дело в том, что для всех практических целей вы можете включать<style>
теги в том случае,<body>
если вы:scoped
атрибут<body>
фактически не будет ограничена (потому что пока еще не поддерживается основной браузер)* кроме, конечно, для того, чтобы разозлить валидаторы HTML ...
Наконец, что касается общего (кроме субъективного) утверждают , что вложение CSS в HTML является плохой практикой, следует отметить , что вся суть в
scoped
атрибуте для размещения типичных современных концепций развития , которые позволяют разработчик импорта куски HTML в виде модулей или синдицированного содержания , Очень удобно иметь встроенный CSS, который применяется только к определенному фрагменту HTML, чтобы разрабатывать инкапсулированные, модульные компоненты со специфическими стилями.Обновление по состоянию на февраль 2019 г., согласно документации Mozilla ,
scoped
атрибут устарел. Chrome прекратил поддерживать его в версии 36 (2014) и Firefox в версии 62 (2018). В обоих случаях эта функция должна была быть явно включена пользователем в настройках браузера. Ни один другой крупный браузер никогда не поддерживал его.источник
head
. Если это ваш единственный CSS, и если страница является большой и если сетевое соединение не очень быстро, то , возможно , вы увидите вспышку контента без стилей, но это бы меня удивить в большинстве практических ситуаций.@scoped
или,scoped
кажется, вымирает: здесь и здесьscoped
Атрибут был удален из текущей спецификации HTML5.Плохие новости для «стиль тела» любителей: W3C недавно потерял HTML войну против WHATWG, чьи versionless HTML «Уровень жизни» теперь стал официальным один, который, увы, никак не позволяет
STYLE
вBODY
. Недолгие счастливые дни закончились. ;) Валидатор W3C также работает по спецификациям WHATWG. (Спасибо @FrankConijn за хедз-ап!)(Примечание: это относится к «сегодняшнему дню», но, поскольку нет контроля версий, ссылки могут стать недействительными в любой момент без уведомления или контроля. Если вы не хотите ссылаться на его отдельные исходные коммиты на GitHub, вы в принципе не можете дольше делайте стабильные ссылки на новый официальный стандарт HTML AFAIK. Пожалуйста, исправьте меня, если есть канонический способ сделать это правильно.)
СОБСТВЕННЫЕ ХОРОШИЕ НОВОСТИ:
Да,
STYLE
наконец-то действует вBODY
HTML5.2! (Иscoped
ушел тоже.)Из спецификации W3C ( смакуйте последнюю строчку! ):
META SIDE-NOTE:
Тот факт, что, несмотря на убытки от «войны браузеров», нам все равно приходилось развиваться против двух смехотворно конкурирующих «официальных» HTML-стандартов (цитат для
1 standard + 1 standard < 1 standard
), означает, что подход «отступления к здравому смыслу» веб-разработка действительно никогда не прекращала применяться.Это может, наконец, измениться сейчас, но, ссылаясь на общепринятую точку зрения: веб-разработчики / разработчики и, следовательно, браузеры, в свою очередь, должны в конечном итоге решить, что должно (и не должно) быть в спецификациях, когда нет веских оснований против того, что уже было сделано в реальность. И большинство браузеров уже давно поддерживается
STYLE
вBODY
(в той или иной форме , см , например , вscoped
. Attr) (который, несмотря на присущие производительности (и , возможно , другие) штрафы мы . Должны решить , платить или нет, а не спецификации). Так что, во-первых, я буду продолжать делать ставки на них, и не собираюсь терять надежду. ;) Если WHATWG имеет такое же уважение к реальности / авторам, как они утверждают, они могут просто сделать здесь то, что сделал W3C.источник
style
блока,body
который проверяет?STYLE
как метаданные и контент потока, но последняя «живая» спецификация WHATWG рассказывает старую, скучную историю «только метаданные» (разрешив ее только в HEAD). И, чтобы добавить оскорбление травме, валидатор W3C, похоже, следует духу WHATWG. Я еще не решил, смеяться или плакать, но уверен, что лично решил «ошибиться» с делом «браузеры + W3C - валидатор» и разрешить STYLE в BODY. (Кстати, не забывайте: мы должны быть основным источником стандарта , на самом деле.)<head>
), я буду продолжать использовать эту функцию, поддерживаемую браузером, пока она не сломается.Когда я вижу, что системы управления контентом большого сайта обычно помещают некоторые элементы <style> (некоторые, не все) близко к контенту, который опирается на эти классы, я делаю вывод, что лошадь находится вне сарая.
Посмотрите источники на страницах cnn.com, nytimes.com, huffingtonpost.com, ближайшей газеты большого города и т. Д. Все они делают это.
Если есть веская причина поместить дополнительный раздел <style> где-нибудь в теле - например, если вы включаете () разнообразные и независимые элементы страницы в реальном времени, и у каждого есть свой собственный встроенный <style>, и организация будет чище, более модульной, более понятной и более удобной в обслуживании - я говорю, просто откусите пулю. Конечно, было бы лучше, если бы у нас был «локальный» стиль с ограниченной областью действия, например локальные переменные, но вы переходите к работе с имеющимся у вас HTML, а не с HTML, который вы захотите или захотите иметь позднее.
Конечно, есть потенциальные недостатки и веские (если не всегда убедительные) причины следовать ортодоксальности, как это разработали другие. Но мне кажется, что вдумчивое использование <style> в <body> уже стало мейнстримом.
источник
Неверный HTML, в любом случае, похоже, что каждый браузер рассматривает только второй экземпляр.
Протестировано в последних версиях FF и Google Chrome под Fedora, а также FF, Opera, IE и Chrome под XP.
источник
Я предполагаю, что это будет варьироваться от браузера к браузеру: глобальные правила отображения, вероятно, будут обновляться по мере прохождения браузером кода.
Такие изменения можно увидеть в глобальных правилах отображения иногда, когда внешняя таблица стилей загружается с задержкой. Нечто подобное может произойти и здесь, но в такой короткой последовательности, что это на самом деле не будет отображено.
В любом случае, это недействительный HTML, поэтому я бы сказал, что об этом думать бесполезно.
<style>
теги принадлежат вhead
разделе страницы.источник
Как уже говорили другие, это недопустимый html, так как теги стиля принадлежат заголовку.
Тем не менее, большинство браузеров действительно не поддерживают эту проверку. Вместо этого, как только документ загружен, стили объединяются и применяются. В этом случае второй набор стилей будет всегда переопределять первый, потому что они были последними найденными определениями.
источник
<style>
Принадлежит тег в<head>
секции, отдельно от всего содержимого.Рекомендации: спецификации W3C и W3Schools
источник
В вашем примере браузер не «должен» ничего делать. HTML-код недействителен. Либо происходит восстановление после ошибки, либо анализатор делает это так, как будет.
В допустимом случае несколько таблиц стилей просто обрабатываются как появляющиеся одна за другой, каскад рассчитывается как обычно.
источник
Я предполагаю, что это может быть проблемой ограниченного контекста, например, редакторов WYIWYG в веб-системе, используемой пользователями, не являющимися программистами , что ограничивает возможности соблюдения стандартов. Иногда (например, TinyMCE), это библиотека, которая помещает ваш контент / код в
textarea
тег, который редактором представляется как большойdiv
тег. А иногда это может быть старая версия этих редакторов.Я полагаю, что:
stylesheets
. На самом деле, это было бы нецелесообразно для администраторов (или веб-разработчиков), учитывая количество запросов в том смысле, что они будут иметь.В некоторых случаях, без использования
style
правил, это может быть очень плохой опыт проектирования. Так что да, эти пользователи нуждаются в настройке. Хорошо, но каковы будут решения в этом сценарии? Учитывая различные способы вставки CSS наhtml
страницу, я предполагаю, что эти решения:1-й вариант: спросите у своего сисадма
Попросите вашу систему adm для включения некоторых правил CSS в систему
stylesheets
. Это будет внешнее или внутреннее решение CSS . Как уже было сказано, это может быть невозможно.2-й вариант:
<link>
вкл<body>
Используйте внешнюю таблицу стилей для
body
тега, т. Е. Используйтеlink
тег внутри области, к которой у вас есть доступ (то есть на сайте, внутриbody
тега, а не вhead
теге). Некоторые источники говорят, что это нормально, но «не очень хорошая практика», как MDN :Некоторые другие ограничивают его
<head>
разделом, например, w3schools :тестирование
Я проверил это здесь (окружение рабочего стола, в браузере), и оно работает для меня. Создать файл
foo.html
:Затем CSS-файл в том же каталоге называется
bar.css
:Что ж, это выглядит просто возможным, если у вас есть способ загрузки файла CSS где-нибудь в системе учреждения. Может быть, это будет так.
3-й вариант:
<style>
вкл<body>
Используйте таблицу стилей Интернета для
body
тега, т. Е. Используйтеstyle
тег внутри области, к которой у вас есть доступ (то есть на сайте, внутриbody
тега, а не вhead
теге). Это то, о чем здесь отвечают Чарльз Сальвия и Сз . Выбирая этот вариант, учитывайте их опасения.4-й, 5-й и 6-й варианты: JS способы
Оповещение Это относится к изменению
<head>
элемента страницы. Может быть, этого не допустят системные администраторы учреждения. Поэтому рекомендуется сначала спросить их разрешение.Хорошо, если разрешение предоставлено, стратегия заключается в доступе к
<head>
. Как? Методы JavaScript.4-й вариант: новый
<link>
на<head>
Это еще одна версия 2-го варианта. Используйте внешнюю таблицу стилей для
<head>
тега, т. Е. Используйте<link>
элемент вне области, к которой у вас есть доступ (то есть на сайте, а не внутриbody
тега и да внутриhead
тега). Это решение соответствует рекомендациям MDN и w3schools , как указано выше, по второму варианту решения. НовыйLink
объект будет создан.Чтобы решить эту проблему с помощью JS, есть много способов, но в следующих разделах кода я демонстрирую один простой.
тестирование
Я проверил это здесь (окружение рабочего стола, в браузере), и оно работает для меня. Создать файл
f.html
:Внутри
script
тега:И затем в файле CSS, в том же каталоге, называется
bar.css
(как в 2-й вариант):Как я уже сказал: это будет выглядеть просто возможно, если у вас есть способ загрузки файла CSS где-нибудь в системе учреждения.
5-й вариант: новый
<style>
на<head>
Используйте новую внутреннюю таблицу стилей для
<head>
тега, т. Е. Используйте новый<style>
элемент вне области, к которой у вас есть доступ (то есть на сайте, а не внутриbody
тега и да внутриhead
тега). НовыйStyle
объект будет создан.Это решается через JS. Один простой способ демонстрируется следующим.
тестирование
Я проверил это здесь (окружение рабочего стола, в браузере), и оно работает для меня. Создать файл
foobar.html
:Внутри
script
тега:6-й вариант: использование существующего
<style>
на<head>
Использовать существующую внутреннюю таблицу стилей для
<head>
тега, т. Е. Использовать<style>
элемент вне области, к которой у вас есть доступ (то есть на сайте, а не внутриbody
тега и да внутриhead
тега), если таковой существует.Style
Будет создан новый объект или будет использованCSSStyleSheet
объект (в принятом здесь коде решения).Это в какой-то момент рискованно. Во-первых , потому что не может существовать какой-то
<style>
объект. В зависимости от способа реализации этого решения вы можете получитьundefined
возврат (система может использовать внешнюю таблицу стилей ). Во-вторых , потому что вы будете редактировать дизайн системы авторской работы (вопросы авторства). В-третьих , потому что это не может быть разрешено политикой безопасности вашего учреждения. Итак, попросите разрешения сделать это (как в других решениях JS) .Предположим, опять же, разрешение было предоставлено:
Вам нужно будет рассмотреть некоторые ограничения метода , доступного таким образом:
insertRule()
. Предлагаемое решение использует сценарий по умолчанию и операцию на первомstylesheet
, если таковая существует.тестирование
Я проверил это здесь (окружение рабочего стола, в браузере), и оно работает для меня. Создать файл
foo_bar.html
:Внутри
script
тега:Другой подход к этому решению - использование
CSSStyleDeclaration
объекта (документы в w3schools и MDN ). Но это может быть неинтересно, учитывая риск переопределения существующих правил в CSS системы.7-й вариант: встроенный CSS
использование встроенный CSS . Это решает проблему, хотя в зависимости от размера страницы (в строках кода) поддержание (самим автором или другим назначенным лицом) кода может быть очень трудным.
Но в зависимости от контекста вашей роли в учреждении или его политик безопасности веб-системы, это может быть единственным доступным решением для вас.
тестирование
Создать файл
_foobar.html
:Отвечая строго на вопрос, заданный Гаганом
(цитата адаптирована)
Для более точного ответа я предлагаю Google эти статьи:
источник
Поскольку этот HTML-код недействителен, он никак не влияет на результат ... это просто означает, что HTML-код придерживается стандарта (только для организационных целей). Ради достоверности это можно было бы написать так:
Я предполагаю, что браузер применяет последний стиль, с которым он сталкивается.
источник
Да, оно может. Я проверил на странице Мозиллы. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style
источник