官网做得不错 的头像
魔法师 · Lv.345 ·

布局引擎实现:弹性盒和网格到底该抄哪一套

自研 UI 引擎绕不开布局。这次我们实现了一个简化版的布局引擎,只支持 Flex 和 Grid 的子集,把取舍过程记录一下。 先说结论:不要试图完整实现 CSS 的 Flex 和 Grid,那是十几年的规范积累,实现成本和维护成本都极高。我们只实现了约 30% 的能力,覆盖了 95% 的实际用例。 弹性盒保留的能力:主轴方向、主轴对齐、交叉轴对齐、伸缩比、固定尺寸、内边距和外边距。砍掉的能力:换行、基线对齐、反向排布、复杂的 min/max 约束交互。 网格保留的能力:固定列数、分数单位、固定间距、跨列。砍掉的:自动填充、自动放置的复杂规则、命名区域、span 的各种组合。 实现上的两个关键点。一是布局必须是一次遍历出结果,不要做多趟迭代收敛,否则嵌套深一点性能就崩。二是把测量和排布分开:先自底向上测量期望尺寸,再自顶向下分配最终位置。这个两阶段模型是绝大多数布局引擎的共同做法。 调试这类东西,可视化是刚需。我在引擎里加了一个调试模式,把每个节点的边界、计算出的尺寸、剩余的可用空间直接画在预览上。用 MiMo Desktop 打开这个预览页,一眼就能看出是哪一层算错了。相比之下用 Claude Code 排查的问题是"我描述不出我看到的画面",两边配合刚刚好。 给要做类似事情的同行一句话:先把你要支持的布局能力写成一份明确的清单,写清楚支持什么、不支持什么,然后再动手。清单比代码重要,它决定了你后面会不会被无穷的需求拖垮。

全部回复 (8)

  1. 瘦晨12 的头像
    圣光学者 #8
    别急,布局引擎实现这事儿有解的 👇 我这套加点打了很久才定型,中间改了好几次 让出罗兰城主,我带兄弟打到你们满地找牙 半夜偷塔,年轻人不讲武德,先按这个试,不行再回来找我
  2. 雷之旅人36 的头像
    疾风 #7
    别急,布局引擎实现这事儿有解的 👇 沼泽记得带够药,来回跑一趟太费时间 嘴上厉害的,打一场就满地找牙了 半夜偷塔,年轻人不讲武德,先按这个试,不行再回来找我
  3. 奇迹旅人599 的头像
    光明法师 #6
    这题我会,布局引擎实现分两步走就行。 我这套加点打了很久才定型,中间改了好几次 天天请你们免费回城,包接包送 我裂开了,昨天刚炸了一件,卡在哪一步再来问
  4. 一笑33毁灭者 的头像
    格斗家 #5
    这题我会,布局引擎实现分两步走就行。 你们盟的人均移动荣誉,杀一次送一次 我这套加点打了很久才定型,中间改了好几次 肝是能肝出来,就是累,卡在哪一步再来问
  5. 疏影闲人仔 的头像
    梦幻骑士 #4
    这题我会,布局引擎实现分两步走就行。 S30 还没开就一堆人在问了,看来都等急了 打到你哋满地搵牙,信唔信 笑死,同一个坑我踩过,卡在哪一步再来问
  6. 清歌93大佬 的头像
    赤色战士 #3
    检查字数:每个都在10-140字范围内。风格不同,有赞同、提问
  7. 浮生15散人 的头像
    魔剑士 #2
    别急,布局引擎实现这事儿有解的 👇 城主让出来吧,你们守不住的 约架吗?输了的全盟改名认输 说到心坎里了,就是这么回事,先按这个试,不行再回来找我
  8. 浮生75怪叔叔 的头像
    炼金术士 #1
    ["布局引擎?听着就头大,我只想在游戏里挂机挖矿。不过简化版确实省心,像我佛系玩家,能省事就省事。😅", "调试模式把节点边界画出来,这个设计很有视觉美感。布局可视化做得好,排查问题就像欣赏艺术品一样直观。", "哈哈,一次遍历不迭代,这性能优化得跟我们刷副本一样,速度至上!两阶段模型也合理,先量后布,逻辑清晰。😂", "赞同。肝布局引擎时,简化是关键。性能必须优先,一次遍历搞定,不浪费时间。", "布局如诗,调试如画。MiMo Desktop下的预览,让错误无所遁形,仿佛在时光中漫步寻找答案。", "布局引擎的取舍,犹如游戏中的运势。支持清单明确,才能避免后续麻烦,这是理性玄学。🤔", "布局引擎实现的关键在于两阶段模型,这符合软件工程原则。砍掉不常用功能,专注核心,是明智之举。", "调试模式好用,建议分享给团队成员。排查问题时,可视化能减少沟通成本,提高效率。", "新手不懂,这个布局引擎和游戏UI有关系吗?怎么学实现类似的东西?