-
Notifications
You must be signed in to change notification settings - Fork 185
Description
Hi All,
这个 Issue 抛出一个关于 CSS 的提案,我希望能够在 Web 中文兴趣组内先进行一些讨论,收集意见和建议,最终目标是能够贡献到 CSSWG。
需要注意的是这个文档目前还只是一个"提议",还不算是比较完整的提案。
提案的目的是解决 Web 标准下滚动视图的复用回收问题,客户端开发中有 RecyclerView/UITableView 来实现滚动回收的布局容器,提案的 Display Sliver 定义了容器的布局方式以及当子元素滚动出 viewport 后的回收特性。
属性
增加 CSS Display 属性值: sliver
sliver 属于 W3C Box Layout Modes 中定义的 Inner Display Layout Models 类型,详见 https://www.w3.org/TR/css-display-3/#inner-model
当 display 为 sliver 时,该元素的 overflow 表现为 auto,越界的内容会被裁减,容器可滚动并显示滚动条。
增加 CSS 属性 sliver-direction : row|column 默认 column
sliver-direction 指定了 Sliver 容器的主轴方向 (Main Axis),Sliver 容器的主轴方向即滚动方向;Sliver 容器的交叉轴 (Cross Axis) 方向与主轴方向交叉,Sliver 容器在交叉轴方向不可滚动。
- row: 可滚动方向为水平方向
- column: 可滚动方向为垂直方向
布局特性
在主轴方向 (Main Axis) 上可滚动, 其值由 sliver-direction 指定, 默认值为 column ;
主轴方向上的尺寸需要由 CSS 显式的 width/height 定义,否则默认值为 0。
交叉轴 (Cross Axis) 方向上的尺寸会填充满父容器尺度上的剩余空间, 与 flow layout 中的 block-level 的表现相同。
对容器的每一个子元素,其主轴方向上的尺寸需要由子元素在 CSS 中定义,否则默认值为 0;其交叉轴方向上的尺寸会填充满 SliverContainer 的剩余空间;
回收特性
当 Sliver 容器中的子元素滚动出该容器的 Viewport 时,可以将该子元素中用于渲染的 renderobject 回收以达到节省内存占用的目的。当子元素重新出现时,根据 DOM 描述重新生成 renderobject。
一些补充
- 具体实现中, 滚动时当子元素边界出 viewport 后, 可以等待一个 remainDistance 的距离再销毁; 当子元素处于 viewport 外,将要移入 viewport 时,可以在 remainDistance 的时候就开始创建 renderobject; 这些措施是出于性能和体验考虑
- 具体可销毁的对象, 是除了 Element 本身描述(attr,styleDeclaration)外的对象, 这里应该存在不同实现的差异性
- 我们这边已经基于 Flutter RenderObject 实现了类似的布局能力
我希望讨论的内容
- 必要性
- display 新属性的命名, sliver 的出处是参考了 Flutter
- 提案的描述
- 关于实现可行性
- 提案的流程