网站配图:一张能在别人页面上起作用的画
标题旁边的首屏大图、一张功能卡片、一排图标、一张链接预览。画不再独占它的画布:页面的文字、颜色和品牌排在前面,画是为了与它们共处而画的。套件:engine/src/canvas-core/assetKit.ts。完整示例:siteHero.ts(浅色页面)和 siteHeroDark.ts(深色页面),两者由同一份代码画出。
1. 从页面出发,而不是从画出发
在选主题之前,先写下页面已经定好的东西:
- 位置: 哪个区块,什么东西在画的旁边或上方,画显示出来的尺寸。
- 页面的颜色, 要精确,以及网站是否还有深色主题。
- 品牌色, 一个十六进制值,以及品牌以之闻名的任何材质(胡桃木、黄铜、哑光黑)。
- 画必须支撑的那句话: 通常是它旁边的标题。
- 画风: 32 种里任何一种都行。页面约束的是摆放和颜色,绝不约束媒介。
2. 挑一个做着产品所做之事的物件
读第 1 步里的那句话,问这个产品做什么,用一个动词来说:分拣、连接、保护、重复、测量。然后找一个能让人看得见地执行这个动词的人造物件,把它当作一台机械来造(machines.md),让它的运转不靠说明文字就能传达信息。给用户提两三个候选,每个一句话,说出你偏好哪一个以及理由,除非他们挑了别的,否则就按它做下去。用户已经点名了物件时,直接跳到造它这一步。
| 页面承诺的 | 能把它展示出来的人造物件 |
|---|---|
| 让一切都找得到 | 一个邮局分拣架,每封信都在自己的格子里,有一封正被放进去 |
| 几分钟就能装好 | 一把组装到一半的平板包装椅子,最后一根木销正在插进去 |
| 把一个团队连接起来 | 一台电话交换机,一根线插到一半,一盏灯亮着 |
| 让东西保持私密 | 一个带密码转盘的信箱,翻盖关着 |
| 让一连串步骤自动完成 | 一条弹珠轨道:一颗弹珠在轨道上,下一颗在闸口等着 |
| 把数据变成洞见 | 一座气象站:风速计在转,气压计的指针,一本记录簿 |
| 翻译 | 一台有两个字篮的打字机,一个键正击打到一半 |
| 让储蓄增长 | 一台按大小分管的硬币分拣机,一枚硬币正沿着斜槽滚下 |
| 教学 | 一个装在黄铜子午圈上的桌面地球仪,一根图钉插在一座城市上 |
| 做音乐 | 一个滚筒八音盒,滚筒在转,调速器转成一团模糊 |
把物件的轮廓放到它要填的空间上比一比。在文字旁边的画适合宽阔的形状,在文字下面的画适合低矮、拉长的形状,图标则要一个紧凑的单一物件。
3. 视线只落在一处
选出那个显示动词正在发生的部件(信正在进格子、木销正在插进去),给它强调材质(accent: true)。strongPoint(p) 给出放它的好位置:从边上往里三分之一处,偏向文字,或者文字在上方时居中。
4. 摆放
PLACEMENTS 为每一种位置保存一块画布、一个画区,有文字的地方还有一个标题区:heroSide、heroSideLeft、heroStack、art、card、icon、strip、social、slide。用 Cam.fit(A, E, points, fitBox(p)) 把物件放进它的区域。把每一个可能伸出去的点都交给它,包括升起的或爆炸拆开的部件,否则拟合会把它裁掉。转动方位角,直到发生运转的那一侧朝向文字。标题区里什么都不画,连投影或柔和的高光也算在内。在渲染出来的静帧上检查:node tools/placement.mjs still.png --W <meta.W> --safe x,y,w,h。
5. 页面的颜色,浅色与深色
setPalette(pagePalette({ paper, accent, colours, tint })) 把每一种材质迁移到页面上,让机械属于这个页面。在浅色页面上,每一种中性色按页面比套件的奶油色亮多少或暗多少来整体平移,tint(0 到 1)决定灰色还要染上多少页面的色相。在深色页面上,部件只比页面略微亮出一点:受光的顶面是最亮的东西,线条画得比它们勾勒的面更亮。背景只用 paper 涂,别的都不行;差一点点就会在每个部件周围画出一圈浅色的边。有浅色和深色两种主题的网站,通过 heroOn(title, paper, accent) 用同一份代码得到两张画。
6. 品牌的颜色
accent: "#hex" 给第 3 步里的那个部件上色。colours: { wood: "#7a5536" } 按名称给任何一种材质重新上色,品牌的标志性材质也是这样做出来的。两种模式:
- solid(实色,默认):整个部件都用品牌色。它的五个色阶都保持这个色相,亮度被限制在一个范围内,使每个色阶仍能和下一个区分开,而且没有一个在深色背景上亮得刺眼;
- lines(线条):各个面保留中性的灰色,颜色只进入笔画和圆点,适合指针、仪表的指针或刻出来的记号。
把品牌色放在第 3 步的部件上,最多再在别处小小地出现一次。一个同时铺满底座和大面板的品牌色,就再也不能告诉眼睛该往哪里看了。
7. 让它按它的工作方式动起来
把机械的一个完整周期做成循环,让它无缝地重复。只让真实的东西会动的部件动,别的一概不动。转得太快、看不清的部件用 spin(angle, sweep, draw, { swept }):几份更淡的叶片副本,每份往后错开一点,叠在一块淡淡的扫掠形状上,让眼睛读出的是速度,而不是慢慢地转动。在标题旁边,安静更好:当真实的机械几乎不动时,就用一条 meta.holds 理由把这一点说出来,而不是编造运动。要求减弱动态效果的访客只看到第 0 帧,别的什么也没有,所以要把第 0 帧本身就做成一张完成的画。
8. 成套的画,以及很小的画
当几张画要放在一起时(一排卡片、一条图标),用同一箱零件把它们全部造出来:同一种螺丝、同一种支脚、同一种边缘倒角、同一个镜头角度、同一种强调。这样它们看起来就像兄弟姐妹。比较每一张有多繁密,把最空的往上补到和其他的一样,而不是把最满的往下减。在图标尺寸下,用更少的零件、把每个做得更大,细小的刻度干脆全部不要。按页面实际显示的尺寸渲染每一张画,再按手机宽度渲染一次(placement.mjs --phone out.png),两张都要看。