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中基础语法和数据类型:
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第二段的开头

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,使用什么运算符号进行运算?
CSS中calc(100%-100px)为什么不加空格会不生效?的更多相关文章
- CSS 中 calc() 函数用法
CSS calc() 函数 calc() 函数用于动态计算长度值. 注意,运算符前后都需要保留一个空格,例如:width: calc(100% - 10px): 任何长度值都可以使用calc()函数进 ...
- css中calc()的使用
calc()是css3中新出现的特性,可以用于动态计算,非常方便. 首先是兼容性 再来看看怎么使用 html{ font-size: 20px; } div{ width: calc(50% - 1p ...
- css 中calc无效属性值问题
width:calc(50%-20px); 这样书写是无效的因为calc中计算的两个因子同运算符号之间必须存在空格:
- css 中两个class之间没有空格与有空格有什么区别
第一个匹配: <div class="ul item"></div>:无法匹配:<div class="ul"></d ...
- css中的那些布局
因为最近心血来潮,就总结了一下css中的几种常见的多列布局. 两列自适应布局 两列自适应布局算是css布局里面最基础的一种布局了,不少网站在使用. 这种布局通常是左侧固定,右边自适应,当然也有反过来的 ...
- css函数——calc()和attr()
css也有函数?好吧,我孤陋寡闻了.这里记录一下学习情况. calc()函数 定义:用于动态计算长度值 支持版本:css3 运算符前后都需要保留一个空格,例如:width: calc(100% - 1 ...
- 使用css3中calc()进行自适应布局
calc()能做什么? calc()可以通过计算得到元素的宽度或者高度,让我们很容易进行自适应布局. 你可以为一个div元素,使用百分比.em.px和rem单位值计算出其宽度或者高度,比如说“widt ...
- 浅谈CSS中的百分比
结论: 标准流中的元素,看其属性有没有继承性.对于width和margin-left,它是可以继承的,它会参照父元素或者祖先元素(其实是包含块):对于height,它没有继承性,父元素或者祖先元素会自 ...
- 为什么CSS中的calc函数可能会不生效?
前言 在早期如果想要对某一些样式进行动态计算,绝大多数的做法都是使用JavaScript来进行,当时的CSS在面对这种场景显得有点无能为力.但是,当CSS3中新增了calc函数时,面对这种场景,Jav ...
- 理解CSS中的数学表达式calc()
前面的话 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路.本文将介绍calc()的相关内容 定义 数学表达式calc()是calculat ...
随机推荐
- Axios 简单使用
axios({ method: "post", headers: { "Content-Type": "application/json" ...
- Oracle中字符型级处理方法
字符型简介 固定长度字符串-char(n) n代表字符串的长度,当实际长度不足时,利用空格在右端补齐,n的最大值不能大于2000.所以只要是固定长度的字符串,他的length(值)的长度总为n var ...
- java面向对象(this、static)
this关键字 表示类中的属性和方法 调用本类中的构造方法 表示当前对象. 代码 public class text01_1 { public static void main(String[] ar ...
- 前端开发系列072-JQuery篇之框架Ajax模块
一.jQuery框架中的Ajax简介 Ajax技术的核心是XMLHTTPRequest对象,该对象是Ajax实现的关键,发送异步请求.接收服务器端的响应以及执行回调等操作都是通过XMLHTTPRequ ...
- HK 笔试面试
考到了很多的 网络技术工程师的题目 几门没写出来 还考了一道题 pread 我不清楚 什么 意思 考了 链表的删除 会一点点 考了buff的读取 会一点点 不是基于 宏定义的 内核
- dotnetty 内存泄漏的BUG修复了
一.前言 当你做的产品内存不稳定,CPU不稳定,内存在600MB-3G之内波动,cpu 在30%左右,就算你对外宣传支持可以十万设备,也不会有人相信,如果你做的产品直播推流内存一直稳定在60MB左右, ...
- GPT-SoVITS初探
1 简介 GPT-SoVITS是一种语音合成模型,于2024年2月18日发布,它基于深度学习的语音合成框架,通过整合GPT(Generative Pre-trained Transformer)的自然 ...
- [J组模拟赛 #002 T4]分组选数
分组选数 题目大意: 给 \(n\) 个数,第 \(i\) 个数是 \(a_i\),属于第 \(b_i\) 个集合中.对于每个集合,若从中选出若干个数,则价值为这些数的异或和,总共的价值就是所有集合的 ...
- C# 蓝牙开发你必须知道
无线,无网络环境上位机与下位机连接方式比较常见的就是蓝牙与串口,这里记录回顾一下这段时间蓝牙开发方面的记录. 蓝牙分为BLE蓝牙与经典蓝牙,两者主频都是2.4GHz,传输距离,范围,吞吐量可以自己 ...
- sass map !default 属性覆盖
定义一个 map: $postMeaage: ( categoriesBackground: #ff6b6b, tagsBackground: #ff6b6b #fbc531 #22a6b3 #10a ...