目录

核心技术实现(踩坑分享)

1. 功能特点的“智能统一宽度”

2. “分组居中”与“智能缩放” (最核心)

商业模式与福利


大家好,我是一名(苦逼的)独立开发者。

平时喜欢写点小工具(Side Project)挂淘宝卖,但每次上架做主图都让我崩溃。

相信很多技术同行都有同感:

  1. 稿定/Canva 这类工具: 模板是多,但一个月会员 49 块。我这种低频上新的人,为了做 1 张图开一个月会员,血亏。

  2. AI 生成: 今年 AI 很火,我试了,结果全是“废图”。AI 根本不懂淘宝要的“大字报”排版,连文字对齐都做不到,浪费时间。

  3. PS: (程序员的电脑里可以没有 PS...)太重了。

作为开发者,最后的倔强就是:不就是 Canvas 画布嘛,我自己写一个!

于是,我肝了几个周末,这个小工具诞生了: 体验链接: http://toutu.1da.top/index.php (PC端)


核心技术实现(踩坑分享)

这个工具界面是三栏布局(左选模板/右填属性/中预览),核心就是 Canvas API。看着简单,但要让排版“智能”,还是踩了不少坑。

这里分享一下我最核心的两个排版算法思路(V17版):

1. 功能特点的“智能统一宽度”

需求: 无论用户输入“四个字”还是“八个字”,所有功能点胶囊必须一样宽,且要左右居中。

思路:

  1. 先用 ctx.font 设置好字体(我用了"500 80px OppoSans M")。

  2. ctx.measureText(text) 遍历所有 features 数组。

  3. const maxTextWidth = Math.max(0, ...features.map(f => ctx.measureText(f).width)); 拿到最长的文字宽度。

  4. let boxWidth = maxTextWidth + (fontSize * 2); (我把左右留白 padding 设为字体大小,这样留白也能动态缩放)。

  5. boxWidth = Math.min(boxWidth, availableWidth); (防止溢出)。

  6. const boxStartX = startX + (availableWidth - boxWidth) / 2; (计算出居中绘制的 X 坐标)。

2. “分组居中”与“智能缩放” (最核心)

需求: 3 条功能点时,不能像 V14 那样被拉伸撑满(上下太空),也不能像 V13 那样挤在中间。要保持固定间距,然后“整个组”居中。

思路:

  1. 智能缩放: 先用 80px 字体算一次 defaultMaxTextWidth,如果它小于容器宽度的 60% 且条目数 <= 3,就判定为“短文本”,把 fontSize 提升到 100px,featureHeight 也相应提升。

  2. 固定间距: 无论如何,我都设置一个固定的 fixedGap = 60px

  3. 计算组高度: const totalBlockHeight = (numFeatures * featureHeight) + (Math.max(0, numFeatures - 1) * fixedGap);

  4. 计算组的起始 Y: const blockStartY = startY + Math.max(0, (availableHeight - totalBlockHeight) / 2);

  5. 绘制: 循环时,每个 currentFeatureY = blockStartY + index * (featureHeight + fixedGap);

这个逻辑确保了功能点始终在它们的区域内视觉平衡,而不是机械地拉伸或堆叠。


商业模式与福利

这个工具我也在淘宝上架了(月卡9.9/年卡99/永久199),毕竟服务器和域名都是成本。永久版 199 元,一次付费终身更新,对比 49/月 的会员,5 个月回本,再也不用被“包月”绑架(笑)。

发帖主要是想给 CSDN 的各位大佬分享这个小项目,求一波反馈(比如技术实现、新模板建议等)。

福利时间: 感谢大家花时间看我这个小项目!

评论区抽 10 位朋友,送【年卡】兑换码(价值99元)!

规则: 随便聊聊,比如:

  • 你对这个工具有什么建议?

  • 你做 Side Project 时有什么好玩的故事?

  • 或者吐槽一下你用过的设计工具...

我会在 本周五(11月07日 晚上统一开奖,感谢大家支持!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