Глубокое погружение CSS в радиальные и конические градиенты

Опубликовано: 2022-03-10
Краткое резюме ↬ В этой статье мы более подробно рассмотрим два градиента: conic-gradient radial-gradient . Вы увидите, как работает каждый из них в деталях, каковы различия и сходства между ними, как и где их использовать, а также некоторые варианты использования каждого из них.

Градиенты CSS — это полезная функция CSS, которую можно использовать для создания интересных эффектов пользовательского интерфейса или даже для помощи в рисовании чего-либо без необходимости создавать для этого элементы HTML. В этой статье я хотел бы остановиться на двух градиентах: conic-gradient radial-gradient . Каждый из них работает по-своему (конические градиенты изогнуты, а радиальные градиенты представляют собой прямую линию).

Чтобы следовать дальше, вам не нужно знать ни о radial-gradient , ни о conic-gradient . Я постараюсь объяснить их по-хорошему.

Давайте погрузимся!

  • Что такое радиальный градиент?
    • Самый простой пример
    • Как работает радиальный градиент?
  • Что такое конический градиент?
  • Примеры использования радиальных градиентов
    • radial-gradient в разделе героя
    • Эффект пунктирного узора
    • Эффекты изображения
  • Примеры использования конических градиентов
    • Круговые диаграммы
    • Фоны и узоры
    • Шаблоны пользовательского интерфейса
    • Анимация конических градиентов с помощью @property
    • Срежьте углы с помощью нестандартных форм
    • Конические градиенты
    • Раздел Фоны

Что такое радиальный градиент?

Благодаря своему названию, radial-gradient дают нам возможность рисовать радиальные элементы, такие как круг или эллипс.

Давайте рассмотрим самый простой синтаксис.

Самый простой пример

В этом примере у нас есть radial-gradient с двумя точками цвета. В результате получился градиент в форме эллипса.

 .element { background: radial-gradient(#9c27b0, #ff9800); }
Радиально-градиентный
(Большой превью)

Это самый простой radial-gradient , который мы можем сделать в CSS. Вы можете удивиться, почему по умолчанию используется эллипс? Хорошо, позвольте мне объяснить.

Если в градиенте не определено имя формы (круг или эллипс), по умолчанию используется эллипс в случае:

  • Размер не определен;
  • Или есть два значения (для ширины и высоты).

Как работает радиальный градиент?

Я пройдусь по серии визуальных материалов, которые покажут, как работает градиент, путем увеличения различных ключевых слов и дополнений.

Во-первых, давайте вернемся к исходному примеру.

 .element { background: radial-gradient(#9c27b0, #ff9800); }

Когда есть два цвета без определения формы, градиент по умолчанию будет эллипсом, например:

Градиент в форме эллипса
(Большой превью)

Эллипс заполняет ширину и высоту своего контейнера. Он выглядит размытым, потому что браузер предположил, что начальная и конечная точки равны 0% и 100% соответственно.

Вот как браузер видит градиент:

 .element { background: radial-gradient(#9c27b0 0%, #ff9800 100%); }

Если мы добавим circle перед первой точкой цвета, то это будет выглядеть так:

 .element { background: radial-gradient(circle, #9c27b0, #ff9800); }
Градиент в форме круга
(Большой превью)

Теперь, когда у вас есть представление о том, как круг и эллипс выглядят по умолчанию, давайте займемся позиционированием .

По умолчанию оба они центрированы по горизонтали и вертикали в своем контейнере. Другими словами, при 50% 50% :

Элементы эллипса и круга, центрированные по горизонтали и вертикали в своем контейнере
(Большой превью)

Здесь важно отметить, что позиционирование происходит из центра круга или эллипса, поэтому мы размещаем круг в top left , то, что будет позиционировано, является центральной точкой .

Давайте подробнее рассмотрим несколько примеров.

 .element { background: radial-gradient(circle at top left, #9c27b0, #ff9800); }
Радиальный градиент с кругом в левом верхнем углу
(Большой превью)

Мы могли бы также центрировать его на правой стороне. Добавление только right приведет к центрированию круга right 50% :

 .element { background: radial-gradient(circle at right, #9c27b0, #ff9800); }

Вот как это выглядит:

Радиальный градиент с кругом справа
(Большой превью)
Еще после прыжка! Продолжить чтение ниже ↓

Что такое конический градиент?

CSS-функция conic-gradient() создает градиент, который вращается вокруг центра элемента. Давайте посмотрим на базовый пример.

 .element { background: conic-gradient(#9c27b0, #ff9800); }
Конический градиент
(Большой превью)

Посмотрите, как начинается градиент от центральной точки элемента. По умолчанию он вращается от 0deg до 360 .

Давайте посмотрим, что произойдет, когда мы добавим значение резкой остановки для первого цвета.

 .element { background: conic-gradient(#9c27b0 50%, #ff9800); }
Конический градиент, где первый цвет заполняет 50% элемента, второй постепенно проявляется до 100%
(Большой превью)

Теперь первый цвет заполняет 50% элемента, а второй будет постепенно проявляться до 100% .

Что произойдет, если мы применим жесткую остановку и ко второму цвету? В приведенном ниже фрагменте первый цвет заполнит 50% элемента, второй — от 50% до конца ( 100% ).

 .element { background: conic-gradient(#9c27b0 50%, #ff9800 0); }
Конический градиент, где первый цвет заполняет 50% элемента, а второй начинается с 50% до конца
(Большой превью)

Увеличение значения первой остановки цвета создаст заливку под углом:

 .element { background: conic-gradient(#9c27b0 65%, #ff9800 0); }
Первая цветовая точка увеличена до 65%, что формирует угловую заливку.
(Большой превью)

Не только это, мы также можем создать повторяющийся градиент, используя функцию CSS repeating-conic-gradient() , как показано ниже.

 .element { background: repeating-conic-gradient( #9c27b0 0 15deg, #ff9800 15deg 30deg ); }

Приведенные выше фрагменты заполняют первый цвет от 0deg до 15deg , затем второй цвет заполняет от 15deg до 30deg . С повторением это будет выглядеть как на рисунке ниже:

Повторяющийся конический градиент
(Большой превью)

Примеры использования радиальных градиентов

Часто нам нужно добавить иллюстрацию или узор в качестве фона. Если есть заголовок и/или второстепенный текст, читать их, конечно, может быть сложно.

radial-gradient в разделе героя

Использование эллипсовидного градиента того же цвета, что и фон, поможет выделить контент. В следующем примере обратите внимание, как содержимое перекрывается фоном. Из-за этого немного сложнее сосредоточиться на чтении, чем на просмотре шаблона:

Пример варианта использования, когда содержимое перекрывается фоном
(Большой превью)

Распространенным решением для этого является добавление эллипса того же цвета, что и фон под ним (чтобы он смешался с ним).

Вот главный раздел с эллипсом (выделен серым цветом только для демонстрационных целей):

Раздел героя с эллипсом, окрашенным в серый цвет
(Большой превью)

Вот как отразить это в CSS:

 .hero { background-color: #fbfafa; background-image: radial-gradient(#fbfafa, rgba(0,0,0,0) center/70% 70% no-repeat, url("hero-bg.svg"); background-position: center; background-size: 70% 70%, cover; background-repeat: no-repeat; }
И пример варианта использования, когда содержимое больше не перекрывается фоном из-за добавленного эллипса того же цвета, что и фон под ним.
(Большой превью)

Таким образом, мы скрыли шаблон под контентом, теперь его намного легче читать.

Эффект пунктирного узора

Чтобы создать эффект точечного узора, мы можем использовать radial-gradient . Вот как это выглядит:

Пунктирный узор
(Большой превью)

Для этого мы можем создать крошечный круг, а остальная часть градиента будет прозрачной.

Вот как это выглядит само по себе:

Цвет круга и остальная часть градиента - прозрачный цвет.
(Большой превью)

Когда этот шаблон повторяется, вот как это выглядит:

Повторяющийся узор с круглым цветом, а остальная часть градиента прозрачного цвета.
(Большой превью)

Чтобы отразить это в CSS, нам нужно добавить ширину и высоту градиента. Поскольку градиенты по умолчанию повторяются, это приведет к приведенному выше шаблону.

 .dot-pattern { --color-1: #9c27b0; --color-2: rgba(0,0,0,0); background-image: radial-gradient(circle at 2px 2px, var(--color-1) 1px, var(--color-2) 0); background-size: 15px 15px; }

Эффекты изображения

В сочетании с mix-blend-mode радиальные градиенты могут создавать интересные эффекты пользовательского интерфейса для изображений. В следующем примере обратите внимание, как круг расположен в верхнем левом углу. Мы можем воспользоваться этим, играя с режимами наложения для достижения определенного эффекта.

Пример, в котором радиальный градиент создает интересный эффект пользовательского интерфейса для изображения. А именно, круг расположен в верхнем левом углу изображения, что создает градиент.
(Большой превью)
 .thumb:after { content: ""; position: absolute; inset: 0; background: radial-gradient(circle at top left, #9c27b0, #ff9800); mix-blend-mode: hard-light; opacity: 0.4; }

Примеры использования конических градиентов

Круговые диаграммы

Первый вариант использования конических градиентов, который я могу придумать, — это простые круговые диаграммы. Это было то, что мы хотели сделать в CSS некоторое время назад, и теперь это возможно с легкостью.

Круговая диаграмма
Простая круговая диаграмма (большой предварительный просмотр)
 .pie-chart { width: 100px; height: 100px; background: conic-gradient(from 0deg, #b2daf9 128deg, #2096f3 0); border-radius: 50%; }

Фоны и узоры

Существует множество возможностей для создания узора с коническими градиентами. В этом примере я сосредоточусь на шахматной доске.

Шахматная доска
Шаблон шахматной доски 2×2, полученный с помощью conic-gradient() . (Большой превью)

Вот что происходит в следующем градиенте:

  • Цвет #fff покрывает 90 90deg элемента;
  • Затем следует #000 до 180deg ;
  • Затем следует #fff до 270deg ;
  • Наконец, #000 заполнен до конечного угла ( 360deg ).
 .checkerboard { --size: 25px; width: 200px; height: 100px; background-image: conic-gradient(#fff 90deg, #000 0 180deg, #fff 0 270deg, #000 0); background-size: var(--size) var(--size); }

При повторении и управлении через background-size это будет выглядеть так:

Повторяющийся шахматный узор
Предварительный просмотр шахматной доски, которая повторялась несколько раз. (Большой превью)

Кроме того, мы можем добиться действительно интересных эффектов, поворачивая некоторые значения по-другому. Вот пример:

 .element { background-image: conic-gradient(#fff 90deg, #000 0 136deg, #fff 0 313deg, #000 0); }
Повернутый повторяющийся узор шахматной доски
Та же схема шахматной доски, но другая. (Большой превью)

Шаблоны пользовательского интерфейса

Иногда нам может понадобиться сгенерировать случайный шаблон пользовательского интерфейса, который принимает разные формы. Для этого мы можем использовать conic-gradient . Идея состоит в том, что мы контролируем размер градиента с помощью background-size , а затем меняем угол conic-gradient для достижения различных эффектов.

У нас есть элемент шириной и высотой 200px . Внутри этого элемента мы будем повторять фон.

 .element { --size: 20px; width: 200px; height: 200px; background-size: var(--size) var(--size); }

Чтобы представить это лучше, каждый фон будет иметь размер 20 20px по ширине и высоте, и он будет повторяться по горизонтали и вертикали.

Элемент шириной и высотой 200 пикселей, внутри этого элемента есть повторяющийся фон размером 20 пикселей.
Элемент (200×200 пикселей) с повторяющимся фоном размером 20 пикселей. (Большой превью)

Теперь каждый квадрат, который вы видите, будет содержать conic-gradient . А пока я добавлю два синих оттенка, чтобы лучше продемонстрировать концепцию.

 .element { --size: 20px; width: 200px; height: 200px; background: conic-gradient(#2296F3 0.13turn, rgba(255,255,255,0) 0); background-size: var(--size) var(--size); }

Вот так выглядит конический градиент без повторения:

Два квадрата с синими коническими градиентами в форме треугольника. Первый квадрат имеет темно-синий фон, а второй квадрат имеет прозрачный
(Большой превью)

С повторением это выглядит так. Теперь нужно сделать второй цвет прозрачным, чтобы получилась треугольная форма.

Элемент с повторяющимся фоном треугольной формы
(Большой превью)

Имея другой угол, мы можем рандомизировать форму узора, чтобы получить интересные эффекты.

Различные формы рисунка, образованные под разными углами: 0,08 витка, 0,03 витка и 0,5 витка.
(Большой превью)

Анимация конических градиентов с помощью @property

Мы можем создавать интересные анимационные эффекты с помощью conic-gradient . Однако это невозможно по умолчанию. Нам нужно использовать определение @property для определения пользовательского свойства, которое мы будем использовать для анимации.

 @property --conic-mask { syntax: '<percentage>'; inherits: false; initial-value: 0%; } .conic-mask { --conic-mask: 0%; -webkit-mask: conic-gradient(from 0deg at 50% 50%, #000 var(--conic-mask), #0000); transition: --conic-mask 1s ease-out; } .conic-mask: hover { --conic-mask: 100%; }
Эффект анимации с conic-gradient .

Срежьте углы с помощью нестандартных форм

Это демо Темани Афиф. Идея состоит в том, чтобы использовать conic-gradient в качестве маски для создания эффектов срезанных углов:

См. Pen [Срезание углов с нестандартной формой [разветвление]] (https://codepen.io/smashingmag/pen/jOGKjxQ) Темани Афифа.

См. Углы Pen Cut с нестандартной формой [разветвление] от Temani Afif.

Конические градиенты

Мы можем использовать conic-gradient для создания тонких эффектов градиента, которые имеют более темные углы или более светлые углы с другими цветами. Conic.css — это крошечная CSS-библиотека Адама Аргайла, которая содержит множество прекрасных конических градиентов.

Конические градиенты разных цветов
(Большой превью)

Использование конических градиентов для фона раздела

Я видел это на демо, которым поделился Скотт Келлум. Мне очень понравилось, как работает техника добавления частичного цвета в нижний колонтитул, и в то же время он выглядит гладким.

 .footer { background: conic-gradient(from 0.25turn at 25% 0%, #FFD9CE, rgba(#FFD9CE, 0) 50%); }
Нижний колонтитул Typetura с коническим градиентом
(Большой превью)
  • Посмотреть демо →

Заключение

Как вы видели, использование функций radial-gradient CSS и conic-gradient может привести к очень интересным (и полезным) пользовательским интерфейсам. Тем не менее, когда дело доходит до использования каждого из них, нет черного и белого. В большинстве случаев это зависит от конкретного варианта использования.

Я надеюсь, что вы найдете статью полезной. Большое спасибо за чтение!

Дальнейшее чтение журнала Smashing Magazine

  • Глубокое погружение object-fit и background-size в CSS
  • Распространенные проблемы с CSS для интерфейсных проектов
  • Использование цветов HSL в CSS
  • Проблемы переполнения в CSS