Странное поведение браузера с идентификатором счетчика "list-item" - PullRequest
0 голосов
/ 22 ноября 2018

TL; DR

Не называйте свой счетчик list-item


Выпуск:

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

Однако я столкнулся с неожиданным поведением, которое я не понимаю и где яхотел бы знать, почему это происходит.Вероятно, просто ошибки в браузерах ...

В следующем примере мы видим, что счетчики работают должным образом:

ol {
  list-style-type: none;
  counter-reset: list-counter;
}

ol>li {
  counter-increment: list-counter;
}

ol>li:before {
  content: counter(list-counter) '. ';
}
<ol>
  <li>n</li>
  <li>n</li>
  <li>n</li>
  <li>n</li>
</ol>

<ol>
  <li>n</li>
  <li>n</li>
  <li>n</li>
</ol>

<ol>
  <li>n</li>
  <li>n</li>
</ol>

Но при изменении идентификатора счетчика на list-item мы видим, что он ведет себя по-разному в разных браузерах:

ol {
  list-style-type: none;
  counter-reset: list-item;
}

ol>li {
  counter-increment: list-item;
}

ol>li:before {
  content: counter(list-item) '. ';
}
<ol>
  <li>n</li>
  <li>n</li>
  <li>n</li>
  <li>n</li>
</ol>

<ol>
  <li>n</li>
  <li>n</li>
  <li>n</li>
</ol>

<ol>
  <li>n</li>
  <li>n</li>
</ol>

Хотя в Chrome и Firefox он все еще работает должным образом, в Edge и Internet Explorer 11 он начинает считать с 2 и увеличивается на 2, а в Safari -считая от 0, но все еще увеличивая на 1.

Это становится еще более странным, когда, например, комментирует свойство counter-reset.Затем Safari считает правильно, но Chrome начинает считать с 2. А при комментировании правильно подсчитываются только counter-increment Chrome и IE / Edge, хотя на самом деле они должны показывать 0.

При воспроизведении в разных браузерах наблюдается странное поведениевокруг с этим, и все это только тогда, когда идентификатор list-item.

Когда я впервые столкнулся с проблемой, мое первое предположение без дальнейшего изучения было то, что это по крайней мере связано со значением свойства displaylist-item.Как говорится в MDN:

Ключевое слово list-item заставляет элемент генерировать псевдоэлемент :: marker с содержимым, указанным в его свойствах стиля списка (например, с маркером), вместе сосновной ящик указанного типа для собственного содержимого.

См .: https://developer.mozilla.org/en-US/docs/Web/CSS/display-listitem

Но так как я не смог найти дополнительную документацию по этому вопросу, мне интересно, как разные поставщики могут реализоватьпохожая ошибка, подобная этой…

Вопрос:

Есть ли что-то, что я действительно здесь скучаю?Есть ли зарезервированные слова для идентификаторов в спецификации?Что-то особенное в list-item?

В спецификации W3C я ничего не могу найти по этому поводу:

https://www.w3.org/wiki/CSS/Properties/counter-increment

https://www.w3.org/wiki/CSS/Properties/counter-reset


Дополнительная информация:

Для полноты картины здесь использованы версии:

  • Chrome 70.0.3538.110 MacOS Mojave 10.14.1
  • Chrome 70.0.3538.110 Windows 10 17134.407
  • Edge 17.17134 Windows 10 17134.407
  • Firefox 63.0.3 MacOS Mojave 10.14.1
  • Firefox 63.0.3 Windows 1017134,407
  • Internet Explorer 11.407.17134.0 Windows 10 17134.407
  • Safari 12.0.1 MacOS Mojave 10.14.1

1 Ответ

0 голосов
/ 22 ноября 2018

Габриэле Петриоли угадал.list-item - это встроенный счетчик, определенный в спецификации css-lists-3 , который описывает его следующим образом:

[...] элементы списка автоматически увеличивают значениеспециальный счетчик 'list-item'.Если свойство counter-increment вручную не задает другое значение приращения для счетчика «list-item», его необходимо увеличивать на 1 для каждого элемента списка, в то же время обычно увеличивая счетчики.(Это не влияет на значения свойств 'counter- *'.)

Этот счетчик не определен в CSS2 и поэтому является новым для css-lists-3.Но на самом деле он действительно старый - , по крайней мере, 16 лет , поскольку FPWD спецификации CSS3 все равно идет.В целом, стили CSS для списков и счетчиков получают значительные улучшения в CSS3, что означает, что утверждение «Счетчики CSS сравнительно легко понять, хорошо задокументировано и имеют хорошую поддержку браузера».может на некоторое время перестать быть истиной, когда новая спецификация будет доработана и принята;) Я не уверен, что реализации или спецификации были первыми, но, вероятно, реализация была добавлена, потому что почти никто не использовал list-item в качестве счетчика ввремя (принятие CSS2 было далеко не широко распространено в 2002 году, когда IE6 все еще был совершенно новым).

Сама функция, несмотря на то, что она была в спецификации более десяти лет, все еще находится в подвешенном состоянии и взаимодействия пока не ожидается.В любом случае, ваш совет здравый: не называйте свои счетчики list-item.Это, действительно, специальное значение ключевого слова для счетчиков, которое из-за вышеупомянутых проблем взаимодействия будет иметь неожиданные результаты при использовании в CSS автора.

Имейте в виду, что W3C Wiki не является "спецификацией W3C", дажехотя это поддерживается W3C.Спецификации - это рабочие проекты, кандидатские рекомендации, предлагаемые рекомендации и рекомендации, которые можно найти в виде TR в w3.org, или проекты редакторов в dev.w3.org или там, где соответствующая рабочая группа решает разместить свои ED.Вики-страницы свойств часто не содержат технических деталей, присутствующих в реальных спецификациях, поэтому вы пропустите многие из этих деталей, если только посмотрите на них.

...