Привет, Хабр! Меня зовут Максим Васянович, я спикер курса “Веб-верстка” в Skillbox. Сегодня поговорим о верстке, а точнее - о нюансах работы с псевдоэлементами before и after. Статья будет полезна, прежде всего, начинающим верстальщикам. Но, возможно, и профи будет интересно освежить эти моменты в памяти.  Псевдоэлементы - мощный инструмент для создания дополнительной стилизации элементов. В этой статье посмотрим, для чего их можно использовать и как. Это дополнения к элементам, которые создаются с помощью CSS. Они не размещаются в разметке, но, если заглянуть в DevTools, их можно найти в разделе Elements.  Использовать псевдоэлементы можно для самых разных целей. Описать все - не хватит и объема небольшой книги, не то что статьи. Так что в этом материале я хочу рассмотреть два полезных псевдоэлемента - ::before  и ::after По умолчанию, псевдоэлементы ::before и ::after делают то, что должны - добавляют нечто до элемента и после элемента. Однако, на практике почти никто не использует эту возможность, т.к. потребность в ней возникает крайне редко. Ниже я расскажу о десяти способах реального использования данных псевдоэлементов в работе. Иконки для элементов С помощью псевдоэлементов можно сделать иконки для элементов. Например, для ссылки с телефоном нужно добавить иконку-трубку. Вот простой пример использования этой возможности. Тут все просто: указываем размеры, дисплей, отступ, а также саму иконку - с помощью background. И самое важное - это свойство content. Да, здесь оно со значением пустой строки (и будет таким почти во всех примерах), однако без него псевдоэлементы вообще не появятся. У предложенного решения два плюса: мы вынесли иконку в CSS, чем разгрузили разметку, а также создали отдельный класс .link--phone, который всегда будет добавлять эту иконку, если надо. Поиграть с этим кодом можно по ссылке.  2.Счетчики на элементах Нередко в дизайне сайтов встречается набор элементов, которые имеют порядковый номер: 01, 02, 03, 04 и т.п. Представьте, что количество таких элементов каждый день растет, объем контента сайта увеличивается, и с каждым новым блоком вам придется вручную писать каждую цифру. Это крайне неудобно, так что для это цели придумали счетчики, которые реализуются как раз с помощью псевдоэлементов. Давайте разберем на примере: Здесь нас интересует несколько вещей. Во-первых, для родителя итерируемых элементов (в нашем случае div с классом parent) мы задаем свойство counter-reset. Это, по сути, имя нашего счетчика, который мы далее будем использовать. Можно сюда написать что угодно по смыслу, в нашем случае будет numbers. Далее, у самих элементов нужно создать псевдоэлемент (before или after  - неважно, т.к. мы используем абсолютное позиционирование), и указать в нем два свойства: counter-increment: numbers - здесь мы указываем, что значение будет инкриментировано (будет увеличиваться), и название будет то же, что и у counter-reset content: counter(numbers) - а здесь запускаем счетчик с помощью CSS-функции counter. Теперь это число будет увеличиваться в зависимости от количества блоков. Если ваше число должно отличаться особым образом, например не “1, 2, 3”, а “01, 02, 03”, вы можете модернизировать свойство content, напрямую добавив в него число 0. Например: content: “0” counter(numbers). Вы можете поиграть с примером по ссылке. 3.Кастомные чекбоксы и радиокнопки Как известно, стилизация чекбоксов и радиокнопок - дело непростое. Напрямую стилизовать их нельзя, так что приходится использовать обходные пути. Один из таких путей - использование псевдоэлемента. Посмотрим на пример: Самое важное - стили инпута и его псевдоэлемента. Сперва мы задаем инпуту appearance: none, внешне скрывая стандартный чекбокс. Затем с помощью псевдоэлемента рисуем простой кружок с бордером. И только когда чекбокс в состоянии checked (то есть нажат, активен), применяем дополнительный стиль, задаем фон кружочку.  Вы можете поиграть с примером по ссылке.  4.Обводка с градиентом Сделать градиент через свойство border крайне трудно, а в некоторых браузерах просто невозможно. Но и здесь можно обойти систему, использовав псевдоэлементы. Посмотрим пример: Тут мы имитируем бордер с помощью градиентного фона, и наложенного поверх него изображения. Благодаря паддингу в 5 пикселей картинка сжимается, а фон под ней проявляется как раз на 5 пикселей с каждой стороны. Внешне это очень похоже на обводку элемента. Вы можете поиграть с примером по ссылке.  5.Кастомные иконки у списка Через псевдоэлемент можно делать и кастомные иконки для списков. Вы можете использовать даже эмоджи, если это требуется. Здесь сбрасываются стандартные точки с помощью list-style, а затем с помощью псевдоэлемента добавляется кастомная иконка. Эмоджи вставлен не фоном, как делали ранее, а прямо в свойство content. Вы можете поиграть с примером по ссылке.  6.Эффекты наложения слоев Частенько на контентных сайтах можно видеть превью статьи с картинкой на фоне и текстом поверх изображения. Чтобы текст был виден пользователю и читаем, поверх картинки удобно делать небольшое затемнение. В этом случае текст будет отлично виден как на фоне темного, так и светлого изображения. Подобные наложения слоя с затемнением (и не только) очень удобно делать при помощи псевдоэлементов. Рассмотрим пример: Здесь два важных момента - стили заголовка и стили самого псевдоэлемента. Итак, у заголовка задан белый цвет текста, и как вы понимаете, если картинка на фоне будет светлая - текст мы не увидим. Поэтому нужно затемнение. Чтобы затемнение было под текстом, мы просто поднимем текст - дадим ему position:relative и z-index больше нуля. Само затемнение, конечно, делаем псевдоэлементом. С помощью position: absolute и свойств top, left, right, bottom со значением 0 мы растягиваем псевдоэлемент на размер родителя, и просто даем ему тень. Получается затемнение. Вы можете поиграть с примером по ссылке.  7.Стилизация кавычек у цитаты У тега q (тег для небольшой цитаты) по умолчанию есть свои кавычки (кстати, они сделаны псевдоэлементом), которые в 99% случаев не подходят к общему стилю страницы. Раз они уже сделаны через псевдоэлементы - мы легко можем заменить их на свои. Помимо тега q есть еще и blockquote, который кавычек не имеет. Но если очень хочется, их можно сделать. Пример: Я специально показал здесь и q, и blockquote, чтобы было понятно, что стилями возможно все. Для разных тегов можно написать легко одно и то же. В общем-то, сейчас кавычки сделаны через content: open-quote, но если хочется - можно использовать бэкграунд-изображение, чтобы сделать абсолютно любые кавычки. Вы можете поиграть с примером по ссылке.  8.Стилизация атрибута alt Довольно специфический, но иногда очень удобный прием. С помощью псевдоэлемента можно исправить стандартное некрасивое отображение “сломанной” картинки на нормальное. как выглядит стандартный alt, если картинка не загрузилась. а так мы можем сделать Давайте разберем пример: Самое важное тут - это интересная особенность свойства content. Внутри можно размещать значение атрибутов тега, и это здорово. Например, вы могли бы сделать свои собственные data-атрибуты с каким-то текстом, и вывести его на сайт с помощью content: attr(). Вы можете поиграть с примером по ссылке.  9.Геометрические эффекты стилизации (линии, кружочки и т.д.) Иногда в макетах встречается различные дополнительные эффекты, например, под заголовками секций размещается небольшая линия, которая как бы подчеркивает заголовок. И это тоже можно сделать при помощи псевдоэлемента. Пример: Здесь создается псевдоэлемент с пустым контентом, с указанием размеров (ширины и высоты) и фона (background). По сути мы нарисовали прямоугольник, который выглядит как линия.   Точно также  можно делать круги, квадраты и прочие фигуры, которые есть в макете. Вы можете поиграть с примером по ссылке.  10.Эффекты для состояний элементов Для состояний элементов (hover, focus, active) можно использовать псевдоэлементы, особенно если эти эффекты нестандартные, со скруглением углов и так далее. Снова посмотрим пример: Здесь создается псевдоэлемент с размером на 12 пикселей большим, чем у родителя. Затем перемещаем его на 6 пикселей, и псевдоэлемент встает четко по центру элемента. Через псевдокласс :focus визуализируем его, так что получается красивая обводка. Вы можете поиграть с примером по ссылке:  В целом, при помощи псевдоэлементов можно выполнять практически любые преобразования и трансформации, если творчески подойти к процессу. Самое важное здесь то, что при использовании этих элементов разметка не раздувается, поскольку отпадет необходимость использования пустых тегов (как часто делают, используя span). Используйте псевдоэлементы, они серьезно упростят вашу жизнь. Удачи! На курсе «Веб-вёрстка» вы познакомитесь со стандартами Web 2.0, научитесь работать с макетами и форматировать код, освоите адаптивную вёрстку, а по итогу — сможете создавать быстрые и удобные сайты, которые точно понравятся пользователям. Посмотреть программу и записаться по ссылке.