Affix 固钉

如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。

安装方法

  1. 在命令行中执行以下命令npm install @alifd/next@latest -S

Guide

何时使用

当用户需要将某个组件固定在页面的某个位置时,可以使用 Affix 组件进行固定。

API

Affix

参数说明类型默认值
container设置 Affix 需要监听滚动事件的容器元素签名:Function() => ReactElement返回值:{ReactElement} 目标容器元素的实例Function() => window
offsetTop距离窗口顶部达到指定偏移量后触发Number-
offsetBottom距离窗口底部达到制定偏移量后触发Number-
onAffix当元素的样式发生固钉样式变化时触发的回调函数签名:Function(元素是否被固钉: Boolean) => void参数:元素是否被固钉: {Boolean} nullFunctionfunc.noop
useAbsolute是否启用绝对布局实现 affixBoolean-

代码示例

基本

默认情况下,Affix 的默认目标容器元素是整个 window,并且 offsetTop = 0,也就意味着当页面往下滚动时,当 Affix 元素接触到浏览器边框时,此时会将 Affix 钉住。

Affix 固钉 - 图1

查看源码在线预览

  1. import { Affix, Button } from '@alifd/next';
  2. ReactDOM.render(<div className="custom-affix-wrapper">
  3. <Affix>
  4. <Button type="secondary">Affixed Button</Button>
  5. </Affix>
  6. </div>, mountNode);
  1. .custom-affix-wrapper {
  2. padding: 40px 0;
  3. }

自定义偏移量

可以通过 offsetTopoffsetBottom 自定义偏移量。

Affix 固钉 - 图2

查看源码在线预览

  1. import { Affix, Button } from '@alifd/next';
  2. ReactDOM.render(<div className="custom-affix-wrapper">
  3. <Affix offsetBottom={0}>
  4. <Button type="secondary">Affixed Button</Button>
  5. </Affix>
  6. </div>, mountNode);
  1. .custom-affix-wrapper {
  2. padding: 40px 0;
  3. }

自定义目标容器

可以通过 container 属性设置 Affix 组件需要监听其滚动事件的元素,该属性接收一个函数作为参数,默认为 () => window

Affix 固钉 - 图3

查看源码在线预览

  1. import { Affix, Button } from '@alifd/next';
  2. class Demo extends React.Component {
  3. _containerRefHandler(ref) {
  4. this.container = ref;
  5. }
  6. render() {
  7. return (
  8. <div className="custom-affix-container" ref={this._containerRefHandler.bind(this)}>
  9. <div className="affix-wrapper">
  10. <Affix container={() => this.container} offsetTop={0}>
  11. <Button type="secondary">Affixed Button</Button>
  12. </Affix>
  13. </div>
  14. </div>
  15. );
  16. }
  17. }
  18. ReactDOM.render(<Demo />, mountNode);
  1. .custom-affix-container {
  2. height: 150px;
  3. overflow-y: scroll;
  4. background: url(https://img.alicdn.com/tfs/TB1AbJXSpXXXXXJXpXXXXXXXXXX-32-32.jpg) repeat 50% 50%;
  5. }
  6. .custom-affix-container .affix-wrapper {
  7. padding-top: 50px;
  8. height: 500px;
  9. }

启用绝对布局

可以通过 container 属性设置 Affix 组件需要监听其滚动事件的元素,该属性接收一个函数作为参数,默认为 () => window;设置 useAbsolute 为 true,通过 absolute 布局实现组件固定。

Affix 固钉 - 图4

查看源码在线预览

  1. import { Affix, Button } from '@alifd/next';
  2. class Demo extends React.Component {
  3. _containerRefHandler(ref) {
  4. this.container = ref;
  5. }
  6. render() {
  7. return (
  8. <div className="custom-affix-container" ref={this._containerRefHandler.bind(this)}>
  9. <div className="affix-wrapper">
  10. <Affix container={() => this.container} offsetTop={0} useAbsolute>
  11. <Button type="secondary">Affixed Button</Button>
  12. </Affix>
  13. </div>
  14. </div>
  15. );
  16. }
  17. }
  18. ReactDOM.render(<Demo />, mountNode);
  1. .custom-affix-container {
  2. height: 150px;
  3. overflow-y: scroll;
  4. background: url(https://img.alicdn.com/tfs/TB1AbJXSpXXXXXJXpXXXXXXXXXX-32-32.jpg) repeat 50% 50%;
  5. }
  6. .custom-affix-container .affix-wrapper {
  7. padding-top: 100px;
  8. height: 500px;
  9. }

onAffix

可以通过传入 onAffix 的事件回调函数来监听元素是否发生了固钉状态。该函数会在状态变化时返回固钉状态。

Affix 固钉 - 图5

查看源码在线预览

  1. import { Affix, Button } from '@alifd/next';
  2. class Demo extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. affixed: false
  7. };
  8. }
  9. onAffix = (affixed) => {
  10. this.setState({
  11. affixed
  12. });
  13. }
  14. render() {
  15. const state = this.state;
  16. return (<div className="affix-demo-wrapper">
  17. <Affix onAffix={this.onAffix}>
  18. <Button type="secondary">{state.affixed ? 'Affixed Button' : 'Unaffixed Button'}</Button>
  19. </Affix>
  20. </div>);
  21. }
  22. }
  23. ReactDOM.render(<Demo />, mountNode);
  1. .affix-demo-wrapper {
  2. padding: 40px 0;
  3. }

相关区块

Affix 固钉 - 图6

暂无相关区块