Почему я должен указать идентификатор единицы (например, 'px'), передавая 0 в качестве единственного аргумента функции calc()?
CSS-значения и единицы измерения уровня 3:
... для нулевой длины идентификатор блока является необязательным (т.е. может быть синтаксически представлен как <number>
'0).
Вот почему большинство из нас бросает идентификатор устройства при работе с 0s, так как 0px
, 0em
, 0%
и т.д. все оцениваются с одинаковой длиной.
В той же документации также указано, что функция calc()
:
... можно использовать везде, где допускаются значения <length>
, <frequency>
, <angle>
, <time>
, <number>
или <integer>
. Компоненты выражения calc()
могут быть буквальными значениями, выражениями attr()
или calc()
или <percentage>
значениями, которые разрешают один из предыдущих типов.
Проблема заключается в том, что последние версии Chrome, Firefox, Opera и Internet Explorer рассматривают calc(0)
как недопустимое выражение. 0
здесь - это значение, которое разрешает тип <number>
(как нам известно из первого фрагмента, который я цитировал в этом сообщении).
Если мы попытаемся проверить width: calc(0)
на W3C собственный CSS Validator, мы получаем следующую ошибку:
Значение Ошибка: ширина calc(0)
не является значением ширины: calc(0)
Однако, если мы попробуем и проверим width: 1
, вместо этого получим следующую ошибку, которая, как представляется, противоречит этой ошибке:
Значение Ошибка: только ширина 0
может быть длиной. Вы должны положить блок после своего номера: 1
Пример
В этом примере красная рамка 1px
применяется к каждому элементу code
. В попытке переопределить ширину границы первая имеет calc(0)
, заданную как ширина границы, а последняя имеет calc(0px)
.
code {
display: inline-block;
padding: 2px;
border: 1px solid red;
}
code:first-of-type {
border-width: calc(0);
}
code:last-of-type {
border-width: calc(0px);
}
<code>border-width: calc(0);</code>
<code>border-width: calc(0px);</code>
Ответы
Ответ 1
В основном, что @Dave и @BoltClock говорят:
В разделе 8.1.2 этой спецификации говорится, что разрешенный тип математического выражения calc(0)
определяется типами содержащихся в нем значений, которые для токена NUMBER, такого как 0
, являются числом <number> или < lt; целое число > . Ни один из этих типов не является действительным как значение width
, которое принимает длину & lt; length > или <percent> , поэтому выражение недействительно.
Но если вы используете 0
в качестве значения, его можно проанализировать как длину & lt; длина в разделе 5 спецификации, которую вы указали.
calc(0)
не является синтаксически (или лексически, как мы видим) эквивалентным 0
, поэтому раздел 5 к нему не применяется.
Или вы задавали философский вопрос о том, почему спецификация была написана так?