Skip to content

CSS Display Sliver 提案的讨论 #239

@wssgcg1213

Description

@wssgcg1213

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。

一些补充

  1. 具体实现中, 滚动时当子元素边界出 viewport 后, 可以等待一个 remainDistance 的距离再销毁; 当子元素处于 viewport 外,将要移入 viewport 时,可以在 remainDistance 的时候就开始创建 renderobject; 这些措施是出于性能和体验考虑
  2. 具体可销毁的对象, 是除了 Element 本身描述(attr,styleDeclaration)外的对象, 这里应该存在不同实现的差异性
  3. 我们这边已经基于 Flutter RenderObject 实现了类似的布局能力

我希望讨论的内容

  1. 必要性
  2. display 新属性的命名, sliver 的出处是参考了 Flutter
  3. 提案的描述
  4. 关于实现可行性
  5. 提案的流程

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions