CSS calc() 演练场
样式所有处理都在浏览器本地完成,数据不上传服务器
写一段 `calc()`,看它算成什么、错在哪里。这个工具存在的最大理由是一条几乎所有人都会踩的坑:加减号两侧必须有空格 —— `calc(100% - 2rem)` 合法,而 `calc(100%-2rem)` 无效。后者看起来完全正常,写完也不会报错,只是整条声明被浏览器悄悄丢弃,属性回到 auto。这里会当场把它指出来。 另外两条语法要点也一并校验:乘除的一侧必须是无单位的数字(`1px * 2` 合法,`1px * 1px` 不合法);嵌套 `calc()` 是合法的(`calc(100% - calc(2rem + 4px))`)。解析器只认数字、单位、四则运算符、括号与 `var()`,其余一律报错 —— 这里没有用 `eval`。 三个量(容器宽度、字号、间距)作为自定义属性输出(`--cw` / `--fs` / `--gap`),表达式里直接写 `var(--gap)` 就行,不必每次手打数值。单位可以切成 px / rem / vw / %,换个单位看看结果怎么变。
功能
- 写 calc() 表达式,实时校验并算出结果
- ⚠️ 抓出「加减号两侧缺空格」:calc(100%-2rem) 是无效的,而它看起来正常
- ⚠️ 检查量纲:相加的两个量必须同类,乘除的一侧必须是无单位的数字
- 支持括号与嵌套 calc(),括号不配对会指出
- 容器宽度 / 字号 / 间距三个量作为自定义属性输出(--cw / --fs / --gap)
- 表达式里可以用 var() 引用这三个量
- 单位可切 px / rem / vw / %,实时看结果变化
- 校验只认数字、单位、运算符、括号与 var(),不执行任何代码(不用 eval)
- 全部在浏览器本地完成,不上传任何内容
使用方法
- 填容器宽度、字号、间距,选一个单位
- 在表达式框里写 calc(...),加减号记得两侧留空格
- 看下方的求值说明与错误提示
- 复制生成的 CSS,自定义属性与规则一起拿走
常见问题
- 为什么 calc(100%-2rem) 不生效,但它看起来没问题?
- 因为加减号两侧必须有空格。CSS 规范要求 `+` 与 `-` 作为运算符时前后各有一个空白,`calc(100%-2rem)` 因此是非法值 —— 浏览器会把整条声明丢弃,属性回到初始值或 auto。它不报错、不警告,所以最难发现。写成 `calc(100% - 2rem)` 就好了(乘除不要求空格)。
- 为什么 1px * 1px 不行?
- 因为乘法在 CSS 里会把单位相乘:`1px * 1px` 得到的是「平方像素」,而 CSS 没有这个单位。乘除的一侧必须是无单位的数字,`1px * 2` 或 `6px / 2` 才成立。这也是 `calc()` 与普通四则运算最容易混淆的地方。
- 表达式会不会被当成代码执行?
- 不会。这里没有用 `eval` —— 那会把用户输入当代码跑。校验走的是一个只认得数字、单位、四则运算符、括号与 `var()` 的小解析器,认不出的写法一律报错。顺带一提,`eval` 也验不出上面那条空格错误:它会乐呵呵地把 `100%-2rem` 算成 98。
- 百分比是相对什么算的?
- 相对使用这个值的那个属性的参照。用在 `width` 上时相对包含块宽度,用在 `font-size` 上时相对父元素字号 —— 所以 `100%` 到底是多少,取决于它写在哪个属性上。这也是相对单位没法脱离上下文给出确切数字的原因:单位是相对值时,这里只给出量纲与参考值,不硬凑一个像素数。
相关工具
Flex 布局
样式点按钮调 flex-direction、justify-content、align-items 等属性,实时看到布局怎么变,复制完整的 CSS 与配套 HTML。
媒体查询生成器
样式生成 @media 块:宽度断点(区间两端严丝合缝,不留 0.02px 的空隙)、暗色模式、减少动效、打印等。含实时预览。
滚动吸附生成器
样式生成 scroll-snap-type 与 scroll-snap-align,横向或纵向吸附、三种对齐方式。带实时预览,拖一下就能看出吸附效果。
CSS 渐变生成器
样式调角度、颜色与形状,实时预览渐变效果,一键复制 CSS。支持线性、径向与锥形三种渐变,可选中间色标。
CSS 圆角生成器
样式调四个角的圆角值,实时预览并复制 CSS。支持 px、rem 与百分比 —— 百分比在非正方形盒子上是椭圆,预览区里一眼就能看出来。
毛玻璃效果生成器
样式调模糊、透明度、饱和度与边框,实时预览毛玻璃效果并复制 CSS。代码含 -webkit- 前缀,iOS 上也能真的出现模糊。