我正在实施W3C定义的CSS3 flexible box layout module,类似于Mozilla's box model for xul。虽然这些标准规定了模型应该如何表现,但它们没有提供有关如何实施模型的任何细节。
我感兴趣的模型部分是:
功能1-5可以非常有效地实现。特征6是有问题的,因为我能想出的最有效的算法非常幼稚。该算法的工作原理如下:
步骤3是效率下降的地方。例如,如果列表中有十个项目,并且最后一个项目具有约束,则算法计算前九个项目的大小,然后当它达到第十个项目时,它需要重做所有计算。我已经考虑过对列表进行排序并首先调整所有约束框的大小,但是这会带来增加复杂性的成本以及对列表进行排序的开销。
我希望有一个公认的最佳解决方案,因为这是浏览器和框架(XUL,.Net,Flex等)中相当常见的功能。
答案 0 :(得分:5)
大多数盒子/容器布局算法使用2遍算法。在.NET(WPF)的情况下,它们被称为“测量”和“排列”。每个控件都可以测量其内容并在递归测量过程中报告“所需大小”。
在第二次传递(排列)期间,如果儿童所需的尺寸不适合父母,父母使用其布局算法为每个儿童提供实际尺寸,例如通过指定按所需尺寸加权的实际尺寸。最小/最大尺寸,盒子灵活性等可以在这里发挥作用。
有关WPF布局系统的更多信息 http://msdn.microsoft.com/en-us/library/ms745058.aspx
Xul布局 http://www-archive.mozilla.org/projects/xul/layout.html