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将你的设计带入下个高度
Aug 08 HTML / CSS
CSS3近阶段篇之酷炫的3D旋转透视
Apr 28 HTML / CSS
CSS3实现同时执行倾斜和旋转的动画效果
Oct 27 HTML / CSS
HTML5 Canvas概述
Aug 26 HTML / CSS
浅谈three.js中的needsUpdate的应用
Nov 12 HTML / CSS
html5使用canvas画空心圆与实心圆
Dec 15 HTML / CSS
极简的HTML5模版
Jul 09 HTML / CSS
详解如何用HTML5 Canvas API控制图片的缩放变换
Mar 22 HTML / CSS
AmazeUI 列表的实现示例
Aug 17 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
Aug 17 HTML / CSS
HTML5简单实现添加背景音乐的几种方法
May 12 HTML / CSS
CSS中理解层叠性及权重如何分配
Dec 24 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python最长公共子串算法实例
2015/03/07 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
python常用数据重复项处理方法
2019/11/22 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
Oracle的内存结构(Memory structures)
2015/06/10 面试题
学习标兵获奖感言
2014/02/20 职场文书
高中学生评语大全
2014/04/25 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
佛光寺导游词
2015/02/10 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
消夏晚会主持词
2015/06/30 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL