11

Использование CSS-селектора :has() на примерах

Как вы знаете в CSS существует псевдокласса :has(). С его помощью можно изменить родительский элемент, содержащий определённый дочерний элемент либо элемент, следующий за ним. Пока ничего непонятно, да? Давай посмотрим на практике


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


Как использовать CSS-селектор :has()?


Рассмотрим следующий HTML-код с двумя родственными элементами с классом everybody. Как бы вы выбрали тот, у которого есть потомок с классом a-good-time?

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

С CSS-селектором :has() это можно реализовать следующим образом:

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

Это выбирает первый экземпляр .everybody и применяет к нему animation. В этом примере целью является элемент с классом everybody. Условием является наличие потомка с классом a-good-time.

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

Но :has() гораздо больше возможностей. Вот некоторые из них.

Выбрать anchor, которые не имеют прямого потомка SVG:

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

Выбрать label, у которых есть родственный input:

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

Выбрать documentElement, в котором некое состояние присутствует в DOM:

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

И так далее.



Совместимость :has() с браузерами


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

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

CSS-селектор :has() на практике


Это реализация без единой строчки на JavaScript. Для начала можете посмотреть и самостоятельно протестировать пример, который реализован в CodePen:

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

Теперь рассмотрим его подробнее. Итак, CSS-псевдокласс :hover срабатывает, когда пользователь наводит на элемент мышью, но при этом активировать его необязательно.


Красивая плавность в примере заключается в создании набора кастомных свойств на основе сглаживающей кривой (easing curve). В нашем случае это:

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

Затем, чтобы применить это, нам нужны правила, которые обновляют пользовательское свойство --lerp для :hover или :focus для каждого элемента или блока. Код ниже предназначен для выбора пяти блоков с комбинацией родственных комбинаторов (+) и :has().

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

Последнее, что нужно сделать, это применить всё к самим блокам. Поскольку блоки выложены с помощью flexbox, можно использовать значение --lerp, чтобы изменить flex каждого блока, и translation для каждого элемента:

Использование CSS-селектора :has() на примерах Программирование, IT, CSS, Frontend, Web-программирование, Веб-разработка, Гифка, Длиннопост

А вот сами значения --lerp сгенерированы с помощью утилиты GSAP для распределения значений с помощью сглаживающей кривой.

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

526 постов5.8K подписчиков

Правила сообщества

1. Не оскорблять других пользователей

2. Не пытаться продвигать свои услуги под видом тематических постов

3. Не заниматься рекламой

4. Никакой табличной верстки

5. Тег сообщества(не обязателен) pikaweb