Affix

Make an element sticky to viewport.

When To Use#

When user browses a long web page, some content need to stick to the viewport. This is common for menus and actions.

Please note that Affix should not cover other content on the page, especially when the size of the viewport is small.

Examples


The simplest usage.

import { Affix, Button } from 'antd';

ReactDOM.render(
  <div>
    <Affix>
      <Button type="primary">Affix top</Button>
    </Affix>
    <br />
    <Affix offsetBottom={0}>
      <Button type="primary">Affix bottom</Button>
    </Affix>
  </div>,
  mountNode
);

Set a target for 'Affix', which is listen to scroll event of target element (default is window).

import { Affix, Button } from 'antd';

class Demo extends React.Component {
  render() {
    return (
      <div className="scrollable-container" ref={(node) => { this.container = node; }}>
        <div className="background">
          <Affix target={() => this.container}>
            <Button type="primary">
              Fixed at the top of container
            </Button>
          </Affix>
        </div>
      </div>
    );
  }
}

ReactDOM.render(<Demo />, mountNode);

Callback with affixed state.

import { Affix, Button } from 'antd';

ReactDOM.render(
  <Affix offsetTop={120} onChange={affixed => console.log(affixed)}>
    <Button>120px to affix top</Button>
  </Affix>,
  mountNode
);

API#

PropertyDescriptionTypeDefault
offsetTopPixels to offset from top when calculating position of scrollnumber0
offsetBottomPixels to offset from bottom when calculating position of scrollnumber-
targetspecifies the scrollable area dom node() => HTMLElement() => window
onChangeCallback when affix state is changedFunction(affixed)-

Note: Children of Affix can not be position: absolute, but you can set Affix as position: absolute:

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