Affix
固钉

将页面元素钉在可视范围。
使用import{ Affix }from"antd";

何时使用

当内容区域比较长,需要滚动页面时,这部分内容对应的操作或者导航需要在滚动范围内始终展现。常用于侧边菜单和按钮组合。

页面可视范围过小时,慎用此功能以免出现遮挡页面内容的情况。

开发者注意事项:

5.10.0 起,由于 Affix 组件由 class 重构为 FC,之前获取 ref 并调用内部实例方法的写法都会失效。

代码演示


最简单的用法。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code

target 设置 Affix 需要监听其滚动事件的元素,默认为 window

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code

可以获得是否固定的状态。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code

API

通用属性参考:通用属性

参数说明类型默认值
offsetBottom距离窗口底部达到指定偏移量后触发number-
offsetTop距离窗口顶部达到指定偏移量后触发number0
target设置 Affix 需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数() => HTMLElement() => window
onChange固定状态改变时触发的回调函数(affixed?: boolean) => void-

注意:Affix 内的元素不要使用绝对定位,如需要绝对定位的效果,可以直接设置 Affix 为绝对定位:

<Affix style={{ position: 'absolute', top: y, left: x }}>...</Affix>

FAQ

Affix 使用 target 绑定容器时,元素会跑到容器外。

从性能角度考虑,我们只监听容器滚动事件。如果希望任意滚动,你可以在窗体添加滚动监听:https://codesandbox.io/s/stupefied-maxwell-ophqnm?file=/index.js

相关 issue:#3938 #5642 #16120

Affix 在水平滚动容器中使用时, 元素 left 位置不正确。

Affix 一般只适用于单向滚动的区域,只支持在垂直滚动容器中使用。如果希望在水平容器中使用,你可以考虑使用 原生 position: sticky 实现。

相关 issue: #29108