StyleKit

Canvas 2D 品牌竖线卡片

一条可复用的单文件提示词,把三个品牌路径变成采样亮度、动态竖线和指针检测框效果。

Canvas 2D animationbrand line artgenerative identitysingle-file HTMLinteractive line drawingcanvas logo effect

关于此主题

这条配方先把矢量路径采样成亮度表,再把亮度表画成克制的动态视觉实验。它写清网格、线宽分档、指针反馈、无障碍动效控制和可检查的验收条件,方便别人按步骤复现。

提示词示例

AI 提示词示例

复制这些提示词,用你喜欢的 AI 工具生成Canvas 2D 品牌竖线卡片设计。

把三个品牌标志变成量化竖线

General
请制作一个名为“Identity, in lines.”的精致响应式单文件 HTML 页面,直接用现代浏览器打开即可运行。只使用原生 HTML、CSS、JavaScript、Canvas 2D 和 Path2D。不要使用库、框架、模块、构建工具、图片、图片链接、外部 SVG 文件、外部字体或网络请求。CSS 和脚本全部内联。最终只返回完整 HTML 文件。

1. 页面与卡片
制作克制的编辑式页面:顶部有“StyleKit / Visual studies”小字标识和动效开关。主标题是“Identity, in lines.”,介绍文案是“Move through a familiar mark. Find the structure beneath the surface.”。在最大宽度 1,200 像素的内容区内,桌面端一行排列三张卡片,间距 19 像素;卡片宽高比为 0.70、圆角 17 像素、高度至少约 460 像素。屏幕宽度不超过 650 像素时改为单列。每张卡片左上有用线条绘制的小标志和品牌名,左下依次放置准确标语和“Reveal the source →”按钮:Apple 是“Think different.”;Google 是“Find your next possibility.”;Tesla 是“Accelerate the future.”。页脚分别写“A study of recognition and reconstruction.”与“One path. A field of light. Four line weights.”。主标题使用 Georgia/Times 衬线字体,字号 38–57px;卡片文字使用 Arial/Helvetica 无衬线字体,标语字号 27–37px。字体全部来自本地系统。Apple 背景 #eeeeeb、线色 #202220;Google 背景 #2152e7、线色 #c2dcff;Tesla 背景 #111212、线色 #ec353e。每个品牌的蓝色检测标记颜色见下方路径数据。点击来源按钮时打开无障碍弹窗,展示对应的精确路径,并提供关闭控件。保证卡片内容清晰、不被裁切,并适合触控。

2. 只采样一次路径
使用下方数据中三个精确的 24×24 Path2D 路径字符串,并使用对应 scale 居中绘制:将 300 像素临时画布乘以 scale 除以 24,平移到中心,再将路径原点平移 -12,-12。每个品牌单独创建一个尺寸为 300×300 的脱离 DOM 的临时 canvas,即 60 个网格单元乘以每格 5 个超采样像素。先填充不透明黑色,再用白色填充品牌 Path2D。只读取一次像素数据。对每个 60×60 网格单元,将来源图像中对应的 5×5 像素按 Rec. 709 公式计算,即 0.2126 R + 0.7152 G + 0.0722 B,再除以 255 并求平均,保存为含 3,600 个数值的 Float32Array。之后只保留该数组和品牌元数据。把临时 canvas 的宽高设为 0,并让 context 和像素缓存离开作用域。包括尺寸变化在内,都不得重新采样路径。

3. 量化竖线绘制
每张卡片绘制 60 根等距竖列,每列 30 段竖线。每一段取相邻两行网格亮度的平均值。使用 0.12、0.42、0.89 三个阈值量化成且仅量化成四档。线宽只使用 0.38、1.12、2.28、3.80,并乘以“网格单元尺寸除以 5.25”。每段接近两个网格单元高,段间留 0.7 像素窄缝,使用平头线帽;四档透明度依次是 0.15、0.64、0.93、1,让标志像一节节竹段。按粗细档分组,每帧每组只描边一次。卡片顶部的小标志也必须根据已存的亮度表绘制;不能加入 Logo 图片或 SVG 元素。

