CSS中calc(100%-100px)为什么不加空格会不生效?

简介: 笔记

问题起因

今天再使用calc时发现无法生效,我的写法是:

 width: calc(100%-100px);

页面无效果,加空格后就发现有效果了:

width: calc(100% - 100px);

有亿点疑惑,这是为什么?

calc是什么?

css3的 计算属性,用于动态计算长度值。calc语法:

calc(expression)//expression是数学表达式

用法&定义

  • 运算符前后都需要保留一个空格,例如:width: calc(100% - 100px)
  • 任何长度值都可以使用calc()函数进行计算;
  • calc()函数支持 "+", "-", "*", "/" 运算;
  • calc()函数使用标准的数学运算优先级规则;

先了解一下CSS中基础语法和数据类型:

文档链接》》

在文档的这里应该是这里的核心语法:40.png

stylesheet  : [ CDO | CDC | S | statement ]*;
statement   : ruleset | at-rule;
at-rule     : ATKEYWORD S* any* [ block | ';' S* ];
block       : '{' S* [ any | block | ATKEYWORD S* | ';' S* ]* '}' S*;
ruleset     : selector? '{' S* declaration? [ ';' S* declaration? ]* '}' S*;
selector    : any+;
declaration : property S* ':' S* value;
property    : IDENT;
value       : [ any | block | ATKEYWORD S* ]+;
any         : [ IDENT | NUMBER | PERCENTAGE | DIMENSION | STRING
              | DELIM | URI | HASH | UNICODE-RANGE | INCLUDES
              | DASHMATCH | ':' | FUNCTION S* [any|unused]* ')'
              | '(' S* [any|unused]* ')' | '[' S* [any|unused]* ']'
              ] S*;
unused      : block | ATKEYWORD S* | ';' S* | CDO S* | CDC S*;

DIMENSION语法在最上面:

DIMENSION    {num}{ident}

num应该是数字,翻一下ident的定义:

在4.1.1第二段的开头

41.png

ident    [-]?{nmstart}{nmchar}*

nmstart和nmchar的分别有:

nmstart [_a-z]|{nonascii}|{escape}
nmchar [_a-z0-9-]|{nonascii}|{escape}

所以在编译calc(100%-100px)时会产生歧义,在解析器看来应该是:100 和 %-100px,会将%-100px认为是单位,但是无该单位的定义,所以这段就无法解析。所以使用空格隔开。但是感觉这个是可以理解的,因为在数学标识符当中还有正号和负号这两个元素。如果纯单位方式来判断的话,理应calc(100%+100px)、calc(100% +100px)或者calc(100% -100px)也生效,但是实际无法生效。为什么非得要都用空格?所以感觉这里需要引用正负号这个概念。就像margin和padding中会常常用到负数。就像用calc(100% -100px)为例,将其解析为100%和-100px,使用什么运算符号进行运算?

目录
相关文章
|
6天前
|
编解码 前端开发 UED
解密CSS单位:px、em、vh的区别与应用
解密CSS单位:px、em、vh的区别与应用
54 0
|
6天前
|
编解码 前端开发 小程序
CSS中rpx、px、em、rem、%、vh、vw各自都代表什么
CSS中rpx、px、em、rem、%、vh、vw各自都代表什么
48 0
|
6天前
|
前端开发
css中px和em的区别
css中px和em的区别
|
6天前
|
编解码 前端开发
CSS 的数值与单位px\em\%
CSS 的数值与单位px\em\%
|
6天前
|
编解码 前端开发
CSS中单位:【px和%】【em和rem】【vw|vh|vmin|vmax】的区别
CSS中单位:【px和%】【em和rem】【vw|vh|vmin|vmax】的区别
|
6月前
|
编解码 前端开发
css中单位px、pt、em和rem的区别
css中单位px、pt、em和rem的区别
|
7月前
|
Web App开发 编解码 前端开发
|
9月前
CSS3 px、em、rem 的使用与区别
CSS3 px、em、rem 的使用与区别
40 0
|
前端开发
CSS——0.5px像素以及0.1像素实现
0.5px像素以及0.1像素实现
91 0
|
前端开发
css:移动端实现1px、0.5px的细线
css:移动端实现1px、0.5px的细线
100 0
css:移动端实现1px、0.5px的细线