Как сделать меш градиент в CSS — Mesh gradient генератор

HTML и CSS
225 просмотров

Если вы когда-нибудь видели сайт с мягким переливающимся фоном — там, где несколько цветных пятен плавно перетекают друг в друга, — скорее всего, перед вами был меш градиент (mesh gradient). Этот эффект выглядит богато и современно, а делается удивительно просто: никаких изображений и сторонних библиотек — только чистый CSS-свойство background-image и несколько строк JavaScript. В этой статье разберём, как работает mesh gradient CSS, и напишем генератор прямо в браузере.

Меш градиент CSS — сетчатый многоцветный фон
1

Что такое меш градиент

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

Главный секрет — функция radial-gradient() со ключевым словом at , которое смещает центр пятна в произвольную точку элемента. Несколько таких слоёв в свойстве background-image и получается живой, «дышащий» фон.

2

Как работает radial-gradient с at

Базовый синтаксис radial-gradient() вы, возможно, уже встречали. Добавив at x% y% , мы говорим браузеру: «Центр этого градиента — не в середине, а вот в этой точке».

/* Обычный радиальный градиент — центр посередине */ 
background: radial-gradient(circle, 
    hsl(200, 80%, 70%) 0px, 
    transparent 60% 
); 
 
/* С at — смещаем центр в левый верхний угол */ 
background: radial-gradient(at 20% 15%, 
    hsl(200, 80%, 70%) 0px, 
    transparent 60% 
);

Обратите внимание: вместо circle мы просто пишем at 20% 15% . Браузер по умолчанию делает форму эллипса, которая аккуратно вписывается в размер элемента — это как раз то, что нужно для меш градиента. Последний аргумент transparent 60% говорит: «К середине радиуса плавно исчезни», — так слои не перекрывают, а дополняют друг друга.

3

Несколько градиентов на одном фоне

CSS позволяет задать сразу несколько градиентов через запятую в одном свойстве background-image . Слои накладываются сверху вниз: первый в списке — самый верхний. Именно это и создаёт эффект меш градиента.

.mesh-gradient { 
    background-color: hsl(250, 50%, 98%); 
    background-image: 
        radial-gradient(at 15% 20%,  hsl(340, 88%, 80%) 0px, transparent 60%), 
        radial-gradient(at 85% 15%,  hsl(205, 85%, 76%) 0px, transparent 60%), 
        radial-gradient(at 50% 55%,  hsl(272, 75%, 84%) 0px, transparent 60%), 
        radial-gradient(at 10% 85%,  hsl(185, 72%, 74%) 0px, transparent 55%), 
        radial-gradient(at 88% 80%,  hsl(320, 80%, 82%) 0px, transparent 55%); 
}

Здесь пять пятен разных цветов в разных углах и центрах элемента. background-color задаёт базовый цвет подложки — он просвечивает в местах, где все пятна прозрачны. Попробуйте поменять координаты at и цвета hsl() — и вы сразу увидите, как меняется характер фона.

Почему HSL, а не HEX? В HSL первый параметр — это оттенок (тон) от 0° до 360°. Перебирая разные значения тона с одинаковой насыщенностью и светлотой, вы получаете гармоничную палитру: цвета похожи по характеру, но разные по тону. Это намного проще, чем угадывать HEX-коды на ощупь.
4

Анимированный меш градиент

Статичный меш градиент уже выглядит хорошо, но можно сделать его живым — пусть цвета медленно переливаются. Есть два способа: простой и чуть более гибкий.

Способ 1: filter hue-rotate — две строки кода

Свойство filter: hue-rotate() прокручивает все цвета элемента по цветовому кругу разом. Применив анимацию от 0deg до 360deg , получаем бесконечное плавное переливание — без единой строки JavaScript:

.mesh-gradient { 
    background-color: hsl(250, 50%, 98%); 
    background-image: 
        radial-gradient(at 15% 20%, hsl(340, 88%, 80%) 0px, transparent 60%), 
        radial-gradient(at 85% 15%, hsl(205, 85%, 76%) 0px, transparent 60%), 
        radial-gradient(at 50% 55%, hsl(272, 75%, 84%) 0px, transparent 60%), 
        radial-gradient(at 10% 85%, hsl(185, 72%, 74%) 0px, transparent 55%), 
        radial-gradient(at 88% 80%, hsl(320, 80%, 82%) 0px, transparent 55%); 
 
    animation: mesh-hue 10s linear infinite; 
} 
 
@keyframes mesh-hue { 
    to { filter: hue-rotate(360deg); } 
}

Минус один — все цвета вращаются синхронно, соотношение оттенков не меняется. Зато это работает в любом браузере и не требует ничего лишнего. Скорость регулируется длительностью: 6–8 секунд — заметное движение, 15–20 — едва уловимое мерцание.

Способ 2: @property — анимируем оттенки независимо

Директива @property позволяет браузеру анимировать CSS-переменную как число, а не как строку. Благодаря этому каждое пятно можно «закрутить» в свою сторону с разной скоростью — градиент получается по-настоящему живым:

@property --h1 { syntax: '<number>'; inherits: false; initial-value: 340; } 
@property --h2 { syntax: '<number>'; inherits: false; initial-value: 205; } 
@property --h3 { syntax: '<number>'; inherits: false; initial-value: 272; } 
 
