HTML 设计 · 美学经验库
这个文件夹装的是「设计 HTML」这件事本身的经验:一个具体风格(构成主义)的美学考据, 加上从实现过程中沉淀出来的、可跨项目复用的规则与踩坑。
边界:动画 / 视频那条线不在这里。动效短片、片头、motion 相关的美学积累属于独立轨道 (在
C:\...\视频工作流\下的docs\constructivism-video\与constructivism-motion-*.html)。两者共享"构成主义"这个主题,但交付物、技术栈、 评审标准都不同,所以分开。
目录结构
工作目录和上线目录是分开的:.md 是源,产物里只有网页文件。
下面画的是「本机源项目」的布局。 在
look4end-site仓库里,这个目录是src/notes/,产物目录是仓库根的notes/—— 构建脚本会自己判断该写哪儿,不用手改路径。 仓库层面的完整工作流见仓库根的WORKFLOW.md。
结构主义html/
├── README.md 本文件
│
│ ── A 组:构成主义美学考据(这个风格为什么长这样)──
├── 01-美学谱系与形式法则.md 源流、代表作字典、九条形式法则、五个典型误用
├── 02-设计系统规格.md 色板/字体/网格/质感/动效 + StyleKit 规则对照
├── 03-资源清单.md GitHub 资源、字体、史料、参考站点、公有领域素材
├── 04-技术实现手册.md 逐条可复制 CSS 配方 + 兼容性 + 踩坑
├── 05-前端技术方案.md 深度技术方案(BCD/caniuse 版本号、真实站点 CSS 取证)
├── 06-素材情报报告.md 字体二进制 cmap 实测、授权原文、CC0 纹理源
│
│ ── B 组:可复用设计工程经验(跟风格无关,换项目照样用)──
├── 07-设计规则速查.md 对比度纪律、尺寸阈值、质感上限、动效规则
├── 08-交互模式.md history 驱动的多级返回(ESC = 后退键)
├── 09-踩坑清单.md 本次抓到的每个真实 bug:现象→原因→修法
├── 10-验证工作流.md 什么该用什么手段验 + 可直接跑的流程
│
├── kit/ 可运行的样式套件与样式指南
│ ├── kv.css 完整设计系统实现(令牌 + 组件 + 无障碍降级)
│ └── index.html 活的样式指南页(浏览器直接打开)
│
├── verify/ 配套验证脚本
│ ├── static-check.ps1 HTML/CSS/JS 静态检查 + id 引用 + 文档链接
│ ├── shot.ps1 多状态无头截图
│ ├── flow-test.ps1 交互链路功能测试
│ ├── example-flow-test.js 功能测试模板
│ └── route-test.js 纯逻辑单元测试(不需要浏览器)
│
├── build.py 把 .md 构建成上线目录
│
└── 上线/ ★ 上线目录:只有 .html 和 .css
├── index.html 站点首页
├── 01-…html … README.html 各篇文档(由 .md 生成)
├── doc.css 文章版面
└── kit/ 样式指南 + 设计系统
上线时只传
上线/这个目录。 里面只有.html和.css,不含 Markdown 源、 不含验证脚本、不含构建脚本 —— 工作用的东西不会跟着上公网。 改完.md之后重跑一次python build.py即可重新生成。
两组内容的关系
| A 组(01–06) | B 组(07–10) | |
|---|---|---|
| 回答的问题 | 「构成主义为什么长这样」 | 「怎么把任何一个页面做对」 |
| 换风格后还有用吗 | ❌ 大部分作废 | ✅ 全部可用 |
| 典型内容 | 李西茨基的红楔子、StyleKit 色板、公开素材版权判定 | 对比度必须精算、clip-path 吃焦点环、多级返回怎么做 |
先读 B 组的 09-踩坑清单.md —— 它是本次最硬的东西,20 多个真实 bug,每条都有现象、原因、修法。
最快的上手路径
| 你有多少时间 | 看什么 |
|---|---|
| 2 分钟 | 09-踩坑清单.md 的「一句话总结」+ 07-设计规则速查.md 第 7 节的贴墙速查 |
| 10 分钟 | 上面两份全文 + 打开 kit/index.html 看效果 |
| 要动手了 | 按 01-美学谱系与形式法则.md 的九条法则建立判断,用 02-设计系统规格.md 的令牌,直接引 kit/kv.css |
| 要改交互 | 08-交互模式.md |
| 要做完验收 | 10-验证工作流.md + src/verify/ 里的脚本 |
最重要的实测结论
这条是最容易被"看起来还行"骗过的:
| # | 结论 | 影响 |
|---|---|---|
| 1 | Anton / Bebas Neue / Archivo Black / Barlow Condensed 全都没有西里尔字形 | 页面一出现俄文就掉字体。这是设计师最顺手的四个"海报字体"。League Gothic、所有开源 slab 木活字字体也一样 |
| 2 | 同一个颜色在不同底色上的可用性可以完全反转 | #d4a843 金星 on 纸 = 1.82(废),on 黑 = 7.86(好)。必须逐对算,不能给颜色本身打标签 |
| 3 | #cc0000 苏维埃红在泛黄纸上 = 4.84:1,反而过 AA 正文线 |
而更亮的 #D6281F 只有 4.15(仅大字)。直觉不可靠 |
| 4 | #cc0000 on 纯黑只有 2.96:1 |
禁止在黑底上用红字 |
| 5 | multiply 只会让结果变暗 |
浅色字用 multiply 等于把字抹掉 —— 本次真的这么干过,巨型标题直接消失 |
| 6 | clip-path 会连 outline 一起裁掉 |
键盘焦点环消失,直接违反 WCAG 2.4.7。裁剪必须外移到装饰层 |
| 7 | 伪元素 content: attr(...) 的内容会被读屏软件朗读 |
"复制文字做效果"必须用带 aria-hidden 的真实节点,否则标题念两遍 |
| 8 | GitHub 上不存在"构成主义 CSS 框架" | constructivist 全站仅 78 个仓库,几乎全是教育学/机器学习。所以本项目自己写了 kv.css |
| 9 | 克卢西斯(Klutsis)不是"可自由使用"的公有领域 | 他 1938 年去世表面符合俄罗斯 PD,但模板有例外条款:若作者遭镇压并获死后平反,保护期自平反年起算 → 可能到 2027。这条我早期搞错过,后来更正 |
| 10 | 能靠读代码发现的 bug 是少数 | 本次近 30 个问题,绝大多数靠截图逐张看或把数值算一遍才发现 |
已落地的原型
原型在另一个工作区(本目录刻意与它解耦,方便单独分享/带走):
C:\...\视频工作流\soviet-press\index.html
用 A 组美学 + B 组规则做的第一个页面:报纸首页 → 三个板块转场进入三张海报 → 底部挂着文章条 → 点击上滑展开 → ESC 收回文章 → 再按 ESC 退回报纸(与浏览器后退键同一条路径)。
自包含,双击即可在浏览器打开。同目录的 _shots\ 里有各状态截图。
已验证 vs 未验证
已直接验证(有可复现的方式):
- 字体西里尔覆盖 —— Google Fonts 官方元数据 + 字体二进制 cmap 解析
- 色彩对比度 —— WCAG 相对亮度公式精算
- GitHub 仓库星数与许可证 —— api.github.com 实际返回
- CSS 兼容性 —— MDN Baseline 标识 + MDN BCD / caniuse 原始 JSON
- 公有领域图像 —— Wikimedia Commons API 逐件查询 + 直链实测 200
- 参考站点技术令牌 —— 直接抓取其生产 CSS 提取字体/色板/clip-path
- 交互链路 —— 无头浏览器 --dump-dom 功能测试 + 纯逻辑单元测试
- 页面实际长相 —— 无头截图逐张审
未能验证:
- 各作品逐件的精确版权状态(Commons 的 PD 标记是社区判定,不是法律意见)
- 俄文论文《构成主义对现代网页设计的影响》全文(PDF 无法读取)
- @property / animation-timeline / text-spacing-trim 的兼容性
- 厂商中文字体(阿里普惠体 / MiSans / HarmonyOS Sans)的官方授权页
- StyleKit 构成主义规则的原文 —— 由用户提供并声明已抓取确认,本环境未二次核验,记为「用户实测来源」
详见 03-资源清单.md 的「交付缺口清单」。
怎么用 src/verify/ 里的脚本
⚠️ Windows 默认禁止运行未签名的
.ps1。下面统一加-ExecutionPolicy Bypass。 脚本本身都带 UTF-8 BOM(PowerShell 5.1 读无 BOM 的 UTF-8 会乱码 —— 见09-踩坑清单.mdF6)。
cd C:\...\结构主义html
# 原型页在另一个工作区 —— 用变量指过去,脚本本身与项目解耦
$proj = 'C:\...\视频工作流\soviet-press'
# 静态检查(每次改完都跑)
powershell -ExecutionPolicy Bypass -File .\verify\static-check.ps1 -Dir $proj
# 纯逻辑单元测试(不需要浏览器)
node .\verify\route-test.js
# 交互链路 —— 先跑快路径验状态机
powershell -ExecutionPolicy Bypass -File .\verify\flow-test.ps1 `
-Page "$proj\index.html" -TestScript .\verify\example-flow-test.js
# 再跑一次真实动画路径
powershell -ExecutionPolicy Bypass -File .\verify\flow-test.ps1 `
-Page "$proj\index.html" -TestScript .\verify\example-flow-test.js -NoStub
# 截图(记得逐张看)
powershell -ExecutionPolicy Bypass -File .\verify\shot.ps1 `
-Page "$proj\index.html" -Out "$proj\_shots"
脚本都以 -Dir / -Page 参数化,换项目直接改路径即可。
这套脚本自身的实测状态
| 脚本 | 状态 |
|---|---|
static-check.ps1 |
✅ 实测通过(HTML/CSS/JS/变量/链接/id 引用七项全绿) |
route-test.js |
✅ 16/16 通过(含 8 个畸形输入用例 + 4 个往返一致性) |
flow-test.ps1 |
✅ 快路径 7/7、真实动画路径 7/7 |
shot.ps1 |
✅ 实测生成截图正常 |
开发这套脚本的过程本身踩了 4 个坑(测试桩注入顺序、异步断言没轮询、.ps1 丢 BOM、-replace 参数解析),
全部记在 09-踩坑清单.md 的 F 节。