Объявите стиль CSS вне элемента "HEAD" страницы "HTML"? - PullRequest
57 голосов
/ 05 января 2011

Мой вариант использования следующий:

Я составляю HTML-страницу , используя части, которые допустимые фрагменты HTML , но не являются допустимыми страницами, такими как Divs ;эти элементы используют CSS для управления своим стилем.

Я бы хотел, чтобы каждый фрагмент отвечал за свои требования к стилю и не полагался на объявления таблиц стилей восновной фрагмент (фрагмент с тегом «HTML»).

Итак, возникает вопрос: существует ли какой-либо (стандартный) способ добавить некоторые стили CSS за пределы элемента HEAD (исключаявстроенный стиль через атрибут style)?

Полагаю, я мог бы использовать фреймы, но я бы предпочел избежать этого решения.

Заранее спасибо за помощь.

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

Благодаря предложениям zzzzBov , JMC Creative и moontear , и после некоторого тестирования вот ответ:

  • использование JavaScript для динамической загрузки некоторых таблиц стилей CSS : HTML4 / XHTML и HTML5-совместимый ,
  • вставлять элементы "стиля" непосредственно внутри фрагментов: несовместимо с HTML4 / XHTML , но, кажется, широко поддерживается и HTML5-совместимо .

Поскольку я должен поддерживать почтовые клиенты, я использовал второе решение, которое к тому же более простое.

Спасибо всем за проявленный интерес и участие.

Ответы [ 3 ]

62 голосов
/ 05 января 2011

ТЛ; др:

Если вам неудобно использовать функции HTML, которые не достигли уровня зрелости Рекомендация W3C , стандартного способа добавления <style> к <body> страницы не существует. .

Если вам удобнее использовать менее развитые функции, HTML5.2, по-видимому, стандартизирует <style> элементы, разрешенные везде, где ожидается потоковое содержимое (т. Е. <body> и большинство его элементов).

Если вы уже используете атрибут [scoped], прекратите использование атрибута [scoped], так как он никогда не был стандартизирован и теряет поддержку браузера.

История

HTML 4,01

В HTML4.01 элемент стиля был разрешен только в <head>. Браузеры, старательно пытавшиеся воспроизвести то, что автор хочет , а не то, что автор написал , уважали <style> элементы <body>, несмотря на то, что эти страницы технически были недействительными.

HTML 5

Элемент <style> продолжал быть недействительным в <body>

HTML 5.1

В некоторых рабочих проектах спецификации HTML5.1 элемент <style> должен был разрешать атрибут [scoped], что позволило бы использовать элемент <style> в потоке содержание (то есть в <body>).

В качестве примера того, как это можно было бы использовать:

<!DOCTYPE html>
<title>Example of using the scoped attribute</title>
<div>
  <style scoped>
    p {
      color: darkred;
    }
  </style>
  <p>this text would be dark red</p>
</div>
<p>this text would be black</p>

Поддержка функции области действия была добавлена ​​в Firefox в версии 21 и добавлена ​​в Chrome за флагом в версии 20 . Эта функция не получила достаточной поддержки, поэтому позднее она была удалена из рабочего проекта HTML5.1 .

.

Chrome первым удалил эту функцию в версии 36 . С тех пор Firefox установил эту функцию за флагом в версии 55.

HTML 5,2

В рабочем проекте июля 2017 года спецификации HTML5.2 была добавлена ​​поддержка для элемента <style>, который должен быть разрешен в содержимом потока:

Контексты, в которых этот элемент может быть использован:

  • Где ожидается содержание метаданных.
  • В элементе <noscript>, который является дочерним элементом элемента <head>.
  • В теле, где ожидается поток.

Акцент на шахте

На момент написания этого дополнения оно оставалось в спецификации HTML5.2, которая в настоящее время находится на уровне зрелости Рекомендация кандидата .

Хотя использование элементов <style> в <body> по-прежнему сопряжено с некоторой опасностью, это конкретное изменение стандартизирует то, что браузеры поддерживают многие годы.

13 голосов
/ 05 января 2011

Не существует стандартного способа ( РЕДАКТИРОВАТЬ: с HTML5, очевидно, есть!) Добавления элемента <style> вне тега <head> - это разрешено только там и НЕ внутри тега <body> ( См. DTD здесь ).

Если вы хотите индивидуально стилизовать свои фрагменты HTML и не использовать стили CSS в своей голове, вам нужно будет использовать встроенные стили. Однако: большинство браузеров понимают теги <style> внутри тела, поэтому вы также можете использовать их, но ваша страница не будет соответствовать стандартам.

Любым способом:

  • Вы не должны использовать встроенный стиль
  • Вы должны придерживаться стандартов
  • Вы должны поместить CSS в голову, где он принадлежит

Из того, что я понимаю, вы используете какой-то шаблон, где вы вставляете разные фрагменты HTML на страницу с различными дизайнами. Это так плохо, если вы поместите все стили в один большой файл CSS?

Было бы невозможно для вас динамически загрузить другой файл CSS (через JS или серверные сценарии), когда ваш HTML-фрагмент вставляется на страницу (это будет предпочтительный метод)?

10 голосов
/ 01 февраля 2017

Я нашел два хака , чтобы сделать это. Оба из которых должны быть совершенно действительными HTML.

Способ SVG

Оберните ваш <style /> элемент внутри <svg /> элемента.

<div class="foo">Red text</div>
<svg><style>.foo { color: red }</style></svg>

The Data-Uri Link

Отформатируйте CSS как URI данных и используйте его в элементе <link />.

<div class="foo">Red text</div>
<link rel="stylesheet" href="data:text/css,.foo%20%7B%20color%3A%20red%20%7D" />
...