Есть ли какие-либо проблемы с заменой каждого псевдокласса ‘:-moz-any()’ на ‘:is()’ в коде CSS?

#css #firefox #css-selectors #pseudo-class

#css #firefox #css-селекторах #псевдоклассе

Вопрос:

У меня есть куча селекторов CSS, которые содержат псевдокласс с префиксом поставщика Mozilla :-moz-any .

Целевая аудитория использует последнюю версию Firefox.

Поскольку :is теперь он полностью поддерживается в Firefox, я думаю, что лучше заменить все вхождения :-moz-any на :is в коде CSS.

Есть ли какие-либо проблемы с этим (например, то, что выбирается при изменении, или какие-либо изменения в специфике)?

Ответ №1:

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

Из : -moz-any () группировка селекторов, сообщение в блоге Дэвида Барона 2010 года, объясняющее новую функцию в Firefox:

:-moz-any() разрешено содержать селекторы с несколькими простыми селекторами (используя определение простых селекторов css3-selectors, а не определение CSS 2.1), но не разрешается содержать комбинаторы или псевдоэлементы. Таким образом, вы можете написать :-moz-any(p.warning.new, p.error, div#topnotice) или :-moz-any(:link, :visited).external:-moz-any(:active, :focus) , но вы не можете поместить « div p » или « div > p или» :first-letter » внутри :-moz-any() .

(Выделение жирным шрифтом и курсивом мое)

Здесь вы можете видеть, что ни с псевдоэлементами, ни с комбинаторами не работали :-moz-any() .

Однако запись спецификации W3C Selectors Level 4 is() гласит следующее:

Псевдокласс matches-any, :is() , является функциональным псевдоклассом, принимающим список селекторов в качестве своего аргумента. Он представляет элемент, который представлен его аргументом.

Если вы нажмете на ссылку список селекторов, вы увидите, что она ссылается на объяснение «списка простых / составных / сложных селекторов»:

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

Поскольку в is() разделе не указан тип списка селекторов, мы предполагаем, что это сложный список селекторов, как объясняется в приведенном выше абзаце. Этот список включает следующее, в частности:

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

(Выделение жирным шрифтом и курсивом мое)

Итак, как вы можете видеть, теперь мы должны иметь возможность использовать комбинаторы с. is() Кроме того, единственное предостережение, которое он дает, касается псевдоэлементов; в нем ничего не говорится о невозможности использования комбинаторов:

Псевдоэлементы не могут быть представлены псевдоклассом matches-any; они недопустимы внутри :is() .

Если мы проверим это, мы увидим, что Firefox в настоящее время поддерживает комбинаторы как внутри :is() , так и вне его в одном селекторе:

 :is(div, div > p) > span { 
  color: green;
}  
 <h1>is():</h1>

<div>
  <span>This should be green.</span>
</div>

<div>
  <p>
    <span>This should be green too.</span>
  </p>
</div>

<div>
    <main>
        <p>
            <span>This should not be green.</span>
        </p>
    </main>
</div>

<p>
  <span>This should not be green either.</span>
</p>  

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

* — Имейте в виду, что в настоящее время эта функция поддерживается только в Firefox. Кроме того, селекторы CSS 4-го уровня в настоящее время находятся только на стадии рабочего проекта. Вам следует подождать, пока он не станет, по крайней мере, рекомендацией кандидата или более высоким статусом, прежде чем внедрять его в рабочий код, потому что содержимое в рабочем проекте может быть изменено без предварительного уведомления (как вы можете видеть из того факта, что is() раньше вызывался matches() .