z-data 4.0 发布: 内置原子化 CSS 引擎
作者: 一了 <[email protected]>
日期: 2026-08-17
z-data 一周年
z-data 二周年
z-data 前端框架的来历
https://github.com/Funlang/z-data
- 2026-08-16
z-data v4.0.0 开源发布
tag: v4.0.0, 发布说明: "+ atomic CSS engine"
z-data 是一个极轻量的嵌入式前端框架:
- 无虚拟 DOM, 直接操作 HTML DOM, 性能好
- 零配置, 零依赖, 无需构建, 单个 JS 文件即插即用
- 极小: 压缩后约 8K, gzip 后 < 5K
- 可用 <template> 做 for / if / else / use
- 支持 : / :: / . / .. / # / ! / @ 等丰富的语法糖
- 可与 Vue、Alpine 等框架共存 (加 z-none / x-ignore 即可)
4.0 的重点, 是内置一套"原子化 CSS"规则引擎.
什么是原子化 CSS?
传统写法是给元素一个 class, 再在 <style> 或 CSS 文件里
写 .card { padding: 16px; border-radius: 8px; ... }.
原子化则是把每一条样式拆成一个"原子": 一个属性名只对应
一个属性值, 例如 p1 = padding, brad2 = border-radius.
想要哪条样式, 就把对应原子拼到 HTML 上即可.
纯数字原子默认按 N/4 rem 换算 (源码 css/atomic-css-rules.txt 的
NUMS 规则): p1 = 0.25rem, p4 = 1rem.
z-data 的原子化 CSS 有什么不同?
它不需要 Tailwind, 不需要构建工具. 规则定义写在仓库 css/
目录 (css/atomic-css-rules.txt 为规则定义, rule-compiler.fun
为编译器, z-css.js 为运行时), 编译后并进 z-data.min.all.js.
你在 HTML 属性里直接写缩写标记, 运行时把它编译成 CSS 选择器,
并自动注入到 <style id="z-data-ss"> 中. 即开即用.
示例 (在线演示):
https://www.funlang.org/z-data/#url=./test/test-css.html
先看模板循环部分:
z-data
<div>
<template for="k:i in ['a','b','c']">
<template for="kk:ii in [1,2,3]">
<div :text="i+','+ii"></div>
</template>
</template>
...
</div>
双层 for 循环, 渲染出 a,1 ... c,3 一共 9 个格子,
:text=... 是文本绑定语法糖.
再看原子化 CSS 的 Hello world 部分:
<div
hover=c#88f
c#f88
b#0af
p18
m18
brad50%
bd="width: 12px; style: dashed; color: #ff0"
font="size=100px; weight: bolder; variant: small-caps"
!ta=center
!-webkit-text-stroke="3px gold"
!text-shadow="4px 4px 8px white"
!box-shadow="4px 4px 28px 1px #000"
after="content-+ pos-absolute l0 b0"
>Hello world</div>
逐条解释:
hover=c#88f :hover 时 color: #88f (状态伪类)
c#f88 color: #f88 (颜色简写)
b#0af background: #0af (背景简写)
p18 内边距 padding
m18 外边距 margin
brad50% border-radius: 50%
bd="..." 边框分组: 宽度/线型/颜色
font="..." 字体分组: 字号/字重/小型大写
!ta=center text-align: center (! 表字符串值)
!text-shadow / !box-shadow / !-webkit-text-stroke
文本阴影 / 盒阴影 / 文字描边
after="..." ::after 伪元素: content "+", 绝对定位
l0 左 0, b0 底 0
再看一个更花哨的"超极菜单":
<div d-none mt-40 ml-20 p20 pos-absolute w200 h80 font7.5 lh9
!font-variant=small-caps
!--c=#fa0 !--b=#fff !--a=#0000
!bg=var(--c) !c=var(--b)>
<div pos-absolute t15 l36 w20 lh16 p2 !ta=center !c=var(--c) font10
!bg='linear-gradient(...)' !background-position=...
!background-size='16px 16px' !font-weight=bolder
!-webkit-text-stroke='2.2px var(--b)'>美牛</div>
<div pos-absolute l60 font20>超极菜单</div>
<div pos-absolute t38 l59 p2 font11 !letter-spacing=6px>super</div>
<div pos-absolute t38 l92 p2 font11 !font-weight=bold
!letter-spacing=6px>menu</div>
<div pos-absolute t39.5 l126 p.9 px1.8 brad2
bd="width: 1px; style: solid">S</div>
</div>
这里用到的技巧:
d-none display: none (display 缩写)
mt-40 ml-20 margin-top / margin-left
pos-absolute position: absolute (位置缩写)
w200 h80 宽 / 高
t15 l36 定位 top / left
!--c=#fa0 定义 CSS 变量 --c (用 ! 写字符串值)
!bg=var(--c) 背景引用变量
纯用原子标记 + CSS 变量, 就拼出一个图文并茂的菜单.
规则速查 (摘自 css/README.md):
内边距/外边距 pm p0, m.1, pl2, mt3px, px4%, m--varname
尺寸/行高/圆角 h/w/font/lh/gap/brad h1, w2, font12px, lh2, brad2
方位 l/t/r/b l0, t1, r2pt, b3px
透明度/层级 op/ord/z op.1, ord2, z3
定位/显示 pos/d/cs/v/ws/us/pe pos-absolute, d-block
溢出 o/ox/oy o-scroll, oy-hidden
内容/颜色/背景 content/c/b content-x, c#000, b#fff
媒体查询 s:p0, sm/md/lg/xl/2xl/print
状态伪类 hover/focus/active/after/before/(first|last)
前置伪类 a- / a^ / a+ / a~ / not-
分组 bd/bl/bt/br/bb/bg/a/al/font/flex/grid/mask
常用属性简写对照 (编程 API):
ZData.ss('pos') -> "position"
ZData.ss('brad') -> "border-radius"
// 直接注入一段 CSS
ZDataStyle.add({ '.foo': { color: '#f00' } });
浏览器兼容:
z-data.min.js 2017: Chrome 61, Firefox 55, Opera 48
z-data.min.es2015.js / all 2016: Chrome 49, Firefox 44, Opera 36
小结:
4.0 让"样式"这件事也能像数据绑定一样, 直接写在 HTML 属性里,
零构建、零依赖, 保持了 z-data 一贯的"极轻量"哲学.
想体验的, 打开在线演示拖一拖就明白了.