Всем привет, сегодня мы продолжим говорить на тему Glitch. Но если в предыдущей статье из рубрики «Магия CCS» мы разбирали, как создать такой эффект для любого фона, то в этой статье я расскажу метод искажения любого текста с эффектом Glitch. Поэтому, если тебе интересно узнать, как это делается, то продолжай читать.
Итак, весь пример вы сможете традиционно увидеть на сайте codepen в конце статьи. Мы будем работать только с HTML и CSS.
Начнем с HTML
Набросаем небольшую разметку. Первым будет блок box
с тегом h1
. Для h1
зададим класс glitch
и добавим внутри текст: «Glitch».
<div class="box"> <h1 class="glitch">Glitch</h1> </div>
Перейдем к CSS
Для работы я буду использовать препроцессор SCSS, так как в этой работе нам понадобиться директива @for
и как только мы к ней подберемся, я расскажу о ней подробнее.
Для того что бы нам не беспокоиться об отступах, для этого примера я использую селектор *
. Но на больших проектах я не рекомендую его использовать, лучше воспользуйтесь для сброса стилей файлом normalize.css.
* { margin: 0; padding: 0; }
Далее переходим к стилизации body
и html
, напишем два стандартных свойства — width
и height
. Это нам понадобиться для того, что бы поставить наш текст, над которым мы работаем, по центру экрана.
body, html { width: 100%; height: 100%; }
Запишем снова body
и закрасим фон:
body { background-color: #000; }
Для фона мы использовали черный оттенок и текст слился с фоном, поэтому давайте окрасим его в белый цвет. Для этого внутри box
мы укажем стили для glitch
.
.box { .glitch { color:#fff; } }
Теперь что бы поставить текст по центру по горизонтали и вертикали мы добавим стили в класс box
:
.box { display: flex; justify-content: center; align-items: center; height: 100%; }
Добавим еще немного стилей для текста. Давайте подключим внешний шрифт с сайта Google Fonts. Нас интересует шрифт без засечек, но при этом, что бы он был относительно широким. После добавим его в HTML.
<link href="https://fonts.googleapis.com/css?family=Poppins:600" rel="stylesheet">
Подключаем его в CSS и задаем жирность шрифта и размер.
.box { .glitch { color: #fff; font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 100px; } }
Из чего состоит Glitch-эффект для текста?
В общем и целом у нас должен получиться такой результат:
Из чего он состоит?
Мы с вами написали текст в теге h1
и сзади него дублируется тот же самый текст, который отображен через псевдо-элементы :before
и :after
. Естественно, они установлены при помощи абсолютного позиционирования. Поэтому, наша цель, создать при помощи директивы @for
некий цикл, который позволит повторять одно и то же действие, связанное с анимацией. Именно эти две составляющие мы и будем сегодня разбирать.
Давайте начнем со стилизации :after
и :before
. У них будут общие стили, поэтому их запишем через запятую.
.glitch:before, .glitch:after { content: 'Glitch'; color: #fff; position: absolute; top: 0; overflow: hidden; padding: 30px; }
Так как я сказала, что они установлены при помощи position: absolute
, это значит, что у класса glitch
должен стоять position: relative
:
.box { .glitch { color: #fff; font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 100px; position: relative; padding: 30px; } }
Далее давайте добавим стилизации для псевдоэлементов. Начнем с :before
.
.glitch:before { left: 3px; text-shadow: -3px 0 red; }
Теперь давайте поработаем с :after
.
.glitch:after { left:-3px; text-shadow: -3px 0 blue; }
Анимация CSS
Теперь поработаем с таким свойством, как анимация. Для записи мы будем использовать короткую запись, а не расширенную. И пишется она по следующей формуле:
- animation-name — имя анимации
- animation-duration — время, с которым будет производиться анимация
- animation-timing-function — название функции анимации
- animation-delay — задержка анимации, если таковая имеется, по умолчанию это значение 0
- animation-iteration-count — значение повтора анимации
- animation-direction — направление анимации
Начнем запись в :before
:
.glitch:before { left: 3px; text-shadow: -3px 0 red; animation: glitch-before 2s linear 0s infinite alternate; }
Скопируем добавленную строчку, добавив ее в :after
, изменив название анимации:
.glitch:after { left: -3px; text-shadow: -3px 0 blue; animation: glitch-after 2s linear 0s infinite alternate; }
Если мы работаем с анимацией, то конечно же нам понадобиться правило @keyframes
. Укажем первое имя анимации glitch-before
и начнем работать с ним.
Директива @for
Эта директива выводит набор стилей заданное число раз. Для каждого повторения используется переменная-счетчик для изменения вывода. И так, как здесь сказано о переменных, то добавим первую и единственную переменную, которая нам понадобиться в анимации и назовем ее steps
@keyframes glitch-before { $steps: 20; }
Давайте снова вернемся к теории. В качестве примера я покажу, как выглядит синтаксис, когда мы используем директиву @for
На изображении вы видите один из примеров. Тут используется переменная i
и далее мы говорим о том, что эта переменная должна интегрироваться 5 раз. Дальше мы указываем название класса definition
, который в дальнейшем, когда у нас будет компилироваться SCSS, будет приобретать значения 1, 2, 3, 4, 5. То есть итерируется 5 раз. Именно поэтому у нас получается пять классов. При этом в width
у нас тоже задается некая формула 10 умноженная на переменную i
. И в данном случае i
принимает значение от 1 до 5. То есть, если в первом случае 10 умножается на 1, у нас получается 10px в CSS, далее, когда i
приобретает цифру 2 — 10px умножаются на 2 и соответственно у нас получается 20px и далее, как вы уже поняли, все это происходит по возрастанию.
Сейчас внутри @keyframes
мы попробуем тоже самостоятельно записать директиву @for и подобную формулу, которую мы сейчас с вами рассмотрели.
@keyframes glitch-before { $steps: 20; @for $i from 0 through $steps { #{percentage($i*(1/$steps))} { clip: rect(random(150)+px, 350px, random(150)+px, 30px) } } }
Мы задали первую анимацию, теперь скопируем этот код изменив на glitch-after
@keyframes glitch-after { $steps: 20; @for $i from 0 through $steps { #{percentage($i*(1/$steps))} { clip: rect(random(150)+px, 350px, random(150)+px, 30px) } } }
Ознакомиться подробнее с HTML и CSS можно тут:
Вместо заключения
В конце этой статьи мне бы хотелось более подробно показать, что именно мы сделали с директивой @for
. Для этого скопируем все стили, которые мы написали и скомпилируем при помощи онлайн сервиса SassMeister. После компиляции вы можете увидеть, что мы создали 20 шагов в правиле @keyframes
для разных наименований анимации, то есть glitch-after
и glitch-before
. Вы можете сами все это изучить более подробно используя данные ссылки и посмотреть, как директива @for
преобразует значения в CSS.
Спасибо всем, что прочли эту статью до конца и напишите в комментариях, какие еще эффекты вы бы хотели разобрать более подробно. Конечно, прежде всего, в этой рубрике меня интересуют эффекты, которые можно создать при помощи CSS.
Не забывай задавать свои вопросы по вёрстке или фронтенд разработке у профессионалов на FrontendHelp в режиме онлайн.
Комментарии
alex
12.01.2021
не работает в safari