.mesh-gradient { 
    background-color: hsl(250, 50%, 98%); 
    background-image: 
        radial-gradient(at 15% 20%, hsl(var(--h1), 88%, 80%) 0px, transparent 60%), 
        radial-gradient(at 85% 15%, hsl(var(--h2), 85%, 76%) 0px, transparent 60%), 
        radial-gradient(at 50% 55%, hsl(var(--h3), 75%, 84%) 0px, transparent 60%); 
 
    animation: 
        mesh-h1 9s  linear infinite, 
        mesh-h2 13s linear infinite, 
        mesh-h3 7s  linear infinite; 
} 
 
@keyframes mesh-h1 { to { --h1: 700; } } 
@keyframes mesh-h2 { to { --h2: 565; } } 
@keyframes mesh-h3 { to { --h3: 632; } }

Конечные значения больше 360 — это нормально: браузер продолжает считать по кругу, так что 700 это просто 340 плюс полный оборот. Разные длительности (7, 9, 13 секунд) дают некратный цикл — пятна никогда не возвращаются в одно положение одновременно, и градиент выглядит непредсказуемо живым. @property поддерживается во всех современных браузерах начиная с 2023 года.

5

Онлайн генератор mesh градиента

Не хочется подбирать цвета вручную? Используйте генератор ниже. Каждый клик по «Сгенерировать» создаёт новый меш градиент со случайными пятнами и оттенками. Понравился результат — скопируйте готовый CSS и вставьте в свой проект.

  
6

Где и как применять меш градиент

Фон страницы или секции. Самый очевидный вариант. Задаём меш градиент на body или на секцию-герой — и сайт сразу смотрится свежо. Особенно хорошо работает в паре с белой карточкой поверх: контраст подчёркивает оба элемента.

body { 
    background-color: hsl(240, 40%, 98%); 
    background-image: 
        radial-gradient(at 15% 20%, hsl(340, 75%, 80%) 0px, transparent 55%), 
        radial-gradient(at 85% 10%, hsl(200, 70%, 75%) 0px, transparent 55%), 
        radial-gradient(at 50% 90%, hsl(270, 65%, 80%) 0px, transparent 55%); 
    min-height: 100vh; 
}

Карточка или баннер. Меш градиент отлично смотрится как фон карточки с важным контентом — ценой, призывом к действию, иллюстрацией.

.card { 
    background-color: hsl(220, 50%, 97%); 
    background-image: 
        radial-gradient(at 10% 30%, hsl(180, 70%, 75%) 0px, transparent 60%), 
        radial-gradient(at 90% 70%, hsl(300, 60%, 78%) 0px, transparent 60%); 
    border-radius: 16px; 
    padding: 2rem; 
}

Аватарка или плейсхолдер. Если изображение ещё не загружено или его нет совсем — меш градиент смотрится намного лучше, чем серый прямоугольник.

.avatar { 
    width: 80px; 
    height: 80px; 
    border-radius: 50%; 
    background-color: hsl(220, 40%, 95%); 
    background-image: 
        radial-gradient(at 30% 30%, hsl(40, 90%, 75%) 0px, transparent 60%), 
        radial-gradient(at 70% 70%, hsl(190, 75%, 70%) 0px, transparent 60%); 
}
7

Советы по работе с меш градиентом

Не бойтесь прозрачности. Значение transparent 50% в конце каждого пятна — ключевое. Именно оно делает переходы мягкими. Уменьшите до 30% — пятна станут крупнее и ярче. Увеличьте до 70% — компактнее и нежнее. Попробуйте разные значения, чтобы почувствовать разницу.

Фоновый цвет важен. background-color — это не просто заливка на случай, если что-то пойдёт не так. Это «температура» вашего фона. Тёплый светлый цвет ( hsl(40, 30%, 97%) ) даст кремовый оттенок, холодный ( hsl(220, 40%, 97%) ) — голубоватый. Это тонко, но работает.

Пять пятен — хороший минимум. Меньше трёх — будет заметная структура и симметрия, больше восьми — цвета начнут смешиваться в грязный серый или бежевый. Золотая середина — 5–7 пятен.

Ограничьте контрастность. Если поставить рядом очень тёмный и очень светлый цвет, граница получится резкой. В меш градиенте лучше держать светлоту всех пятен в диапазоне 55–80% — тогда переходы будут плавными вне зависимости от оттенков.

Освоив меш градиент, попробуйте добавить к фону лёгкую анимацию через @keyframes : анимируйте background-position или плавно меняйте координаты через CSS-переменные — и фон станет «живым» без единого изображения. Подробно о CSS-градиентах и анимированных фонах — в нашем полном руководстве по CSS-градиентам.

Вам может быть интересно:
CSS псевдокласс :is() — группировка селекторов в одно правило
CSS псевдокласс :is() — как и где его использовать
Вставка видео с Rutube на сайт — iframe и адаптивный embed
Как правильно вставить видео с RuTube на сайт
Полоса прокрутки страницы на CSS — пример готового индикатора
Как убрать или стилизовать полосу прокрутки — CSS скроллбар
Встраивание YouTube видео на сайт — адаптивный плеер на HTML и CSS
Добавляем YouTube видео на сайт
Комментарии 0 Разные мнения приветствуются. Здесь можно спорить и обсуждать, но уважительно и без токсичности.
Отмена