Пользовательские настройки медиа-функции клиентские подсказки заголовки

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

Медиа-запросы CSS и, в частности, медиа-функции пользовательских предпочтений , такие как prefers-color-scheme или prefers-reduced-motion , потенциально оказывают значительное влияние на объем CSS, который должна предоставить страница, и на впечатления пользователя после загрузки страницы.

Сосредоточившись на prefers-color-scheme и подчеркнув, что это рассуждение применимо и к другим функциям медиа-предпочтений пользователя, рекомендуется не загружать CSS для конкретной несовпадающей цветовой схемы в критическом пути рендеринга, а вместо этого изначально загружать только актуальный в данный момент CSS. Один из способов сделать это — использовать <link media> .

Однако сайты с высокой посещаемостью, такие как Google Search , которые хотят учитывать пользовательские медиа-функции, такие как prefers-color-scheme и встроенный CSS из соображений производительности, должны знать о предпочтительной цветовой схеме (или других пользовательских медиа-функциях соответственно) в идеале во время запроса, чтобы исходная полезная нагрузка HTML уже имела встроенный нужный CSS.

Кроме того, и в особенности для prefers-color-scheme , сайты всеми способами хотят избежать появления неточной цветовой темы .

Заголовки клиентских подсказок Sec-CH-Prefers-Color-Scheme и Sec-CH-Prefers-Reduced-Motion являются первыми из серии заголовков клиентских подсказок по пользовательским настройкам медиа-функций , которые направлены на решение этой проблемы.

Справочная информация о клиентских подсказках

HTTP Client Hints определяет заголовок ответа Accept-CH , который серверы могут использовать для объявления об использовании заголовков запроса для проактивного согласования контента, что в разговорной речи называется клиентскими подсказками. Предложение о клиентских подсказках для пользовательских медиа-функций (User Preference Media Features Client Hints Headers) определяет набор клиентских подсказок, предназначенных для передачи пользовательских медиа-функций. Эти клиентские подсказки названы в честь соответствующих пользовательских медиа-функций, о которых они сообщают. Например, текущая предпочтительная цветовая схема, согласно prefers-color-scheme сообщается через клиентскую подсказку Sec-CH-Prefers-Color-Scheme .

Справочная информация о критически важных клиентских подсказках

Клиентские подсказки, предложенные в разделе «Заголовки клиентских подсказок в пользовательских настройках медиа-функций», предположительно, чаще всего будут использоваться в качестве критических клиентских подсказок . Критические клиентские подсказки — это подсказки, которые существенно изменяют результирующий ресурс. Такой ресурс должен загружаться единообразно при каждой загрузке страницы (включая первоначальную ), чтобы избежать резких переключений, видимых пользователю.

Синтаксис клиентской подсказки

Пользовательские медиа-функции состоят из имени (например prefers-reduced-motion ) и допустимых значений (например, no-preference или reduce ). Каждое поле заголовка клиентской подсказки представлено в виде объекта структурированных заголовков HTTP, содержащего элемент со строковым значением. Например, чтобы указать, что пользователь предпочитает тёмную тему и уменьшенное количество движений, клиентские подсказки выглядят так, как показано в примере ниже.

GET / HTTP/2
Host: example.com
Sec-CH-Prefers-Color-Scheme: "dark"
Sec-CH-Prefers-Reduced-Motion: "reduce"

Эквивалентом CSS информации, передаваемой в приведенных выше клиентских подсказках, является @media (prefers-color-scheme: dark) {} и @media (prefers-reduced-motion: reduce) {} соответственно.

Полный список клиентских советов

Список клиентских подсказок смоделирован на основе предпочитаемых пользователем медиа-функций в Media Queries Level 5 .

Подсказка для клиента Допустимые значения Соответствующая пользовательская настройка медиа-функции
Sec-CH-Prefers-Reduced-Motion no-preference , reduce prefers-reduced-motion
Sec-CH-Prefers-Reduced-Transparency no-preference , reduce prefers-reduced-transparency
Sec-CH-Prefers-Contrast no-preference , less , more , custom prefers-contrast
Sec-CH-Forced-Colors active , none forced-colors
Sec-CH-Prefers-Color-Scheme light , dark prefers-color-scheme
Sec-CH-Prefers-Reduced-Data no-preference , reduce prefers-reduced-data

