English version

Синтаксис правил BlockIt

Версия синтаксиса 1

Правила BlockIt расширяют CSS-селекторы условиями, которые невозможно или неудобно надёжно выразить обычным CSS. Правило остаётся похожим на селектор: сначала указывается CSS-часть, затем псевдоклассы BlockIt.

div.card:attr-count(=2):has(> span:own-text("Реклама"))

Основа CSS

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

div.notice
#banner
section[data-kind="ad"]
main > section
.anchor + .target
.anchor ~ .target
article, aside

Можно использовать нативные псевдоклассы CSS, которые поддерживает браузер. Расширения BlockIt могут находиться внутри :has(), :is(), :where() и :not().

Значения и регулярные выражения

Текстовые значения заключаются в двойные кавычки, например :text("Реклама"). Чтобы записать двойную кавычку или обратную косую черту внутри значения, поставьте перед ней обратную косую черту: \" или \\. Псевдоклассы для шаблонов принимают регулярные выражения JavaScript, например /^data-[a-z]+$/i. Нумерация позиций и результатов начинается с единицы.

Атрибуты и классы

СинтаксисЗначение
:attr-count(=3)Ровно три атрибута. Операторы: =, <, <=, >, >=. :attribute-count() — синоним.
:class-count(>=2)Количество отдельных классов.
:attr-name(/^data-/)Имя хотя бы одного атрибута соответствует регулярному выражению.
:attr(/^data-/, /^ad-/)Имя и значение одного атрибута соответствуют двум выражениям.
[data-*]Существует атрибут, имя которого начинается с data-. После шаблона имени можно указать условие для значения атрибута.
:class-name(/^card-/)Хотя бы один класс соответствует выражению.
:attrs(["id", /^data-/])Существуют все перечисленные точные имена или шаблоны имён.
:style-property("--adaptive-width")В inline-атрибуте style существует указанное CSS-свойство; значение игнорируется.

Текст и HTML

СинтаксисЗначение
:text("Реклама")Точное совпадение нормализованного текста элемента и потомков.
:own-text("Реклама")Точное совпадение только собственного текста.
:text-starts(), :text-ends(), :text-contains(), :text-matches()Начало, конец, подстрока или регулярное выражение для всего текста.
:own-text-starts(), :own-text-ends(), :own-text-contains(), :own-text-matches()Те же режимы только для собственных текстовых узлов.
:html(/шаблон/)Сериализованный HTML элемента соответствует выражению.

Структура и связи

СинтаксисЗначение
:has(селектор)Есть подходящий потомок или элемент относительного селектора.
:within(селектор)Есть подходящий предок; возможен переход через host Shadow DOM.
:near(селектор)Есть подходящий sibling в любом направлении и на любом расстоянии.
:sibling-distance(previous, 2, селектор)Второй предыдущий sibling соответствует селектору.
:sibling-distance(next, 3, селектор)Третий следующий sibling соответствует селектору.
:children(селектор, >=2)Количество подходящих непосредственных детей удовлетворяет условию.
:sibling-position(2)Элемент является вторым ребёнком родителя.
:matches-position(2)Из всех элементов, найденных полным правилом, блокировать только второй. Несколько номеров разделяются запятыми или пробелами.

Условия живой страницы и доступности

СинтаксисЗначение
:visible(...)Проверяет видимость на живой странице.
:size(...)Проверяет отображаемый размер.
:style(...)Проверяет вычисленный стиль.
:property(...)Проверяет JavaScript-свойство DOM.
:accessible(...)Проверяет признаки доступности.

Эти условия зависят от состояния браузера и могут быть недоступны при поиске по сохранённому DOM-снимку.

Iframe и Shadow DOM

СинтаксисЗначение
:in-frame(...)Ограничивает поиск содержимым iframe.
:in-shadow(...)Ограничивает поиск Shadow DOM.
:frame-has(селектор)Документ iframe содержит совпадение.
:has-frame(...)Элемент содержит iframe, удовлетворяющий условию.

Для cross-origin iframe и закрытых Shadow Root действуют ограничения браузера и разрешений расширения.

Примеры правил

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

Обычные CSS-селекторы