4. 缓慢、可复现的流动噪声
初始化时使用 xorshift 整数 PRNG,以 seed 7319 生成一张共享的 128×128 随机格点表;每轮依次执行 state ^= state << 13、state ^= state >>> 17、state ^= state << 5。把每个无符号整数除以 4,294,967,295,再乘以 2 并减去 1,得到 -1 到 1 的格点值。用平滑双线性 value noise 取样,先把每个局部小数 t 转换为 t*t*(3-2*t);每个品牌的 seed 作为水平偏移。每段的 x 取“列 × 0.15 + 品牌 seed”,y 取“行 × 0.16 - 经过秒数 × 0.17”,使可见噪声缓慢向下流动。在线宽分档之前,调整后亮度为“亮度 × 0.94 + 噪声 × 0.12 × (0.25 + 亮度 × 0.75)”。鼠标静止时,线条粗细也应轻轻漂移。动画过程中不要调用 Math.random。

5. 指针作用与弹簧复位
用卡片内的 CSS 像素坐标记录指针位置。合并连续指针事件:先保存最新 client 坐标,在下一动画帧中只读一次卡片边界;状态文字只在状态切换时更新。指针进入、触摸或从上一次脉冲位置累计移动超过 1.5 像素时,把脉冲设为 1,让附近线段径向散开。作用半径为 Logo 绘制区域宽度的四分之一。影响系数为 max(0, 1 - 距离/半径),先平方再乘以脉冲和 25,沿径向产生位移,竖直方向再乘 0.58。位移使用阻尼弹簧模型:刚度 145、阻尼 19,每次积分步长最多 1/30 秒。脉冲按 exp(-dt × 5.5) 衰减后,每段都回到原始网格坐标;即使鼠标停在原处,也不能让线条持续散开。鼠标和触控使用同一套弹簧反馈;键盘聚焦时显示检测框,无须模拟指针移动。

6. 确定性的检测框
检测框必须来自当前的数值线场,不能只在初始化时算出固定坐标,也不调用 AI 服务。覆盖层可见时,扫描间隔至少 100ms。复用一个 60×60 Float32Array,每次扫描先清空;对每段跨两行的可见线条,把当前叠加噪声后的亮度,根据弹簧位移后的位置,用双线性权重分别累积到对应两行网格。仍然只用初始化采样的源数据,不能再次读取画布像素。暂停时,聚焦或尺寸变化可以补做一次静态扫描,但不能连续安排帧。

对这张实时亮度场建立积分图,计算 7×7 窗口的平均亮度,选中后向外扩一格。最亮窗口均值低于 0.04 时不画框;保留得分至少为最亮候选 48% 的区域。空间非极大值抑制使用 16 格中心间距;不足两个区域时放宽为 12 格,最多保留三个。为避免相近分数导致乱跳,可在候选排序中加上 0.025 * exp(-到上一目标的距离平方 / 128) 的小幅连续性权重。将新窗口与 12 格以内的旧目标匹配,保留目标身份、速度和连线顺序。只把检测目标吸附到整数网格,显示框使用刚度 144、阻尼 24 的临界阻尼弹簧逐帧跟随,积分子步长不超过 1/120 秒。绘制时保留小数网格位置,绝不能再次取整抵消平滑动画;移动中的坐标可保留一位小数,停稳后精确落到目标格点。遇到无关的新目标,先把旧框淡出到透明度低于 0.04,再替换位置并淡入新框,透明度缓动使用 1 - exp(-dt * 16)。最多保留三个槽位,连线透明度跟随两个端点中较低者,避免连线突跳。暂停时直接更新为稳定静帧,不连续安排淡入淡出动画。

绘制蓝色框、淡色填充、明显角标、坐标与细连线,指针或键盘聚焦时出现,离开后淡出。信号稳定时框可以稳定,但噪声或鼠标形变必须能改变检测位置;不能靠随机游走制造动态,也不能声称执行了真实 AI 推理。

7. 高清画布、动效与无障碍
每张卡片使用独立可见 canvas。让画布 backing width 和 height 等于画布自身的实际 CSS 尺寸乘以当前 devicePixelRatio 并取整,再设置 2D transform,使绘图坐标仍使用 CSS 像素。每个 requestAnimationFrame 帧都清空并重画。用 ResizeObserver 响应卡片尺寸变化,但不重新采样标志。即使 CSS 宽高未变,单独改变 DPR 也必须更新像素缓冲:绘制前比较当前 DPR 与缓存值,或使用变化后重新绑定的 resolution matchMedia 监听;不能只依赖 ResizeObserver。暂停动效时,DPR 或尺寸变化也应更新画布并补画一个静帧。验收时保持 CSS 视口尺寸不变,将 DPR 从 1 切到 2,确认像素缓冲翻倍且采样次数仍为三次。让高像素密度屏上的线条保持清晰。提供可键盘操作的动效开关,并保持 aria-pressed 状态准确;遵守 prefers-reduced-motion,默认静止。卡片可通过键盘聚焦并有实用的无障碍名称;canvas 仅作装饰,应从辅助技术中隐藏。支持触控,移动端触控目标要足够大。

