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 border-radius属性详解
Jul 05 HTML / CSS
需要知道的CSS3动画技术
Jan 01 HTML / CSS
css3 按钮样式简单可扩展创建
Mar 18 HTML / CSS
纯css3实现的竖形无限级导航
Dec 10 HTML / CSS
CSS3打造磨砂玻璃背景效果
Sep 28 HTML / CSS
CSS3点击按钮实现背景渐变动画效果
Oct 19 HTML / CSS
css3中less实现文字长阴影(long shadow)
Apr 24 HTML / CSS
HTML5实现视频直播功能思路详解
Nov 16 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
Jul 16 HTML / CSS
Html5新标签解释及用法
Feb 17 HTML / CSS
HTML5 canvas基本绘图之图形组合
Jun 27 HTML / CSS
localStorage的过期时间设置的方法详解
Nov 26 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
其他功能
2006/10/09 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
javascript 变量作用域 代码分析
2009/06/26 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
python list中append()与extend()用法分享
2013/03/24 Python
python字符串常用方法
2018/06/14 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
幼儿园教研活动方案
2014/01/19 职场文书
个人自我评价范文
2014/02/05 职场文书