10 вещей, которые можно делать в верстке с помощью псевдоэлементов before и after

image-loader.svg

Привет, Хабр! Меня зовут Максим Васянович, я спикер курса «Веб-верстка» в Skillbox. Сегодня поговорим о верстке, а точнее — о нюансах работы с псевдоэлементами before и after. Статья будет полезна, прежде всего, начинающим верстальщикам. Но, возможно, и профи будет интересно освежить эти моменты в памяти. 

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

Что такое псевдоэлементы и зачем они нужны

Это дополнения к элементам, которые создаются с помощью CSS. Они не размещаются в разметке, но, если заглянуть в DevTools, их можно найти в разделе Elements. 

Использовать псевдоэлементы можно для самых разных целей. Описать все — не хватит и объема небольшой книги, не то что статьи. Так что в этом материале я хочу рассмотреть два полезных псевдоэлемента — :: before  и :: after

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

  1. Иконки для элементов

С помощью псевдоэлементов можно сделать иконки для элементов. Например, для ссылки с телефоном нужно добавить иконку-трубку. Вот простой пример использования этой возможности.

+7 (999) 999-9999

.link {

  display: inline-flex;

  align-items: center;

  text-decoration: none;

}

.link--phone::before {

  content: "";

  display: inline-block;

  margin-right: 10px;

  width: 1em;

  height: 1em;

  background-image: url("https://cdn-icons-png.flaticon.com/512/597/597177.png");

  background-position: center;

  background-size: cover;

  background-repeat: no-repeat;

}

Тут все просто: указываем размеры, дисплей, отступ, а также саму иконку — с помощью background. И самое важное — это свойство content. Да, здесь оно со значением пустой строки (и будет таким почти во всех примерах), однако без него псевдоэлементы вообще не появятся.

У предложенного решения два плюса: мы вынесли иконку в CSS, чем разгрузили разметку, а также создали отдельный класс .link--phone, который всегда будет добавлять эту иконку, если надо.

Поиграть с этим кодом можно по ссылке. 

2.Счетчики на элементах

Нередко в дизайне сайтов встречается набор элементов, которые имеют порядковый номер: 01, 02, 03, 04 и т.п. Представьте, что количество таких элементов каждый день растет, объем контента сайта увеличивается, и с каждым новым блоком вам придется вручную писать каждую цифру. Это крайне неудобно, так что для это цели придумали счетчики, которые реализуются как раз с помощью псевдоэлементов. Давайте разберем на примере:

  
  
  
.parent {   width: 1000px;   margin: 0 auto;   display: flex;   flex-wrap: wrap;   gap: 30px;   counter-reset: numbers } .block {   position: relative;   min-height: 300px;   width: 30%;   border: 1px solid #000; } .block::after {   position: absolute;   right: 10px;   bottom: 10px;   counter-increment: numbers;   content: counter(numbers); }

Здесь нас интересует несколько вещей. Во-первых, для родителя итерируемых элементов (в нашем случае div с классом parent) мы задаем свойство counter-reset. Это, по сути, имя нашего счетчика, который мы далее будем использовать. Можно сюда написать что угодно по смыслу, в нашем случае будет numbers.

Далее, у самих элементов нужно создать псевдоэлемент (before или after — неважно, т.к. мы используем абсолютное позиционирование), и указать в нем два свойства:

  1. counter-increment: numbers — здесь мы указываем, что значение будет инкриментировано (будет увеличиваться), и название будет то же, что и у counter-reset

  2. content: counter (numbers) -, а здесь запускаем счетчик с помощью CSS-функции counter. Теперь это число будет увеличиваться в зависимости от количества блоков.

Если ваше число должно отличаться особым образом, например не »1, 2, 3», а »01, 02, 03», вы можете модернизировать свойство content, напрямую добавив в него число 0. Например: content:»0» counter (numbers).

Вы можете поиграть с примером по ссылке.

3.Кастомные чекбоксы и радиокнопки

Как известно, стилизация чекбоксов и радиокнопок — дело непростое. Напрямую стилизовать их нельзя, так что приходится использовать обходные пути. Один из таких путей — использование псевдоэлемента. Посмотрим на пример:



.checkbox {

  user-select: none;

  position: relative;

  cursor: pointer;

}

.checkbox__text {

  padding-left: calc(1em + 10px);

}

.checkbox__input {

  -webkit-appearance: none;

    appearance: none;

}

.checkbox__input::before {

    content: '';

    cursor: pointer;

    position: absolute;

  top: -2px;

  left: 0;

  width: 1em;

  height: 1em;

  border: 3px solid crimson;

  border-radius: 100%;

}

.checkbox__input:checked::before {

    background: crimson;

}

Самое важное — стили инпута и его псевдоэлемента. Сперва мы задаем инпуту appearance: none, внешне скрывая стандартный чекбокс. Затем с помощью псевдоэлемента рисуем простой кружок с бордером. И только когда чекбокс в состоянии checked (то есть нажат, активен), применяем дополнительный стиль, задаем фон кружочку. 

Вы можете поиграть с примером по ссылке. 

4.Обводка с градиентом

Сделать градиент через свойство border крайне трудно, а в некоторых браузерах просто невозможно. Но и здесь можно обойти систему, использовав псевдоэлементы. Посмотрим пример:

  Спящий кот
.image {   position: relative;   padding: 5px;   width: 400px; } img {   max-width: 100%; } .image::before {   content: "";   position: absolute;   top: 0;   left: 0;   bottom: 0;   right: 0;   background-image: linear-gradient(crimson, yellow);   z-index: -1; }

Тут мы имитируем бордер с помощью градиентного фона, и наложенного поверх него изображения. Благодаря паддингу в 5 пикселей картинка сжимается, а фон под ней проявляется как раз на 5 пикселей с каждой стороны. Внешне это очень похоже на обводку элемента.

Вы можете поиграть с примером по ссылке. 

5.Кастомные иконки у списка

Через псевдоэлемент можно делать и кастомные иконки для списков. Вы можете использовать даже эмоджи, если это требуется.

      
  • Элемент 1
  •   
  • Элемент 2
  •   
  • Элемент 3
  •   
  • Элемент 4
.list {     list-style: none; } .list li::before {     content: "

© Habrahabr.ru