Конические градиенты
Конический градиент - это угловой градиент. Он выбирает цвет не по линии и не по расстоянию от центра, а по углу вокруг центральной точки. Из-за этого градиент будто вращается вокруг центра и хорошо подходит для цветовых колес, диаграмм, шкал, ручек управления, loader-анимаций, углового света, круговых масок и любых интерфейсов, где важно направление вокруг точки.
В CSS-геометрии конического градиента 0deg смотрит вверх, а углы идут по часовой стрелке. gradiente использует эту же договоренность для CSS, Canvas 2D, Canvas WebGL и SVG.
conic-gradient(from 74deg at 50% 50% in oklch, hsl(325, 64%, 54%) 0%, hsl(30, 85%, 58%) 63%, hsl(3, 69%, 66%) 72%, hsl(208, 94%, 47%) 100%)conic-gradient(from 74deg at 50% 50% in oklch, hsl(325, 64%, 54%) 0%, hsl(30, 85%, 58%) 63%, hsl(3, 69%, 66%) 72%, hsl(208, 94%, 47%) 100%)conic-gradient(...) и repeating-conic-gradient(...) - это нативные CSS функции, но gradiente делает больше, чем просто передает строку дальше. Он парсит градиент во внутреннюю модель, нормализует ее и трансформирует одну и ту же модель в CSS, Canvas 2D, Canvas WebGL и SVG. SVG target генерируется как pattern payload, потому что в SVG нет нативного примитива для conic-градиента.
Каждый preview-блок на этой странице отрисован через gradiente сразу в четырех targets. Колонка WebGL сохраняется как snapshot, чтобы страница не держала много живых WebGL-контекстов одновременно.
Использование конического градиента во фреймворке
Conic-градиенты являются нативными CSS backgrounds, но gradiente все равно парсит, сортирует, нормализует и трансформирует одну модель для каждого renderer. Каждый пример преобразует распарсенный градиент через transformTo('css') и подключает результат во фреймворке.
Из чего состоит конический градиент
У модели конического градиента есть пять основных частей:
Внутри GradientConic хранит config отдельно от stops:
type GradientConicConfig = {
from: GradientAngleValue
position: GradientPosition
interpolation: {
colorSpace: GradientColorSpace
hue?: GradientHueInterpolation
}
isRepeating?: boolean
}Позиции stops хранятся как нормализованные числа: 0 означает начало угловой развертки, а 1 означает конец развертки. В строковом синтаксисе на этой странице эти позиции записываются в процентах.
type GradientConicStop =
| {
type: 'color-stop'
value: string
position: number
}
| {
type: 'color-hint'
position: number
}Что делает gradiente
Для conic-gradient gradiente берет на себя и CSS-совместимое поведение, и renderer-specific вывод:
- Парсит conic-строки в instance
GradientConic. - Хранит начальный угол, позицию центра, интерполяцию, stops и repeating-состояние.
- Подставляет дефолтные значения config из одного места в конструкторе.
- Заполняет пропущенные позиции stops.
- Нормализует keyword-позиции в порядок x/y.
- Сохраняет color hints как полноценные stop-данные.
- Компактно сериализует double-position stops.
- Сортирует позиционированные stops в стабильном порядке.
- Рисует одну и ту же внутреннюю модель в Canvas 2D и Canvas WebGL.
- Генерирует SVG pattern для рендереров, которым нужен SVG-вывод.
- Трансформирует одну модель в CSS, Canvas 2D, Canvas WebGL и SVG.
Анатомия
Полный синтаксис состоит из опционального config-блока и обязательного списка stops:
conic-gradient(
[from angle] [at position] [in color-space [hue-mode hue]],
color-stop-or-hint,
color-stop-or-hint,
...
)Первый элемент до запятой считается config только тогда, когда содержит conic config tokens. Все после первой запятой относится к списку stops.
conic-gradient(from 74deg at 50% 50% in oklch, red 0%, 35%, blue 100%)conic-gradient(from 74deg at 50% 50% in oklch, red 0%, 35%, blue 100%)В этом примере есть:
from 74deg: угловая развертка повернута на 74 градуса.at 50% 50%: центр находится в середине области отрисовки.in oklch: цвета интерполируются в OKLCH.red 0%: первый color stop стоит в начале развертки.35%: color hint, который сдвигает midpoint перехода от red к blue.blue 100%: последний color stop стоит в конце развертки.
Значения по умолчанию
Если conic config не указан, gradiente использует CSS-похожие дефолты:
conic-gradient(red, blue)conic-gradient(red, blue)Дефолты класса:
from: 0deg
position: center center
interpolation.colorSpace: "srgb"
isRepeating: falseДефолтные значения не попадают в toString(). Поэтому conic-gradient(from 0deg at center in srgb, red, blue) может сериализоваться в компактный conic-gradient(red, blue).
Начальный угол
Угол from поворачивает весь градиент вокруг его центра. Он не меняет позиции stops; он меняет место, где начинается угловая развертка.
90deg поворачивает первый stop к правой стороне блока:
conic-gradient(from 90deg, red, blue)conic-gradient(from 90deg, red, blue)Углы могут использовать CSS angle units, которые поддерживает модель: deg, turn, rad и grad.
conic-gradient(from 0.25turn, red, blue)conic-gradient(from 0.25turn, red, blue)conic-gradient(from 1.5708rad, red, blue)conic-gradient(from 1.5708rad, red, blue)Позиция
Позиция двигает центр угловой развертки. Она всегда идет после at.
Keyword-позиции используют x/y keywords:
conic-gradient(at top left, red, blue)conic-gradient(at left top, red, blue)gradiente нормализует keyword-позиции в x/y порядок. Например, at top left сериализуется как at left top.
Value-позиции используют два length-percentage значения:
conic-gradient(at 35% 45%, red, blue)conic-gradient(at 35% 45%, red, blue)from и at можно комбинировать, когда угловой развертке нужен и поворот, и смещенный центр:
conic-gradient(from 74deg at 35% 45%, #d53f96, #ef9439, #077fe9)conic-gradient(from 74deg at 35% 45%, #d53f96, #ef9439, #077fe9)Текущий parser держит позиции строгими: keyword-позиции состоят только из keywords, а value-позиции требуют два length-percentage tokens. Смешанные CSS формы вроде left 20px top 10px пока не входят в эту модель.
Список stops
Список stops определяет, какие цвета появляются вокруг окружности. Практический conic-градиент обычно содержит хотя бы два color stops.
Если у color stop нет явной позиции, gradiente вычисляет ее по соседним stops. Первый unresolved color stop становится 0%; последний unresolved color stop становится 100%; unresolved stops между известными позициями распределяются равномерно.
conic-gradient(red 0%, yellow 40%, blue 100%)conic-gradient(red 0%, yellow 40%, blue 100%)Color hints - это отдельные проценты между двумя color stops. Они не создают новый color stop. Они сдвигают воспринимаемый midpoint сегмента интерполяции.
conic-gradient(red 0%, 35%, blue 100%)conic-gradient(red 0%, 35%, blue 100%)Double-position stops создают жесткие угловые секторы. Цвет, записанный с двумя позициями, хранится как две соседние color stop-точки с одним цветом, а затем по возможности сериализуется обратно в компактную форму.
conic-gradient(red 0% 25%, blue 25% 50%, yellow 50% 100%)conic-gradient(red 0% 25%, blue 25% 50%, yellow 50% 100%)Когда позиционированные stops записаны не по порядку, gradiente нормализует их в стабильный порядок. Это важно для состояния редактора, snapshots и сравнения между разными renderers.
conic-gradient(from 74deg, red, blue 72%, yellow 63%)conic-gradient(from 74deg, red 0%, yellow 63%, blue 72%)Интерполяция
Интерполяция управляет путем между цветами. Для conic-градиентов это особенно заметно, потому что hue-изменения оборачиваются вокруг центра и сразу бросаются в глаза.
Пространство интерполяции по умолчанию - srgb.
conic-gradient(in srgb, red, blue)conic-gradient(red, blue)Перцептуальные пространства вроде oklab часто дают более плавные угловые переходы.
conic-gradient(at 25% 75% in oklab, red, blue)conic-gradient(at 25% 75% in oklab, red, blue)Полярные цветовые пространства могут использовать hue interpolation modes. gradiente поддерживает shorter, longer, increasing и decreasing.
conic-gradient(in oklch longer hue, hsl(325, 64%, 54%), hsl(208, 94%, 47%))conic-gradient(in oklch longer hue, hsl(325, 64%, 54%), hsl(208, 94%, 47%))Hue-интерполяция имеет смысл только для полярных цветовых пространств. Если hue mode передан для прямоугольного пространства вроде oklab, gradiente сохранит color space и сериализует градиент без hue mode.
Поддерживаемые color spaces:
oklab
lch
oklch
hsl
hwb
lab
srgb
srgb-linear
xyz
display-p3
a98-rgb
prophoto-rgb
rec2020Повторяющиеся конические градиенты
repeating-conic-gradient(...) использует тот же внутренний gradient kind, что и conic-gradient(...). Префикс устанавливает isRepeating: true в config, а instance type остается conic-gradient.
repeating-conic-gradient(from 45deg at 49% 45%, red 10%, 50%, blue 80%)repeating-conic-gradient(from 45deg at 49% 45%, red 10%, 50%, blue 80%)Повторяющиеся conic-градиенты полезны для делений колеса, полярных диаграмм, loading rings, угловых линеек, технических overlay-слоев, радиальных полос и генерируемых угловых паттернов.
Программное создание
Большинству пользователей лучше начинать с parse(), потому что он принимает тот же input shape, что и DSL. Когда нужно собрать градиент напрямую, используйте GradientConic.
Конструктор принимает два параметра:
new GradientConic(stops, config?)stops обязателен. config опционален, а пропущенные значения подставляются из дефолтов класса.
import { GradientConic } from 'gradiente'
const gradient = new GradientConic(
[
{
type: 'color-stop',
value: '#ff74f6',
position: 0,
},
{
type: 'color-stop',
value: '#405de6',
position: 1,
},
],
{
isRepeating: true,
from: {
kind: 'angle',
value: 45,
unit: 'deg',
},
position: {
kind: 'values',
x: {
kind: 'percent',
value: 49,
},
y: {
kind: 'percent',
value: 45,
},
},
interpolation: {
colorSpace: 'oklch',
},
},
)repeating-conic-gradient(from 45deg at 49% 45% in oklch, #ff74f6, #405de6)Трансформация конического градиента
Каждый renderer target получает одну и ту же исходную модель. В этом главная идея Core API: один раз распарсить, много раз трансформировать.
import { parse, transformTo } from 'gradiente'
const gradient = parse(
'conic-gradient(from 74deg at 35% 45% in oklch longer hue, #ff74f6, #405de6)'
)
const css = transformTo('css', gradient)
const canvas2d = transformTo('canvas-2d', gradient)
const webgl = transformTo('canvas-webgl', gradient)
const svg = transformTo('svg', gradient)conic-gradient(from 74deg at 35% 45% in oklch longer hue, #ff74f6, #405de6)У transformer outputs разные формы:
Нормализация
Используйте format() перед сохранением пользовательского ввода. Он парсит строку во внутреннюю модель и сериализует ее обратно в каноническую строку gradiente.
import { format } from 'gradiente'
const input = 'conic-gradient(from 74deg, red, blue 72%, yellow 63%)'
const normalized = format(input)conic-gradient(from 74deg, red 0%, yellow 63%, blue 72%)Нормализация особенно полезна для conic-градиентов, потому что нативный CSS и авторский input могут визуально расходиться, если stops записаны не по порядку. gradiente парсит строку, сортирует позиционированные stops в стабильную модель и затем использует эту модель для каждого renderer.
Практический чеклист
Используйте этот порядок, когда собираете или валидируете conic-градиент:
- Выберите центр через
at, если развертка должна вращаться не вокруг центра блока. - Выберите
from, если первый stop должен начинаться с конкретного угла. - Выберите интерполяцию:
srgbдля простой совместимости,oklabилиoklchдля более плавных переходов. - Добавьте минимум два color stops, чтобы получить полезный визуальный результат.
- Добавьте явные процентные позиции stops, если угловые секторы должны переживать редактирование.
- Используйте color hints, когда нужно сдвинуть midpoint перехода.
- Используйте double-position stops, когда нужны жесткие секторы.
- Используйте
repeating-conic-gradient(...)для делений, полос или повторяющихся угловых bands. - Используйте
format()перед сохранением пользовательского ввода. - Используйте
transformTo()для renderer output вместо ручной конвертации строки.