Affix 固钉
如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。
安装方法
- 在命令行中执行以下命令
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} null | Function | func.noop |
useAbsolute | 是否启用绝对布局实现 affix | Boolean | - |
代码示例
默认情况下,Affix 的默认目标容器元素是整个 window
,并且 offsetTop = 0
,也就意味着当页面往下滚动时,当 Affix 元素接触到浏览器边框时,此时会将 Affix 钉住。
查看源码在线预览
import { Affix, Button } from '@alifd/next';
ReactDOM.render(<div className="custom-affix-wrapper">
<Affix>
<Button type="secondary">Affixed Button</Button>
</Affix>
</div>, mountNode);
.custom-affix-wrapper {
padding: 40px 0;
}
可以通过 offsetTop
或 offsetBottom
自定义偏移量。
查看源码在线预览
import { Affix, Button } from '@alifd/next';
ReactDOM.render(<div className="custom-affix-wrapper">
<Affix offsetBottom={0}>
<Button type="secondary">Affixed Button</Button>
</Affix>
</div>, mountNode);
.custom-affix-wrapper {
padding: 40px 0;
}
可以通过 container
属性设置 Affix 组件需要监听其滚动事件的元素,该属性接收一个函数作为参数,默认为 () => window
。
查看源码在线预览
import { Affix, Button } from '@alifd/next';
class Demo extends React.Component {
_containerRefHandler(ref) {
this.container = ref;
}
render() {
return (
<div className="custom-affix-container" ref={this._containerRefHandler.bind(this)}>
<div className="affix-wrapper">
<Affix container={() => this.container} offsetTop={0}>
<Button type="secondary">Affixed Button</Button>
</Affix>
</div>
</div>
);
}
}
ReactDOM.render(<Demo />, mountNode);
.custom-affix-container {
height: 150px;
overflow-y: scroll;
background: url(https://img.alicdn.com/tfs/TB1AbJXSpXXXXXJXpXXXXXXXXXX-32-32.jpg) repeat 50% 50%;
}
.custom-affix-container .affix-wrapper {
padding-top: 50px;
height: 500px;
}
可以通过 container
属性设置 Affix 组件需要监听其滚动事件的元素,该属性接收一个函数作为参数,默认为 () => window
;设置 useAbsolute 为 true,通过 absolute 布局实现组件固定。
查看源码在线预览
import { Affix, Button } from '@alifd/next';
class Demo extends React.Component {
_containerRefHandler(ref) {
this.container = ref;
}
render() {
return (
<div className="custom-affix-container" ref={this._containerRefHandler.bind(this)}>
<div className="affix-wrapper">
<Affix container={() => this.container} offsetTop={0} useAbsolute>
<Button type="secondary">Affixed Button</Button>
</Affix>
</div>
</div>
);
}
}
ReactDOM.render(<Demo />, mountNode);
.custom-affix-container {
height: 150px;
overflow-y: scroll;
background: url(https://img.alicdn.com/tfs/TB1AbJXSpXXXXXJXpXXXXXXXXXX-32-32.jpg) repeat 50% 50%;
}
.custom-affix-container .affix-wrapper {
padding-top: 100px;
height: 500px;
}
可以通过传入 onAffix
的事件回调函数来监听元素是否发生了固钉状态。该函数会在状态变化时返回固钉状态。
查看源码在线预览
import { Affix, Button } from '@alifd/next';
class Demo extends React.Component {
constructor(props) {
super(props);
this.state = {
affixed: false
};
}
onAffix = (affixed) => {
this.setState({
affixed
});
}
render() {
const state = this.state;
return (<div className="affix-demo-wrapper">
<Affix onAffix={this.onAffix}>
<Button type="secondary">{state.affixed ? 'Affixed Button' : 'Unaffixed Button'}</Button>
</Affix>
</div>);
}
}
ReactDOM.render(<Demo />, mountNode);
.affix-demo-wrapper {
padding: 40px 0;
}