8. 生命周期与响应式行为
页面不可见、卡片滚出视口或来源弹窗打开时暂停动画;恢复时重置上一帧时间,避免长暂停造成过大的时间步长。用 IntersectionObserver 暂停屏外卡片。当动效暂停时画出稳定静帧并停止连续安排动画帧。窄屏改为单列,同时保留 Logo 绘图区和底部文案间距。如果浏览器不支持 Canvas 2D 或 Path2D,在页面内展示简短提示,不要抛出未捕获异常。

9. 返回前检查
按以下可观察条件检查成品:恰有三张卡片,并包含下方精确路径数据;每个品牌初始化时只读一次像素,后续帧和尺寸变化都不再读取;每张亮度表都是 60×60;每张卡片绘制 60 列、每列 30 段,并且只用四档线宽;空闲噪声使用固定 seed 且向下流动;指针和触控触发弹簧后复位,键盘聚焦可显示检测框;最多三个吸附网格的检测框由蓝色连线连接;DPR 为 2 时 backing store 尺寸翻倍;减少动态效果偏好下默认静止;手机卡片改为单列;没有外部请求、图片元素或控制台错误。除非确实检查或运行生成的文件,否则不要声称这些检查已通过。

精确标志数据(必须保留路径字符串):
Apple — seed 3, scale 0.82, 背景 #eeeeeb,线色 #202220,检测色 #267dff
M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701

Google — seed 29, scale 0.79, 背景 #2152e7,线色 #c2dcff,检测色 #91dcff
M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z

Tesla — seed 51, scale 0.81, 背景 #111212,线色 #ec353e,检测色 #4eaeff
M12 5.362l2.475-3.026s4.245.09 8.471 2.054c-1.082 1.636-3.231 2.438-3.231 2.438-.146-1.439-1.154-1.79-4.354-1.79L12 24 8.619 5.034c-3.18 0-4.188.354-4.335 1.792 0 0-2.146-.795-3.229-2.43C5.28 2.431 9.525 2.34 9.525 2.34L12 5.362l-.004.002H12v-.002zm0-3.899c3.415-.03 7.326.528 11.328 2.28.535-.968.672-1.395.672-1.395C19.625.612 15.528.015 12 0 8.472.015 4.375.61 0 2.349c0 0 .195.525.672 1.396C4.674 1.989 8.585 1.435 12 1.46v.003z

相关风格

相关风格

探索这些风格获取现成的 tokens 和组件。

适用场景

最佳使用场景

品牌视觉实验

探索如何把熟悉的矢量标志转化为响应式动态线稿,不依赖图片素材。

作品集交互

为设计作品集、活动页面或创意编程案例制作可独立运行的动效细节。

Canvas 2D 学习

通过一个完整案例练习离屏采样、像素数据压缩、确定性噪声、弹簧动效和高清画布绘制。

常见问题

常见问题解答

蓝色检测框真的调用了 AI 识别吗?
没有。提示词要求从采样网格中按亮度确定性地挑选区域。检测框只是视觉表达,不能描述成真实物体识别或 AI 推理。
怎样替换品牌路径或配色?
同时替换该品牌的 24×24 Path2D 数据、名称、背景色、线色、检测色、scale 和 seed。让新路径仍位于 24×24 坐标范围内,这样采样变换才容易控制。
每次播放的动效都会完全一致吗?
相同时间和输入下,固定 seed 的噪声可以复现。检测框跟随当前带噪声与形变的线场,不使用初始化时的固定坐标。指针时序、刷新率、栅格化和设备像素比仍影响具体帧,不能保证跨设备逐像素一致。
系统开启减少动态效果时应怎样表现?
默认暂停动效并显示稳定画面。保留动效开关,让访客可以主动开启;动效关闭时停止持续绘制。

想要完整的设计系统?

StyleKit 提供 149 种视觉风格,每种都有 design tokens、组件配方和可导出的 AI Rules。