Псевдокласс :target позволяет применять CSS к элементу, на который указывает фрагмент URL — часть адреса после символа #.

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

В этой статье разберём :target от простого примера до таких CSS-only компонентов.

Здесь мы разберем такие примеры:

Что такое псевдокласс :target

:target - это особый псевдокласс, который применяется для стилизации ссылок наряду с :hover, :visited, :active. Однако последние описывают, как правило, внешний вид ссылок при изменении их состояния - при наведении, посещении страницы, указанной в ссылке, или нажатии, то :target  - это связь с определенным элементом по указанному в нем id.

Предположим, на странице есть элемент <h2 id="contacts">Контакты</h2>. А также ссылка на него: <a href="#contacts">Перейти к контактам</a>. После клика на ссылке браузер добавит #contacts к URL и прокрутит страницу к элементу с таким id.

В адресной строке браузера при этом будет что-то вроде  https://example.com/about/#contacts.

В этот момент элемент <h2 id="contacts"> становится target-элементом. Именно его можно выбрать с помощью псевдокласса:

Теперь при переходе по ссылке заголовок станет красным.

Важно: :target применяется не к ссылке, по которой кликнули, а к элементу, чей id совпадает с fragment identifier в URL.

То есть:

:target и CSS-селекторы

Важно понимать, что :target можно комбинировать с другими селекторами. Например:

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

Чуть глубже:

означает, что когда .popup является target, изменить нужно состояние его дочернего элемента .popup__content.

Можно использовать и соседние элементы:

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

Интересная особенность: состояние хранится в URL

Это одна из главных особенностей :target: вы видите указанный id в составе URL страницы, тогда как JavaScript обычно хранит состояние компонента внутри программы. Например, для JavaScript  характерны такие переменные:

У :target всё иначе. Для  URL https://example.com/page/ клик на элементе с #popup приведет к изменению адреса на https://example.com/page/#popup. Это даёт несколько интересных возможностей.

  • Можно сохранить состояние, если открыть example.com/page/#tab2 и обновить страницу, fragment identifier остаётся в адресе.
  • Можно поделиться состоянием, отправив ссылку example.com/gallery/#photo3 и браузер сразу перейдёт к photo3.
  • Работает навигация браузера: переходы между fragment identifiers связаны с историей браузера, поэтому кнопки «Назад» и «Вперёд» могут менять состояние страницы и отображать разные действия пользователя.

Именно поэтому :target иногда оказывается гораздо полезнее, чем кажется на первый взгляд.

Создадим несколько разделов:

Теперь можно подсветить выбранный раздел:

Давайте протестируем:

See the Pen :target for navigation by HTML-plus (@ambassador) on CodePen.

В этом примере при переходе на #services правило применится только к <section id="services"> и т.д.

Значительно более сложный пример от Chris Bolson:

See the Pen Scrollspy using :target-current &amp; anchor-positioning by Chris Bolson (@cbolson) on CodePen.

Используем :target для показа и скрытия элементов

Еще одна интересная опция псевдокласса :target. Допустим, нужно скрыть дополнительную информацию и показать её после клика.

Показать информацию

Это дополнительная информация, которая изначально скрыта.

Закрыть

Почему вторая ссылка в примере работает на закрытие информации? Потому что она убирает конкретный fragment identifier из URL. Элемент #info перестаёт быть :target, поэтому снова применяется: #info { display: none;}

Из минусов: вы должны помнить, что href="#" приводит к тому, что страницы "прыгает" вверх, т.к. такая ссылка всегда ведет именно на ту же страницу, на которой вы находитесь. Поэтому для закрытия можно использовать href="#close-info" на элемент, которого реально нет в разметке страницы.

Получается простейший переключатель состояния без JavaScript, но слегка дерганный 🙂

Вкладки/табы на :target

На той же идее можно построить простейшие вкладки.

В этом примере мы сначала спрятали все вкладки: .tabs__content { display: none; }, а потом стали по ним переключаться.

HTML

HTML отвечает за структуру страницы.

CSS

CSS отвечает за оформление страницы.

JavaScript

JavaScript добавляет интерактивность.

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

Но есть один нюанс: при первом открытии страницы ни один элемент может не быть :target. Поэтому можно добавить вкладку по умолчанию или использовать небольшое количество дополнительного CSS/HTML /JS в зависимости от задачи.

Одно из решений - JS-код для открытия первой вкладки.

