In the CSS values spec, section 8.1.4. Range Checking:
However, the used value resulting from an expression must be clamped to the range allowed in the target context.
Note that the used value is expected to be clamped, but not the computed value. Both Blink and Firefox (at least, probably other engines too) clamp the value at computed value time, as can be seen running the following test, where all the properties that don't accept negative lengths (like font-size, padding-xxx, etc.) report a computed value of 0px instead of the expected -1px.
<!doctype html>
<script>
window.onload = function() {
let style = window.getComputedStyle(document.body);
for (prop of style) {
if (prop in document.body.style) {
document.body.style[prop] = 'calc(-1px)';
console.log(prop, "reported: ", getComputedStyle(document.body)[prop]);
}
}
}
</script>
In the CSS values spec, section 8.1.4. Range Checking:
Note that the used value is expected to be clamped, but not the computed value. Both Blink and Firefox (at least, probably other engines too) clamp the value at computed value time, as can be seen running the following test, where all the properties that don't accept negative lengths (like
font-size,padding-xxx, etc.) report a computed value of0pxinstead of the expected-1px.