ПравилоЧто найдёт
article.card[data-type="advertisement"]Элементы <article>, у которых есть класс card и атрибут data-type с точным значением advertisement. Другие классы и атрибуты не мешают совпадению.
main > aside.promo, section[data-kind="sponsor"]Либо непосредственные дочерние <aside class="promo"> внутри <main>, либо любые <section> с указанным атрибутом.

Атрибуты и классы

ПравилоЧто найдёт
[data-*]Элементы с любым атрибутом, имя которого начинается с data-, например <div data-zone="sidebar">. Значение атрибута может быть любым.
[data-*="advert"]Элементы, у которых хотя бы один атрибут data-* имеет точное значение advert, например <aside data-kind="advert">.
[data-*^="ad-"]Элементы, у которых значение хотя бы одного атрибута data-* начинается с ad-, например <div data-slot="ad-top">.
[data-*$="-banner"]Элементы, у которых значение хотя бы одного атрибута data-* заканчивается на -banner, например <section data-kind="top-banner">.
[data-**="advert"]Элементы, у которых значение хотя бы одного атрибута data-* содержит строку advert, например <div data-label="sidebar advertisement">.
div:attr-count(=3):class-count(>=2)Элементы <div> ровно с тремя атрибутами и как минимум с двумя отдельными классами.
section:attrs(["id", /^data-/])Элементы <section>, у которых одновременно есть атрибут id и хотя бы один атрибут с именем, начинающимся с data-.
div:attr(/^data-/, /^ad-/)Элементы <div>, у которых один и тот же атрибут имеет имя, начинающееся с data-, и значение, начинающееся с ad-.

Текст и HTML

ПравилоЧто найдёт
button:own-text("Закрыть")Кнопки, собственный текст которых после нормализации точно равен слову «Закрыть». Текст вложенных элементов не учитывается.
div.notice:text-contains("Отключите блокировщик")Элементы <div class="notice">, в полном тексте которых, включая потомков, встречается указанная фраза.
article:html(/data-slot="ad-[^"]+"/i)Элементы <article>, в сериализованном HTML которых есть атрибут data-slot со значением, начинающимся с ad-. Регистр не учитывается.

Структура, связи и позиции

ПравилоЧто найдёт
section:has(> div:attr-count(=2) > span:own-text("Реклама"))Элементы <section> с непосредственным дочерним <div> ровно с двумя атрибутами, внутри которого находится непосредственный <span> с собственным текстом «Реклама».
div.card:within(main.content):near(div.promo)Элементы <div class="card">, расположенные внутри <main class="content"> и имеющие сиблинга <div class="promo">.
div.target:sibling-distance(previous, 2, div.new-menu)Элементы <div class="target">, у которых второй предыдущий сиблинг соответствует div.new-menu.
ul:children(li, >=3)Списки <ul>, содержащие не менее трёх непосредственных дочерних элементов <li>.
article.card:matches-position(2, 4)Второй и четвёртый элементы среди всех результатов, найденных правилом article.card.

Состояние страницы и доступность

ПравилоЧто найдёт
button:visible():accessible(role="button", name=/закрыть/i)Видимые кнопки с ролью button, доступное имя которых содержит слово «закрыть» без учёта регистра.
div.banner:size(width>=300, height<250):style(display, "block")Элементы <div class="banner"> шириной не менее 300 пикселей, высотой менее 250 пикселей и с вычисленным значением display: block.
div:style-property("--adaptive-width")Элементы <div>, в inline-атрибуте style которых объявлено CSS-свойство --adaptive-width; его значение может быть любым.
input:property(disabled, "false")Элементы <input>, JavaScript-свойство disabled которых имеет строковое представление false.

Iframe и Shadow DOM

ПравилоЧто найдёт
*:in-frame(/docs\.example\.com/)Элементы внутри iframe, адрес которого соответствует указанному регулярному выражению.
button:in-shadow(video-player)Кнопки внутри Shadow DOM, хост которого соответствует селектору video-player.
iframe:frame-has(button:own-text("Закрыть"))Элементы <iframe>, документ которых содержит кнопку с собственным текстом «Закрыть».
div.viewer:has-frame(> iframe, button:own-text("Закрыть"))Элементы <div class="viewer"> с непосредственным дочерним iframe, внутри которого есть кнопка с собственным текстом «Закрыть».

Совместимость

Сохранённые правила продолжат работать после обновлений BlockIt. Новые возможности могут добавляться без изменения смысла существующих конструкций.