Why doesn't min() (or max()) work with unitless 0?
Solution 1:
You need to add a unit to 0
otherwise it's confusing for the browser to handle the comparison between a uniteless value (a <number>
) and a value with unit (a <length>
) and the top
property accept a <length>
not a <number>
top: max(0px, 120vh - 271px)
To understand this, you need to follow the specification:
The
min()
ormax()
functions contain one or more comma-separated calculations, and represent the smallest (most negative) or largest (most positive) of them, respectively.
Then for calculations:
A
calc()
function contains a single calculation which is a sequence of values interspersed with operators, and possibly grouped by parentheses (matching the<calc-sum>
grammar),
So the content of min()
/max()
is treated like the one of calc()
then from the type checking
A math function can be many possible types, such as
<length>
,<number>
, etc., depending on the calculations it contains, as defined below. It can be used anywhere a value of that type is allowed.
and
Note: Altho there are a few properties in which a bare
<number>
becomes a<length>
at used-value time (specifically, line-height and tab-size),<number>
s never become "length-like" incalc()
. They always stay as<number>
s.
You may get surprised but using top:0
is valid while top:calc(0)
is not. To make the latter valid it needs to be top:calc(0px)
. Same logic for min()
/max()
Worth to note that the same also apply to clamp()
since it's equiavalent to max(MIN, min(VAL, MAX))
Related: Why doesn't css-calc() work when using 0 inside the equation?