Псевдоклассы и псевдоэлементы

Web-технологии

Псевдоклассы и псевдоэлементы

Лекция №7.3

Псевдокласс

Псевдоклассы — особый вид селектора, который уточняет тип или состояние. Это как заранее заданные классы.

Обычно это какой-то качественный признак: реакция на наведение курсора, порядок следования и другие.

Пример подсветки строк таблицы

Без наведения курсора:

      tr {
        background: #fff;
      }
    

При наведении курсора:


      tr:hover{
        background: #0e73ee;
      }
    

Пример подсветки строк таблицы

Чемпионат по поеданию хот-догов
Матчи Выигрыши Ничьи Проигрыши
Танос 5 2 4 1
Звёздный Лорд 4 1 1 2
Гамора 5 3 2 0
Ронан Обинитель 3 2 0 1

Синтаксис псевдокласса

    [селектор]:псевдокласс {
      свойство: значение;
    } 
  

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

:active

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

:active

        a:active {
        } /* Селектор по тегу + :active */
        .link:active {
        } /* Селектор по классу + :active */
        li .link:active {
        } /* Составной селектор + :active */
        #id:active {
        } /* Селектор по тегу + :active */
    

Если вы задаёте стили для разных состояний ссылок, то следует придерживаться определённого порядка в объявлении cтилей: :link:visited:hover:active.

:is()

Без :is()

            h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { /* … */ }
             
        

С использованием :is()

        :is(h1, h2, h3, h4, h5, h6) a { /* … */ }
         
    

:any-link / :link

Псевдокласс :link используется для оформления ссылок, которые пользователь ещё никогда не открывал.

        a:link {
          color: blue;
        }
    

:visited

Псевдокласс :visited добавляется ссылкам, по которым уже переходил пользователь.

:visited

        a {
          color: green;
        }
         
        a:visited {
          color: purple;
        }
    

:checked

Браузер присваивает чекбоксу или радио-кнопке псевдокласс :checked когда они отмечены. Мы можем это использовать для стилизации элемента на свой вкус.

:checked

Будем менять обводку и цвет текста у чекбокса когда он отмечен:

        <label>
          <input type="checkbox" />
          <span class="input-text"> Чекбокс (нажми!) </span>
        </label>
    

:checked

        /* белая обводка в дефолтном состоянии */
        input[type="checkbox"] {
          outline: 2px solid #ffffff;
        }
        
        /* обводка становится синей, когда чекбокс кликнули */
        input[type="checkbox"]:checked {
          outline: 2px solid #1a5ad7;
        }
    

:checked

:default

Применим к элементам формы (<input type="radio"><input type="checkbox"><option> и <button>), у которых можно задать начальное состояние.

Например, у <input type="checkbox"> селектор применится к тому чекбоксу, у которого в разметке установлен атрибут checked, т. е. он по умолчанию выбран.

:default

        :default + span {
            font-weight: bold;
        }
    

:disabled / :enabled

Позволяют находить элементы формы по состоянию их атрибута disabled. Почти эквивалентны селекторам по атрибуту ([disabled] и :not([disabled]) соответственно), но более гибкие, т. к. среагируют на унаследованное состояние disabled.

:disabled / :enabled

<input disabled>
<fieldset disabled>
:enabled

:empty

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

:***-child

При помощи псевдоклассов можно удобно выбирать элементы по их порядковому номеру внутри родительского элемента.

Раскрасим в разные цвета фон у пунктов списка. Обратите внимание, что у всех пунктов списка одинаковые классы, а значит мы не сможем обратиться к отдельным пунктам при помощи селектора по классу.

        <ul class="list">
          <li class="list-item">Темный синевато-зеленый</li>
          <li class="list-item">Блестящий зелёный</li>
          <li class="list-item">Блестящий зеленовато-желтый</li>
          <li class="list-item">Блестящий зеленовато-желтый</li>
          <li class="list-item">Блестящий зеленовато-желтый</li>
          <li class="list-item">Розовый щербет</li>
          <li class="list-item">Умеренный оранжевый</li>
        </ul>
    
        /* У всех пунктов списка будет жёлтый фон */
        .list-item {
          background-color: #FFD829;
        }
         
        /* У первого пункта списка, первого ребёнка будет */
        /* тёмно-зелёный цвет фона */
        .list-item:first-child {
          background-color: #064236;
        }
    
        /* У последнего пункта списка, последнего ребёнка будет  */
        /* оранжевый цвет фона */
        .list-item:last-child {
          background-color: #ED6742;
        }
         
        /* У второго пункта списка будет зелёный цвет фона */
        .list-item:nth-child(2) {
          background-color: #49A16C;
        }
    

