Тёмная и светлая темы для SVG
light-dark()
для реализации светлого и тёмного режима для SVG иконок,включая SVG, используемые с HTML элементом img
или в качестве CSS свойства background-image
.Базовый подход
У SVG есть уникальное преимущество перед другими форматами изображений: CSS можно включить в разметку самого изображения. Для инлайн SVG иконок currentcolor
и CSS переменные — простые способы реализации тёмного режима. Когда SVG используется как обычный формат изображения, ни один из этих подходов не работает. Решением этой проблемы является CSS функция light-dark()
. Функция light-dark()
для не инлайн SVG иконок работает в Firefox, Chrome и Edge. В Safari обнаружен баг, и, похоже, вскоре его исправят.
Ниже представлены два SVG круга. Один — <div>
, использующий CSS свойство background-image
. Второй — HTML элемент <img>
. Их цвет fill
зависит от системных предпочтений пользователя:
<div style="background-image: url('images/circle.svg'); width: 40px; height: 40px;"></div>
<img width="40" src="images/circle.svg" alt="">
Содержимое файла circle.svg
:
<svg style="color-scheme: light dark;" fill="light-dark(black, white)" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" r="5"/></svg>
Свойство color-scheme
внутри SVG фактически говорит: Вот цветовые схемы, которые я могу поддерживать
, но фактически схема, используемая SVG, может управляться извне, либо CSS свойством color-scheme
, либо мета-тегом color-scheme
в <head>
HTML-документа. Код внутри SVG файла определяет, какие цветовые темы может использовать SVG, а код в HTML документе указывает, какую тему он хочет использовать.
<img width="40" src="images/circle.svg" alt="">
<img style="color-scheme: light;" width="40px" src="images/circle.svg" alt="">
<img style="color-scheme: dark;" width="40px" src="images/circle.svg" alt="">
Следующий код в <head>
HTML документа указывает, что документ использует только тёмный режим, поэтому значение dark
, указанное в light-dark()
, будет использоваться любым SVG изображением, указавшим, что оно может поддерживать тёмный режим через color-scheme
:
<meta name="color-scheme" content="dark" />
Другие подходы
Медиа-запрос prefers-color-scheme
Медиа-запрос prefers-color-scheme
работает для SVG, не являющихся инлайн, в Chrome/Edge и Firefox, но не в Safari.
Медиа-запрос prefers-color-scheme
можно использовать внутри блока <style>
в SVG:
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<style>
rect { fill: black; }
@media (prefers-color-scheme: dark) {
rect { fill: white; }
}
</style>
<rect width="32" height="32"/>
</svg>
На результаты запроса влияют как CSS свойство color-scheme
, так и HTML метатег color-scheme
.
<div style="color-scheme: light">
<img src="images/square.svg">
</div>
<div style="color-scheme: dark">
<img src="images/square.svg">
</div>
Элемент <picture>
Элемент <picture>
может отображать одно изображение для тёмного режима и другое — для светлого. Для этого необходимо экспортировать одно и то же SVG-изображение в два разных файла. Разметка <picture>
содержит больше кода, чем простой тег <img>
, и должна повторяться каждый раз, когда используется иконка. В отличие от элемента <picture>
, использование функции light-dark()
в разметке SVG также работает для фоновых CSS изображений.