Поддержка браузеров

Заголовок клиентской подсказки Sec-CH-Prefers-Color-Scheme поддерживается в Chromium 93. Заголовок клиентской подсказки Sec-CH-Prefers-Reduced-Motion поддерживается в Chromium 108. Ожидаются отзывы других поставщиков, а именно WebKit и Mozilla .

Демонстрация Sec-CH-Prefers-Color-Scheme

Попробуйте демо-версию и обратите внимание, как встроенный CSS-код меняется в зависимости от предпочитаемой пользователем цветовой схемы. Исходный код можно найти на GitHub.

Sec-CH-Prefers-Color-Scheme: dark

Sec-CH-Prefers-Color-Scheme: light

Демонстрация Sec-CH-Prefers-Reduced-Motion

Попробуйте демо и обратите внимание, как встроенный CSS-код меняется в зависимости от предпочтений пользователя. Исходный код можно найти на GitHub.

Как это работает

  1. Клиент делает первоначальный запрос к серверу. bash GET / HTTP/2 Host: example.com
  2. Сервер отвечает, сообщая клиенту через Accept-CH , что он принимает клиентские подсказки Sec-CH-Prefers-Color-Scheme и Sec-CH-Prefers-Contrast , из которых в соответствии с Critical-CH он считает Sec-CH-Prefers-Color-Scheme критическим клиентским подсказкой, на основании которой он также изменяет ответ, как передано Vary . bash HTTP/2 200 OK Content-Type: text/html Accept-CH: Sec-CH-Prefers-Color-Scheme, Sec-CH-Prefers-Contrast Vary: Sec-CH-Prefers-Color-Scheme Critical-CH: Sec-CH-Prefers-Color-Scheme
  3. Затем клиент повторяет запрос, сообщая серверу через Sec-CH-Prefers-Color-Scheme , что у него есть пользовательские предпочтения для содержимого в тёмной схеме. bash GET / HTTP/2 Host: example.com Sec-CH-Prefers-Color-Scheme: "dark"
  4. Затем сервер может соответствующим образом адаптировать ответ к предпочтениям клиента и, например, встроить CSS, отвечающий за темную тему, в тело ответа.

Пример Node.js

Приведённый ниже пример Node.js, написанный для популярного фреймворка Express.js, показывает, как на практике может выглядеть работа с клиентским заголовком подсказки Sec-CH-Prefers-Color-Scheme . Этот код и лежит в основе приведённой выше демонстрации .

app.get("/", (req, res) => {
  // Tell the client the server accepts the `Sec-CH-Prefers-Color-Scheme` client hint…
  res.set("Accept-CH", "Sec-CH-Prefers-Color-Scheme");
  // …and that the server's response will vary based on its value…
  res.set("Vary", "Sec-CH-Prefers-Color-Scheme");
  // …and that the server considers this client hint a _critical_ client hint.
  res.set("Critical-CH", "Sec-CH-Prefers-Color-Scheme");
  // Read the user's preferred color scheme from the headers…
  const prefersColorScheme = req.get("sec-ch-prefers-color-scheme");
  // …and send the adequate HTML response with the right CSS inlined.
  res.send(getHTML(prefersColorScheme));
});

Вопросы конфиденциальности и безопасности

Команда Chromium разработала и реализовала заголовки клиентских подсказок пользовательских медиа-функций, используя основные принципы, определенные в документе «Управление доступом к мощным функциям веб-платформы» , включая пользовательский контроль, прозрачность и эргономику.

К данному предложению также применимы « Соображения безопасности клиентских HTTP-подсказок» и « Соображения безопасности надежности клиентских подсказок».

Ссылки

Благодарности

Большое спасибо за ценные отзывы и советы от Йоава Вайса . Изображение предоставлено Tdadamemd на Wikimedia Commons .