Вот уже почти месяц, как псевдокласс :has()
– больше, чем «родительский селектор» — можно «пощупать» в браузере. Можно подвести первые итоги эксперимента: всё не так страшно, как думали, но не так легко, как хотелось бы.
Сложнее всего оказалось обрабатывать вложенные в :has()
другие функциональные псевдоклассы — :is()
, :where()
, :not()
и сам :has()
. И Антти Койвисто — ведущий разработчик реализации :has()
в WebKit, который и нашел способ добиться приемлемого быстродействия для него — обратился к Рабочей группе CSS с предложением запретить такие комбинации.
Идея вызвала было недовольство, но Джен Симмонс объяснила, что реализовать :has()
совсем без ограничений едва ли возможно, и сейчас задача — выяснить, какими редкими применениями можно пожертвовать, чтобы поскорее сделать его доступным для более важных случаев. В итоге в WebKit запретили вкладывать :has()
друг в друга, но разрешили остальные псевдоклассы: быстродействие таких комбинаций «не оптимально, но с этим можно жить». Код WebKit уже подправили (но спецификацию — пока нет).
На мой взгляд, это отличный компромисс. Если это ограничение поможет быстрее внедрить :has()
в браузеры, есть шанс, что с него снимут пометку «необязательный», и его повсеместная поддержка гораздо важнее экзотических случаев. Согласны?