[Перевод] Grainy Gradients
Изучая графику на Dribbble или Behance, вы найдёте там дизайнеров, использующих простую технику добавления в изображения текстур: шум. Добавление шума делает сплошные цвета или плавные градиенты, например, тени, более реалистичными. Но несмотря на любовь дизайнеров к текстурам, шум редко применяется в веб-дизайне.
В этой статье мы при помощи CSS и SVG сгенерируем цветной шум, позволяющий добавлять текстуру к градиенту.
Интерактивная песочница
Проще всего разобраться, что происходит, поиграв в песочнице с параметрами, создающими слои.
SVG-шум и CSS-градиенты
Базовая техника, описываемая в этой статье, создана на основе ответа Криса Пахла на вопрос в Stack Overflow: можно ли добавить шум к CSS-градиенту?
Хитрость заключается в создании шума при помощи SVG-фильтра с последующим использованием этого шума в качестве фона. Подложите под него градиент, увеличьте яркость и контрастность, вот и всё — у вас получился градиент с плавным дизерингом.
Основные ингредиенты
Вот, с чем мы будем работать:
SVG turbulence: это наш фильтр шума.
Фон с градиентом и SVG: дальше мы добавляем этот фильтр в CSS в качестве фонового изображения, сочетающего фильтр с CSS-градиентом.
Повышение яркости и контрастности: затем мы применяем
filter
CSS, чтобы увеличить яркость и контрастность шума.Смешение градиентов: наконец, можно использовать
mix-blend-mode
для дальнейшей фильтрации цветов и смешения градиентов.
Давайте подробно рассмотрим каждый из этапов.
Использование SVG turbulence
Работая с SVG, мы можем задавать фильтры, и один из таких фильтров позволяет нам создать шум Перлина. Он называется
, для него можно задать атрибуты, например, выбрать, «турбулентность» это или «шум», указать размер зерна. Бенсе Сабо объясняет это гораздо подробнее, демонстрируя, как это можно использовать для создания паттернов.
Этот пример SVG создаёт фильтр и рендерит элемент
, который можно использовать для зернистых градиентов. Обратите внимание, что
SVG задаётся отдельно от
, а
просто ссылается на него.
Можно поэкспериментировать с изменением некоторых из свойств
Мы сохраним этот SVG как отдельный файл. В используемых в статье демо для получения SVG мы ссылаемся на внешнюю ссылку. Однако на практике вы будете ссылаться на локальный файл или собственную CDN. По какой-то странной причине на SVG нельзя сослаться по его id
в CSS, но можно встроить SVG, как мы показали в демо. Мы не применяем этот приём в демо ради повышения читаемости.
Создание CSS-фона при помощи SVG и градиента
После того, как мы сохранили куда-нибудь файл SVG, можно ссылаться на него по URL или пути и использовать его вместе с градиентом в background
CSS.
.noise {
/* ... /
background:
linear-gradient(to right, blue, transparent),
url(https://grainy-gradients.vercel.app/noise.svg);
}
Здесь важен порядок. В этом конкретном примере мы хотим, чтобы сплошной цвет (то есть с отсутствующим шумом) переходил в шум, а затем в другой цвет. Также мы хотим, чтобы один конец градиента был прозрачным, чтобы сквозь него был виден шум.
Вот так:
Однако выглядит это не очень красиво, потому что шум слишком размыт. Нам нужно «потрепать» его и сделать более зернистым. И для этого нам понадобится…
Повышение яркости и контрастности
Добавление Можете поэкспериментировать с тем, как контрастность и яркость влияют на градиент. В демо ниже увеличение яркости и контрастности выделяет размытые оттенки серого. Если приблизить изображение, то можно заметить, что шум состоит из множества цветов. SVG-фильтр изначально был цветным, а повышение яркости и контрастности выделило некоторые цвета. Хотя это конфетти малозаметно, оно нежелательно, поэтому мы продолжим отфильтровывать цвета при помощи CSS-смешения (например, Давайте создадим зернистый градиент, выполняющий переход между двумя цветами. CSS-смешение позволяет нам накладывать друг на друга слои цвета. В следующем примере мы добавим в разметку ещё один Можно использовать свойство CSS Мы рассмотрели довольно простой пример создания шумного градиента, но где он может пригодиться? Давайте рассмотрим способы его применения. Где градиенты возникают естественным образом? Например, в свете и тенях. Мы можем воспользоваться свойством CSS В примере с тенью мы создаём тёмный градиент и инвертируем его для создания эффекта в примере со светом. В обоих случаях Существенное повышение яркости и контрастности создаёт радужный эффект, напоминающий голографическую плёнку. Попробуйте поэкспериментировать с разными параметрами в песочнице, чтобы понять, как они влияют на текстуру. Кроме того, эту технику можно развить и другими экспериментами: Использовать другой SVG: во всех градиентах из этой статьи используется один и тот же SVG, но в песочнице можно поиграться с генерирующими шум параметрами, чтобы отрегулировать зернистость, а также внешний вид . Попробовать разные градиенты: кроме Добавить новые слои: при помощи CSS-смешения можно наложить друг на друга любое количество слоёв и смешать их. Применить другие SVG-фильтры: существует множество разных фильтров, в том числе гауссово размытие и разные типы освещения. Кроме того, на них можно ссылаться в CSS-фильтре и применять к любому элементу в дополнение к SVG. Невозможно избежать темы поддержки браузерами. База этой техники поддерживается всеми современными браузерами. Как можно догадаться, она не работает в Internet Explorer. Тем не менее, Internet Explorer поддерживает SVG как фон для CSS (только не со свойством CSS Эти данные о браузерной поддержке взяты с Caniuse, где их можно изучить подробнее. Число означает, что браузер поддерживает функцию от указанной версии и выше. Ещё я заметил, что браузеры на основе Blink (например, Chrome) и браузеры на основе WebKit (например, Safari) реализуют filter
CSS делает шум более очевидным, сдвигая самые тусклые цвета в сторону белого или чёрного. Фильтр применяется ко всему .noise {
/ ... /
background:
linear-gradient(to right, blue, transparent),
url(https://grainy-gradients.vercel.app/noise.svg);
filter: contrast(170%) brightness(1000%);
}
Шум не однороден по цвету
mix-blend-mode
и background-blend-mode
).CSS-смешение
mix-blend-mode: multiply;
, чтобы всё сгладить.
.noise {
/ ... /
background:
linear-gradient(20deg, rebeccapurple, transparent),
url(https://grainy-gradients.vercel.app/noise.svg);
contrast(170%) brightness(1000%);
}
.overlay {
/ ... /
background: moccasin;
mix-blend-mode: multiply;
}
isolation
, чтобы создать новый контекст наложения и выбрать, что мы будем смешивать. Если бы мы пропустили isolation
в следующем примере, то градиент и верхний слой смешались бы с цветом фона. Можете попробовать закомментировать эту строку в Codepen! /* Без изменений */
.isolate {
isolation: isolate;
/* ... /
}
Примеры использования
Свет и тени с зернистостью
mix-blend-mode
для плавного смешения градиентов и выборочной фильтрации цветов, которые хотим видеть в шуме.mix-blend-mode
позволяет нам выполнять их смешивание с другими градиентами.Голографическая плёнка
Дальнейшее развитие
linear-gradient
в CSS есть ещё четыре типа градиентов. Можете вспомнить их? (Вот один из них.)Браузерная поддержка
filter
).SVG как фоновое изображение CSS
Эффекты фильтров CSS
mix-blend-mode
немного по-разному, поэтому при использовании CSS-смешения проверьте его в разных браузерах. В своих собственных проектах я использовал browser-specific media queries , чтобы вручную разрешать визуальные различия при помощи небольших изменений в CSS.