Два класса в: not (), похоже, не работают в Safari, но работают в Firefox и Chrome - PullRequest
0 голосов
/ 02 апреля 2020

Я использую этот фрагмент, и он работает в Firefox и Chrome, но не в Safari. Почему?

.column:not(.custom.no-edit)

Если я изменяю это на это, оно кажется работающим, но это не дает того же эффекта, не так ли? Если я правильно думаю, первый из них даст true, если оба класса присутствуют, а второй даст true, если какой-либо из классов присутствует?

.column:not(.custom):not(.no-edit)

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Рассмотрим следующий HTML фрагмент:

<div class="column"></div>
<div class="column custom"></div>
<div class="column no-edit"></div>
<div class="column custom no-edit"></div>

Селектор

.column:not(.custom.no-edit)

- это синтаксис 4 уровня, который соответствует .column элементам, которые не и"custom" и "no-edit" в их атрибутах class. Это означает, что .column элементы, которые имеют один или другой, будут совпадать. Все первые три элемента во фрагменте будут совпадать - только четвертый не будет.

В реализациях уровня 3 синтаксис считается недействительным и игнорируется, в результате чего none элементов во фрагменте, соответствующем селектору.

Эквивалент уровня 3, понятный Firefox и Chrome, равен

.column:not(.custom), .column:not(.no-edit)

Селектор

.column:not(.custom):not(.no-edit)

это синтаксис уровня 3, который соответствует .column элементам, которые не имеют или"custom" или "no-edit" в своих атрибутах class. Только первый элемент во фрагменте будет соответствовать этому селектору. Эквивалент уровня 4:

.column:not(.custom, .no-edit)

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

См. Также:

1 голос
/ 03 апреля 2020

Вы уверены, что .column:not(.custom.no-edit) работал в chrome и FF, но не в сафари?

Это синтаксис CSS уровня 4. Однако известно, что Safari его поддерживает.

Давайте посмотрим на спец. c.


CSS уровень 3

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

A простой селектор является либо селектором типа , универсальный селектор , селектор атрибута, селектор класса , селектор идентификатора или псевдокласс .

Что-то, что не упомянуто в спецификации c , : не () does not принять составные селекторы

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

В основном цепочки классов и типов et c .., Пример:

.class1.class2.class3
#myId.MyClass
div.MyClass#yourId

CSS уровень 4

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

На CSS уровне 4 он станет свободным для всех.


Является div:not(.a):not(.b) равным div:not(.a.b)

div {
  display: inline-block;
  width: 80px;
  height: 80px;
  border: 4px solid black;
}

div:not(.a.b) {
  background-color: green;
}
<h3>div { ... }: select all divs</h3>
<h3>.a.b { ... }: select all elements with both classes .a and.b </h3>

<h3>If we combine the two using :not() The first two boxes should be green</h3>


<div class="a"></div>
<div class="b"></div>
<div class="a b"></div>

Если вышеуказанный селектор сработал, он выберет все, кроме тех элементов, которые имеют оба класса a и b

Какие означает, что он не эквивалентен div:not(.a):not(.b), поскольку при этом игнорируются все элементы, имеющие оба класса или один, и мы хотим игнорировать только элементы, имеющие оба.


Solution

Мы можем использовать селекторы атрибутов до тех пор, пока css уровень 4 не упадет, если вы не против немного заботы.

div:not([class^="a b"])

Это выберет все элементы div, кроме тех, что которые начинаются с обоих классов a и b, к элементу могут быть применены другие классы, поэтому стилизация будет нормальной.

Для того, чтобы это работало, вашим классам всегда должна предшествовать строка a b То же самое касается и противоположного селектора [attr$=value]

div {
  display: inline-block;
  width: 80px;
  height: 80px;
  border: 4px solid black;
}

div:not([class^="a b"]) {
  background-color: green;
}
<div class="a"></div>
<div class="b"></div>
<div class="a b some other classes"></div>

Большинство браузеров поддерживают селекторы атрибутов, поэтому поддержка не будет проблемой.

...