Почему вычисляется (50% + 0) ошибка?

При тестировании некоторых новых макетов я обнаружил, что пишу в один момент

.test1 {width: calc(50% + 0);}

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

Так что же это за это выражение, что неправильно? Где ошибка?

p {border:2px solid green}
.test1 {width:calc(50% + 0);}   /* wrong! */
.test2 {width:calc(50%);}       /* OK */
.test3 {width:calc(50% + 0px);} /* also OK */
<p class="test1">test 1</p>
<p class="test2">test 2</p>
<p class="test3">test 3</p>

Ответы

Ответ 1

Это связано с Проверка типов

В + или -, убедитесь, что обе стороны имеют один и тот же тип, или что одна сторона является <number>, а другая - <integer>. Если обе стороны тот же тип, разрешение на этот тип. Если одна сторона является <number>, а другой - <integer>, разрешите <number>.

Если оператор не проходит вышеуказанные проверки, выражение инвалид.

Ваш текущий код имеет два значения, 50% - percentage, а 0 - integer/number. Он не подтверждает правила проверки типов.


Для комментария Poke:

Ссылка из Вычисленное значение

Если проценты не разрешены при вычисленном значении, это не разрешены в выражениях calc(), например. calc (100% - 100% + 1em) разрешает вычислять (0% + 1em), а не вычислять (1em). Если есть специальные правила вычисления процентов в значении (например, свойство высоты), они применяются всякий раз, когда выражение calc() содержит проценты.

Примечание. Таким образом, вычисленное значение выражения calc() может быть представленный либо как число, либо кортеж измерения, а процент.

Таким образом, можно сказать, что 50% + 10px является исключением для проверки типа и рассматривается в разделе вычисленного значения статьи.

Ответ 2

Это потому, что выражение (50% + 0) состоит из двух разных типов.

У вас может возникнуть соблазн подумать, что 50% - это процент, а 0 - целое число/число и не должен проверять правила проверки типов. Но это неверно. Не путайте его с помощью units. px, em, % - все units типа length dimension-token. Разрешены два разных units, но должны быть одного и того же type. Не допускаются два разных types.

W3C говорит об типах:

Математическое выражение имеет разрешенный тип, который является одним из <length>, <frequency>, <angle>, <time>, <number>, or <integer>. Разрешенные тип должен быть действительным для места размещения; в противном случае выражение недопустимо. Разрешенный тип выражения определяемый типами содержащихся в нем значений. <number-token> являются типа <number> or <integer>. Тип A <dimension-token> задается формулой его единица (см <length>, deg - <angle> и т.д.).

Левая часть вашего выражения: 50%, 50px, or 50em - это all units типа length, которые <dimension-token> s, а правая часть вашего выражения: 0 - это тип integer, который является <number-token>.

Как упоминалось @Manoj , операторы + или - специально ограничивают операнды одинаковыми типа, то есть либо length или time или number-token s.

Позже в приведенном выше сообщении:

В + или - убедитесь, что обе стороны имеют один и тот же тип или одна сторона - это <number>, а другая - <integer>. Если обе стороны тот же тип, разрешить этот тип....

Суммарно

50% + 0px → Both are of the same type i.e. 'length
50% + 0   → Left is 'length' type and the right is 'integer' type.

Ответ 3

50% (в процентах) и 0 (Int) - это два разных типа данных, которые похожи на то, как целое число (Int) и строка различаются, оба должны быть одного типа для выполнения вычисления.