See the Pen Pure CSS3 Tabs using :target by Marek Zeman (@MarekZeman91) on CodePen.

У этого способа есть и другое интересное свойство: состояние вкладки находится в URL. Например: example.com/#tab3  можно скопировать и отправить другому человеку. Он откроет страницу сразу с третьей вкладкой.

Продвинутый пример переключения табов от Chris Bolson:

See the Pen inverted corner tabs using corner-shape + anchor-positioning + :target #cssonly by Chris Bolson (@cbolson) on CodePen.

Аккордеон на основе :target

Нам нужна простая разметка из ссылок с вопросами/заголовками и div с ответами. Например, такая простая:

CSS тоже прост:

Результат будет работать в таком виде:

See the Pen Simple accordion with :target by HTML-plus (@ambassador) on CodePen.

Однако такой аккордеон имеет важное отличие от компонентов, реализованных через JavaScript или <details>: состояние каждого открытого элемента зависит от URL.Плюс клик на новом элементе приводит к сворачиванию предыдущего. Иногда это очень здорово, иногда необходимо видеть несколько развернутых блоков. Поэтому :target не всегда является лучшим инструментом.

Еще одна реализация аккордеона от pollardld.

See the Pen CSS Accordion by pollardld (@pollardld) on CodePen.

А теперь используем ту же механику для создания настоящей галереи. Предположим, есть три изображения со ссылками на большие картинки.

Разметка примерно такова:

CSS:

Теперь клик по миниатюре <a href="#photo2"> делает <div id="photo2" class="gallery__photo"> текущим :target, после чего он становится видимым. Для того чтобы первое изображение отображалось, используем немного JavaScript для имитации клика по первой ссылке.

Тестируем:

See the Pen CSS simple image gallery :target by HTML-plus (@ambassador) on CodePen.

Можно пойти ещё дальше. Представим, что при клике на миниатюру большое изображение должно открываться поверх страницы с затемнением фона.

HTML можно изменить следующим образом:

CSS-код будет таким, что позволит нам спрятать .lightbox__item за счет display: none, заданном изначально, а потом показать его при клике в виде .lightbox__item:target с display: flex.  Само фото мы поместим в  div-контейнер с id и еще одной ссылкой для скрытия лайтбокса по примеру выше.

Теперь последовательность действий выглядит так:

Получился lightbox без JavaScript. Давайте на него посмотрим:

See the Pen CSS simple image gallery-lightbox with :target by HTML-plus (@ambassador) on CodePen.

Более сложные примеры фотогалерей:

Пример 1

See the Pen #hash nav gallery using :target-before, :target-current, :target-after &amp; anchor-positioning by Chris Bolson (@cbolson) on CodePen.

Пример 2

See the Pen Image swap using anchor-positioning by Chris Bolson (@cbolson) on CodePen.

Пример 3

See the Pen animation-timeline gallery + anchor-positioning on the thumbnails by Chris Bolson (@cbolson) on CodePen.

Ту же технику можно использовать не только для изображений, но и для простого информационного popup-окна.

HTML-разметка:

CSS:

Результат:

See the Pen CSS Modal using :target Selector by HTML-plus (@ambassador) on CodePen.

Причём URL при открытом окне будет выглядеть примерно так: example.com/page/#popup, а после нажатия на × ссылка <a href="#"> возвращает страницу в исходное состояние.

Добавляем анимацию

Сам по себе :target не умеет анимировать элементы. Он всего лишь меняет состояние, а анимацию можно поручить обычному CSS. Например, с помощью свойств animation и @keyframes:

Теперь окно не просто появляется, а плавно увеличивается.

Можно сделать и более простой эффект:

Еще один пример всплывающего окна от Homer Gaines.

See the Pen CSS Modal using :target Selector by Homer Gaines (@xirclebox) on CodePen.

Больше примеров всплывающих окон вы найдете в отдельной статье.

Примеры использования псевдокласса :target

Презентация от Envato Tuts+

See the Pen #9: Pure CSS3 “PowerPoint” Like Presentation (complete) by Envato Tuts+ (@tutsplus) on CodePen.

Открытие меню

See the Pen CSS &quot;:target&quot; Navigation by Elen (@ambassador) on CodePen.

Использование :target для запуска анимации от Guil H

See the Pen Using :target to trigger a simple animation. by Guil H (@Guilh) on CodePen.

Автор: Админ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *