#设计
12 篇
把一座 Three.js 浮岛搬进静态站
浮岛页只下载自己那一份脚本。场景在运行时现算,Three.js 与整个三维世界都留在这一页的 chunk 里,首屏 HTML 里只有一个空舞台。
不建模也能有体积:手工三角化一座浮岛
岛上的岩石不是从建模软件导出的,是五层不规则环带在运行时拼出来的。顶点色加平面着色,就足够让一块几何体看起来像被凿开的石头。
一个场景的光:三种灯与只算一次的阴影
半球光给环境色,主光给方向与阴影,轮廓光把岛从背景里拉出来;其余六个灯笼只是点光。阴影贴图只算一次,因为它照的东西一动不动。
两个着色器做水:水洼、溪流与瀑布
岛上没有水面模拟,也没有反射。两个 ShaderMaterial 分别负责平躺的水与竖直落下的水,共用一组 time 与 night 变量。
用 @layer 把样式优先级从「比权重」变成「排顺序」
样式失控的根源不是选择器写得不够具体,而是所有人都靠加权重解决问题。级联层让顺序显式化:层与层之间比顺序,层内部才比特异性。
锚点跳转被页头吃掉:一次 scroll-padding-top 修全站
吸顶页头会盖住锚点目标,逐个标题写 scroll-margin 迟早漏。正确的位置是滚动容器上的 scroll-padding-top,再用 ResizeObserver 把真实页头高度写回令牌。
模态框用原生 dialog:白拿的东西比想象中多
自己搭模态要手写焦点陷阱、ESC、滚动锁与返回焦点。原生 dialog 配 showModal 全部内置,还能用 ::backdrop,代价只有一条样式继承规则。
深色模式下表单还是白的:color-scheme 才是开关
把背景涂黑不等于原生控件跟着黑。select 的下拉、日期选择器、自动填充的底色都由 color-scheme 决定,accent-color 只管住勾选框与滑块。
设计令牌:一个文件管住整个站点
为什么我把颜色、间距、圆角全部收进 _tokens.scss,以及换一套视觉方向为什么只需要改这一个文件。
不用框架的 i18n:三语站点手写路由的代价
这个站点的手写 i18n 没用框架自带的配置。说说为什么,以及代价具体出现在哪里——两次 404,和一半没翻的文章。
把孔版套印的约束翻译成设计令牌
这个站点的视觉方向是孔版套印。我真正做的事是把印刷的物理限制写成令牌,于是换观感只动了两个文件,组件一行没改。
用 View Transitions 做主题切换水波纹
主题切换时用一个从点击点扩散的圆揭示新主题。半径要够到屏幕最远的角,动画结束必须清掉自定义属性,否则会污染下一次。
