Sticky 3.0.2

Sticky 组件,只能在 Scroller 内部或者列表系列组件的 staticSection 中使用, 它内部的子元素在 Scroller 滚动时将会获得吸顶效果。

Sticky 是一个虚拟组件,它只会给它的唯一子元素添加额外的逻辑,而不会改变原有的 dom 结构。

使用说明

引用方式

import { Scroller } from '$yo-component';

// 如果你的项目中未使用最新的 ykit-config-yo 插件,可能无法使用上面这个语法糖
// 你仍然可以通过下面这种方式来引用
import Scroller from 'yo3/component/scroller';

基本使用

吸顶效果在 APP 中非常常见,然而实现它并不是一件非常容易的事,如果使用 zepto 实现,可能需要做很多繁琐的计算和 dom 操作。 为了能更便捷地实现吸顶效果,我们提供了 Sticky 组件,它的使用非常简单, 你需要做的仅仅是用 <Scroller.Sticky> 标签包裹需要吸顶的 dom。注意,和 Touchable 类似的是 它只能接受一个唯一子元素,请参考下面的代码:

<Scroller>
  <Scroller.Sticky>
    <div>
      <span>我已经有吸顶效果啦</span>
      <Touchable touchClass='touch-class' onTap={()=>{console.log('tap.')}}>
        <span className='float-right'>点我</span>
      </Touchable>
    </div>
  </Scroller.Sticky>
  {/* ... */}
</Scroller>

需要注意的是,这个组件只能在 Scroller 组件内部,以及列表系列组件的 staticSection 中使用, 如果需要给 List 中的列表项添加吸顶效果,建议直接使用 Grouplist 组件。

这个组件可以在 Scroller 内部的任何位置使用,无需考虑 dom 结构。

配置Sticky容器的位置

在默认情况下,Sticky 容器节点会被定位在它的父容器的 top:0 的位置,如果你想调整它的定位,可以通过配置 Scroller 或者列表组件(ListGroupListSwipeMenuList) 的 stickyOffset 属性实现:

<Scroller
  stickyOffset={44}
  // ...
>
  {somecontent}
</Scroller>

上面示例中的 Sticky 容器将会位于 top:44px 的位置。

给sticky容器添加额外样式类

吸顶效果的实现借助了一个始终定位在 Scroller 容器顶部的一个 dom 容器来实现,在 Scroller 滚动到某个 dom 的吸顶范围之内时,会将这个 dom 复制到 sticky 容器中。

在某些情况下你可能希望处于 sticky 状态的元素拥有一些特殊的样式,这可以通过定义 stickyExtraClass 实现:

<Scroller.Sticky stickyExtraClass='sticky-extra'>
  {/* ... */}
</Scroller.Sticky>

实例

以下的代码就是右侧 Demo 的源码,这里的代码随机生成了十个分组,每个分组都有一个吸顶的标题,每个标题内部包含了一个 span 元素和一个 Touchable

class ScrollerDemo extends Component {
  getContent() {
    return getRandomColors(5).map((item, index) => {
      return (
        <div
          className="item"
          style={{ backgroundColor: item }}
          key={index}>{index}
        </div>
      );
    });
  }

  getGroup(i) {
    const randomHeight = Math.random() * 20 + 20;
    return (
      <div key={i} className="demo-group">
        <Scroller.Sticky>
          <div style={{ height: randomHeight, lineHeight: randomHeight + 'px' }} className="sticky-title">
            <span>{'Sticky Header ' + i}</span>
            <Touchable touchClass='touchable-opacity' onTap={() => {
              Toast.show('sticky header ' + i);
            }}>
              <span className="touchable-right" style={{ float: 'right' }}>tap!</span>
            </Touchable>
          </div>
        </Scroller.Sticky>
        {this.getContent()}
      </div>
    );
  }

  render() {
    return (
      <Page title="Scroller: Sticky" onLeftPress={() => location.href = './index.html'}>
        <Scroller
          ref="scroller"
          extraClass={'scroller_wrapper'}>
          {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((_, i) => {
            return this.getGroup(i);
          })}
        </Scroller>
      </Page>
    );
  }
}

function getRandomColors(num) {
  var _color = [];
  for (var j = 0; j < num; j++) {
    var letters = '3456789ABC'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++) {
      color += letters[Math.floor(Math.random() * 10)];
    }
    _color.push(color);
  }
  return _color;
}
属性

stickyExtraClass { String } #

在Sticky的子元素处在吸顶状态时,为Scroller的sticky容器添加的额外样式类。

默认值: null

height { number } 3.0.6 #

吸顶元素的高度,在infinite的列表组件的staticSection中使用时,设置这个属性可以提高列表的滚动性能。

默认值: null