Последний штрих

        /* У предпоследнего пункта списка будет  */
        /* розовый цвет фона */
        .list-item:nth-last-child(2) {
          background-color: #F498AD;
        }
    

Разберем подробнее

nth-child

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

nth-child

Но всё становится гораздо интереснее, когда мы хотим выбрать, к примеру, каждый третий элемент внутри родителя. Используем для этого формулу :nth-child(3n).

Вместо n будет подставляться 0, затем 1, 2 и так далее. В результате умножения в скобки будет подставляться 0, 3, 6, 9 и так до тех пор, пока не закончатся дети внутри родителя.

nth-child

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

Тут нам к умножению на n нужно будет прибавить ещё 10, чтобы отсчёт начался не с 0, а с 10: nth-child(6n+10).

Псевдокласс :nth-last-child работает абсолютно аналогично, только счёт ведётся с конца.

NTH-калькулятор

:fullscreen

Признак того, что документ развернули на всё окно (с помощью JavaScript).

Cкроем панель управления у плеера, если он развёрнут на весь экран:

        .player:fullscreen .player__controls {
          display: none;
        }
    

:focus / :focus-within

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

А :focus-within ещё обозначает элемент, внутри которого находится элемент в фокусе.

:focus / :focus-within

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

        :focus {
          outline: -webkit-focus-ring-color auto 1px;
        }
    

:focus / :focus-within

Важно! Не удаляйте стили для фокуса полностью. Если вам не нравятся дефолтные стили — измените их. При полном удалении фокуса пользователь не будет понимать в какой части страницы он находится, если его сценарий пользования сайтом отличается от привычного.

:hover

        .link {
          color: #000;
          text-decoration: none;
        }
    
            /* Изменения при наведении */
            .link:hover {
              color: pink;
              text-decoration: underline;
            }
        

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

:indeterminate

Элементы, которые могут находиться в «промежуточном» состоянии:

:in-range / :out-of-range

Применяется для <input>, у которого определены атрибуты min и max и введённое значение соответствует (:in-range) или нет (:out-of-range) этому диапазону.

Бериллий

:lang()

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

        /* в арабском нет переносов */
        :lang(ar) {
          hyphens: none;
        }
    

:not()

Находит элемент, которые не соответствует селектору, который передан в качестве аргумента. Очень мощный псевдокласс, позволяющий писать эффективные CSS-селекторы.

        /* красная рамка для <img> без alt */
        img:not([alt]) {
          outline: 2px solid red;
        }
    

:required / / :optional

:optional находит любой <input>, у которого не установлен атрибут required — то есть находит необязательные поля ввода. А :required — наоборот, те <input>, у которых есть этот атрибут.

        input:required {
          outline: 2px solid blue;
        }
    

:required / / :optional

Обратите внимание, что использование этого псевдокласса эквивалентно селектору по атрибуту [required].

:read-only / :read-write

Находит элементы, недоступные (:read-only) или наоборот (:read-write) для редактирования. Например, ориентируется на наличие атрибута disabled или readonly.

:root

Соответствует корневому тегу-элементу документа. Для HTML это, соответственно, <html>, для SVG — <svg>. Специфичность селектора :root выше, чем у селектора по тегу.

:target

При переходе по ссылке, которая ведёт на URI-фрагмент (элемент внутри страницы), id фрагмента совпадает со значением атрибута id этого элемента — это состояние можно «поймать» с помощью псевдокласса :target.

:invalid / :valid

Псевдоклассы используются для стилизации полей формы:

:invalid / :valid

Общие советы

Общие советы

Псевдоэлементы

Псевдоэлементы

Псевдоэлементы  —  это элементы, которых не существует в HTML-разметке.

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

Пример использования

Самый частый сценарий использования псевдоэлемента — наложение полупрозрачной заливки поверх картинки (оверлея).

Чаще всего это требуется на первом экране, но этим способом можно наложить оверлей на любое изображение на сайте.

Пример использования

        <header class="header">
          <h1 class="header__title">Good evening, Clarice.</h1>
        </header>
    
        .header {
          background: #999999
            url("background.svg")
            no-repeat center / cover;
        }
    
        .header__title {
          color: #ffffff;
          font-size: 82px;
          text-transform: uppercase;
          text-align: center;
        }
    

Пример использования

Чтобы цвет картинки был не таким ярким и текст лучше читался наложим поверх всего header полупрозрачную заливку чёрного цвета.

        .header {
          position: relative; /* Добавляем позиционирование родителю */
          z-index: 0; /* Указываем порядок наложения */
        }
    
        .header:before {
          content: ""; /* Обязательное свойство для псевдоэлементов ::before/::after */
          display: block;
          position: absolute; /* Позиционируем относительно родителя */
          top: 0;
          left: 0;
          /* Растягиваем на всю ширину и высоту */
          width: 100%;
          height: 100%;
          background-color: rgba(0 0 0 / 0.7); /* Задаём полупрозрачный чёрный фон */
          z-index: -1; /* Убираем под текст */
        }
    

::before / ::after

Два самых часто встречающихся псевдоэлемента. Они очень похожи между собой. Единственная разница заключается в том, что ::before располагается по-умолчанию перед элементом, для которого задаётся. А ::after в свою очередь располагается после элемента, для которого создаётся.

Для обоих элементов обязательным является свойство content. С его помощью можно вставить какое-нибудь слово до или после текста.

::before / ::after

HTML:
        <span class="username">Гордон</span>
         
    
CSS:
        .username::before {
          content: "Привет, ";
        }
        
        .username::after {
          content: ", ты отлично выглядишь!";
        }
    

::before / ::after

::before / ::after

Эта пара псевдоэлементов по-умолчанию являются строчными. Но это легко изменить при помощи стилей.

        .username {
          display: inline-block; /* Чтобы линия была по ширине текста */
        }
         
        .username::before {
          content: "Привет, ";
        }
    

::before / ::after

Эта пара псевдоэлементов по-умолчанию являются строчными. Но это легко изменить при помощи стилей.

        .username::after {
          content: "";
          display: block;  /* Делаем псевдоэлемент блочным */
          width: 100%;
          height: 2px;
          background-color: #F498AD;
        }
    

::before / ::after

::first-letter

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

        <p class="text">
          В траве, около высоких муравейников...
        </p>
    

::first-letter

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

        .text::first-letter {
          font-size: 52px;/* Увеличиваем размер первой буквы */
          color: #ed4242;/* и красим её в красный цвет */
        }
    

::first-letter

::first-line

Этот псевдоэлемент выбирает первую строку текста. Обрати внимание, что он сработает только для блочных элементов. Со строчными этот трюк не пройдёт.

        <p class="text">
          В далекой и бледной глубине неба...
        </p>
    

::first-line

Этот псевдоэлемент выбирает первую строку текста. Обрати внимание, что он сработает только для блочных элементов. Со строчными этот трюк не пройдёт.

        .text::first-line {
          /* Красим первую строку в красный */
          background-color: #ed4242;
        }
    

::first-line

::selection

С помощью псевдоэлемента ::selection можно управлять стилем текста, который пользователь выделяет при помощи мыши.

Интерактивный пример:

Взгляните на этот текст. На первый взгляд ничего необычного. Но попробуйте его выделить! Выделение отличается от стандартного.

::selection

Целесообразнее всего задавать этот псевдоэлемент не какому-то отдельному блоку, а всей странице целиком.

        ::selection {
          background-color: #ed4242;
        }
    

::placeholder

Этот псевдоэлемент позволяет стилизовать текст, выводимый в поле ввода текста (input) в виде подсказки.

Текст подсказки задаётся при помощи атрибута placeholder у тега input.

        <input type="email" placeholder="test@example.com" />
        
    

::placeholder

По-умолчанию цвет текста подсказки серый. Но иногда по дизайну требуется другой цвет.

::placeholder

        input::placeholder {
          color: #70a0ff;
        }
    

Общие советы по использованию 

Все презентации
на GitHub Pages