CSS中calc(100%-100px)不加空格不生效


Posted in HTML / CSS onMay 07, 2023

问题起因

在使用calc时发现无法生效,写法是:

width: calc(100%-100px);

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

width: calc(100% - 100px);

这是为什么?

calc是什么?

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

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

用法&定义

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

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

https://www.w3.org/TR/CSS2/syndata.html

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

CSS中calc(100%-100px)不加空格不生效

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第二段的开头

CSS中calc(100%-100px)不加空格不生效

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

nmstart和nmchar的分别有:

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

解析calc(100%-100px)

手动解析一下calc(100%-100px)。先过DIMENSION语法,{num}{ident}将其分割为num:100、ident:%-100px

为什么是%-100px

其实,应该是%-100px,两个被作为单位解析。因为-100px符合nmchar语法,没有将其拆分。如果-100px有个空格,就会拆分为-100以及px。但是这个例子,只能较好的解释为什么在-后面加空格。为什么前面也要加空格?

引出新的例子

在此,引出一个新的例子:

width: calc(100px-100px);

在编译时时,会将其直接拆分为100px-100px,将px-100px过nmchar完全符合\[\_a-z0-9-\]。将其保留作为单位解析。但是px-100px不属于CSS中任何一个单位,也并无单位的定义。
(这个案例,会更加好的解释,为什么-的前后都需要加空格。)
如果-的前后有空格,就会被拆分为100px(数字100和单位px)、-100px(数字100和单位px)来解析。

源码为什么怎么写?

为什么要把-放在里面?写成calc(100% -100px)或者calc(100px -100px)为什么不行?
在这里,要引入一个正负数的概念,因为在数学标识符当中还有正号和负号这两个标识符。光看calc(100% -100px)calc(100px -100px)的后半部分,-100px是不是更像是这里为-100px。因为在CSS中是有负数的概念的,就像margin和padding中会常常用到负数。再引出一个新的例子:

width: calc(500px - -100px);

再遇到这种情况怎么办?

如果没有对于负号的定义应该就会500px--100px,两个减号怎么编译呢。在-的前后都加上空格,区别开减法和负号。

参考资料

https://www.w3.org/TR/CSS2/syndata.html

到此这篇关于CSS中calc(100%-100px)不加空格不生效的文章就介绍到这了,更多相关CSS中calc(100%-100px)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
CSS3弹性伸缩布局之box布局
Jul 12 HTML / CSS
分享CSS3中必须要知道的10个顶级命令
Apr 26 HTML / CSS
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
Apr 26 HTML / CSS
轻松掌握CSS3中的字体大小单位rem的使用方法
May 24 HTML / CSS
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
Sep 15 HTML / CSS
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
Jan 09 HTML / CSS
HTML5的一个显示电池状态的API简介
Jun 18 HTML / CSS
HTML5 HTMLCollection和NodeList的区别详解
Apr 29 HTML / CSS
html5启动原生APP总结
Jul 03 HTML / CSS
css3实现的加载动画效果
Apr 07 HTML / CSS
Html5通过数据流方式播放视频的实现
Apr 27 HTML / CSS
CSS实现切角+边框+投影+内容背景色渐变效果
Nov 01 HTML / CSS
HTML中link标签属性的具体用法
May 07 #HTML / CSS
css弧边选项卡的项目实践
May 07 #HTML / CSS
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
May 07 #HTML / CSS
CSS实现鼠标悬浮动画特效
CSS link与@import的区别和用法解析
May 07 #HTML / CSS
html,css,javascript是怎样变成页面的
May 07 #HTML / CSS
html原生table实现合并单元格以及合并表头的示例代码
May 07 #HTML / CSS
You might like
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
社区学习十八大感想
2014/01/22 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
黄金酒广告词
2014/03/21 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python