CSS для URL-адресов и заголовков HTTP
Когда вы просматриваете веб-страницу, под ней находится DOM:
Как нам получить DOM? Браузер знает, как создать его из HTTP-запроса, состоящего из URL, некоторых заголовков и некоторого HTML. Например, это упрощенное представление (начала) веб-страницы для www.jim-nielsen.com.
> GET / HTTP/2 > Host: www.jim-nielsen.com > < HTTP/2 200 < content-type: text/html; charset=UTF-8 < date: Tue, 15 Nov 2022 19:47:19 GMT < content-length: 475979 < <!DOCTYPE html> <html lang="en"> <head>…</head> <body>…</body> </html>
Обратите внимание на различные фрагменты информации, запутанные в этом HTTP-запросе: URL-адрес, некоторые заголовки и немного HTML. Браузер знает, как взять всю эту информацию и отобразить ее в виде веб-страницы.
HTML — это обычно то, о чем мы думаем, когда используем CSS для оформления веб-страницы (например, «если есть элемент с классом .
, сделайте текст color: red
»). Однако при оформлении веб-страницы может быть полезно нечто большее, чем просто информация в HTML. HTTP-запрос содержит соответствующую информацию, такую как URL и заголовки, которые у нас нет возможности запросить и логически применить на основе стилей.
Я полагаю, вы можете сделать это сегодня, по крайней мере, частично, с помощью чего-то вроде псевдокласса :target
, который позволяет вам настраивать таргетинг и стилизовать определенный элемент в DOM на основе значения фрагмента в URL (осторожно: у него есть свои причуды, такие как history.pushState, не влияющие на :target
стили).
Там может быть информация, критически важная для оформления веб-страницы, которая существует за пределами только HTML. Весь HTTP-ответ остается недоступным для CSS. И почему? Что, если бы вы могли написать селекторы на основе любой части информации в HTTP-ответе?
Селектор URL: Правило @document
Оказывается, в CSS3 есть/было предложено правило @document, — предложенное в CSS3, отложенное до CSS4, кажущееся устаревшим сейчас — который позволяет вам писать стили, применимые к указанным URL (адресам).
Это было бы здорово для написания пользовательских стилей, специфичных для домена, но также и для авторских стилей./* Only apply these to the specified URL */ @document url("https://blog.jim-nielsen.com/about/") { body {…} }
Предлагаемый синтаксис позволяет сопоставлять правила на основе значения URL, префикса или домена. Если этого недостаточно, есть способ сопоставления на основе регулярного выражения.
/* Apply these to all URLs that start with 'https:' */ @document regexp("https:.*") { body {…} }
Регулярные выражения — это здорово, но насколько они доступны многим людям? И хотя предлагается @document url-prefix()
, это заставляет задуматься: «А как насчет
?» И ничто из этого, не касается того, как создавать стиль на основе параметров запроса (для этого и предназначено регулярное выражение?).
Часто задается вопрос, не могли бы мы вместо этих перечисленных функций (url()
, url-prefix()
, domain()
, regex()
) использовать существующую идиому селекторов атрибутов CSS? Как же будет выглядеть синтаксис, если представить это в качестве примера:
/* URL matches exactly */ @document[url="https://blog. ="https:"] {…} /* URL ends with */ @document[url$=".php"] {…} /* Domain is */ @document[domain="jim-nielsen.com"] {…} /* Domain is AND URL ends with */ @document[domain="jim-nielsen.com"][url$=".html"] {…}
HTTP Selector
Никто не запрашивал CSS-селекторы, которые могут запрашивать HTTP-заголовки. Вероятно, для этого есть причины.
Оставляя в стороне неограниченные возможности, которые люди могут придумать с нестандартнымиX-
заголовками, представьте, что вы можете объявлять некоторые стили на основе наличия файла cookie. Файлы cookie интересны тем, что они представляют собой часть состояния, устанавливаемого сервером и отправляемого клиентом при каждом последующем запросе — JavaScript не требуется.Это может быть невероятно полезно для поддержки варианта использования, такого как настраиваемый пользователем темный режим без FART на хосте со статическими файлами. Вы отправляете пользователя на соответствующий URL-адрес, сервер устанавливает файл cookie, и теперь у вас есть часть состояния, которую может запросить CSS. Нет необходимости переписывать HTML-функции Edge, не обнаруживаются неточные цветовые темы и не требуется клиентский JavaScript. Пример CSS:
/* Imagine some HTTP response headers like this: < HTTP/2 200 < set-cookie: THEME=dark; path=/; domain=… And you style based on that! */ /* Light mode */ :root { background: #fff } /* Dark mode via system preference */ @media (prefers-color-scheme:dark) { :root { background: #000 } } /* Or dark mode via user preference */ :http([set-cookie*="THEME=dark"]) { :root { background: #000 } }
Свойство CSS: содержимое: `url()` | Могу ли я использовать… Таблицы поддержки для HTML5, CSS3 и т. д.
Могу ли я использовать
Поиск?
Свойство CSS: содержимое: `url()`
Глобальное использование
97,23% + 0% «=» 97,23%
IE
- 6–7: не поддерживается 11% — Supported»> 8–10: поддерживается
- 11: поддерживается
Edge
- 12 — 112: Поддерживается
- 113: Поддерживается
Firefox
- 2 — 112: Поддерживается 90 039 113: Поддерживается
- 114 — 115: Поддерживается
Хром
- 4 — 112: Поддерживается
- 113: Поддерживается
- 114–116: Поддерживается
Safari
- 3.1–16.3: Поддерживается
- 16.4: Поддерживается 9 0014
- 16.5 — TP: поддерживается
Opera
- 83% — Supported»> 10–97: Поддерживается
- 98: Поддерживается
Safari на iOS
- 3.2–16.3: Поддерживается
- 16.4: Поддерживается 9001 4
- 16.5: поддерживается
Opera Mini
- все: поддержка неизвестна
Браузер Android
- 2.1–4.4.4: Не поддерживается
- 113: Поддерживается
Opera Mobile
- 12–12.1: Не поддерживается 9001 4
- 73: поддерживается
Chrome для Android
- 113: поддерживается
Firefox для Android
- 29% — Supported»> 113: поддерживается
UC Browser для Android
- 13.4: поддержка неизвестна
Samsung Internet
- 4–19.0: поддерживается
- 20: Поддерживается
Браузер QQ
- 13.1: Поддержка неизвестна
Браузер Baidu
- 13.18: Поддержка неизвестна 9002 5
- 2.5: поддержка неизвестна
- 3: поддержка неизвестна
- Сообщение Криса Койера о flash of inac Кураторская цветовая тема (FART) становится официальный термин.
- Сообщение Джейсона Ленгсторфа о том, как добиться переключателя тем без вспышки неточных цветов с помощью граничных функций Netlify.
- Мой пост о запросах зависимостей npm и их специальном синтаксисе селекторов, таком как
:semver()
псевдокласс
Браузер KaiOS
CSS для URL-адресов и заголовков HTTP
У меня в голове крутится пара вещей:
Все это заставило задуматься…
Когда вы смотрите на веб-страницу, внизу у вас есть DOM:
Упс, неправильный DOM. Вот так (изображение любезно предоставлено Википедией).
Как получить DOM? Браузер знает, как создать его из HTTP-запроса, состоящего из URL-адреса, некоторых заголовков и HTML-кода. Например, это упрощенное представление (начало) веб-страницы для www.jim-nielsen.com
.
> ПОЛУЧИТЬ / HTTP/2 > Хост: www.jim-nielsen.com > < HTTP/2 200 <тип содержимого: текст/html; кодировка = UTF-8 <дата: вторник, 15 ноября 2022 г., 19:47:19 по Гринвичу <длина содержимого: 475979 < <голова>…голова> <тело>…тело>
Обратите внимание на различные фрагменты информации, запутанные в этом HTTP-запросе: URL-адрес, некоторые заголовки и немного HTML.
Обычно мы думаем о HTML, когда используем CSS для оформления веб-страницы (например, «если есть элемент с классом .foo
, сделайте текст цветом: красный
»). Однако при стилизации веб-страницы может быть полезна не только информация в HTML. HTTP-запрос содержит соответствующую информацию, такую как URL-адрес и заголовки, которые мы не можем запросить и логически применить на основе стилей.
Я полагаю, вы можете сделать это сегодня, по крайней мере в небольшой части, с чем-то вроде :target
псевдокласс, который позволяет нацеливать и стилизовать определенный элемент в DOM на основе значения фрагмента в URL-адресе (остерегайтесь: у него есть свои особенности, такие как history.pushState, не влияющие на :target
стили).
Моя точка зрения такова: может быть информация, важная для стиля веб-страницы, которая существует за пределами одного только HTML. Весь ответ HTTP остается недоступным для CSS. Почему это? Что, если бы вы могли написать селекторы на основе любой части информации в ответе HTTP?
Селектор URL: Правило @document
Оказывается, существует/было правило @document
— предложенное в CSS3, отложенное до CSS4, кажущееся устаревшим сейчас? — который позволяет вам писать стили, применимые к указанным URL-адресам. Это было бы здорово для написания пользовательских стилей для предметной области, а также (я думаю) для авторских стилей.
/* Применить только к указанному URL */ URL-адрес документа ("https://blog.jim-nielsen.com/about/") { тело {…} }
Предлагаемый синтаксис позволяет сопоставлять правила на основе значения URL-адреса, префикса или домена. Если этого недостаточно, есть способ сопоставления на основе регулярного выражения.
/* Применить ко всем URL-адресам, начинающимся с https: */ @документ регулярное выражение("https:.*") { тело {…} }
Регулярные выражения — это прекрасно, но интересно, насколько они доступны многим людям? И хотя предлагается @document url-prefix()
, вы задаетесь вопросом: «А как насчет @document url-suffix()
?» И ничто из того, что я видел, не касалось того, как стилизовать на основе параметров запроса (полагаю, для этого и нужны регулярные выражения?).
Часть меня задается вопросом, если вместо этих перечисленных функций ( 9=»https:»] {…} /* URL-адрес заканчивается на */ @document[url$=».php»] {…} /* Домен */ @document[domain=»jim-nielsen.com»] {…} /* Домен — это И URL заканчивается на */ @document[domain=»jim-nielsen.com»][url$=».html»] {…}
Конечно, я тут плююсь, но для этого и нужны сообщения в блогах.
Селектор HTTP…?
Насколько мне известно, никто не просил селекторы CSS, которые могут запрашивать заголовки HTTP. Вероятно, на это есть причины, но опять же я воображаю.
Если оставить в стороне неограниченные возможности, которые люди могут придумать с нестандартными X-
, представьте, что вы можете объявить некоторые стили на основе наличия файла cookie. Файлы cookie интересны тем, что представляют собой часть состояния, устанавливаемую сервером и отправляемую клиентом при каждом последующем запросе — JavaScript не требуется!
Это может быть невероятно полезно для поддержки варианта использования, такого как настраиваемый пользователем темный режим без FART на хосте со статическими файлами.