Socket
Socket
Sign inDemoInstall

react-on-sticky

Package Overview
Dependencies
2
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    react-on-sticky

A React implementation for position:sticky events


Version published
Weekly downloads
1
decreased by-75%
Maintainers
1
Created
Weekly downloads
 

Readme

Source

react-on-sticky

A React implementation of "An event for CSS position:sticky". Uses Intersection Obverser to trigger when an element is stickied. Please refer to the link for more details.

DEMO

Note

This is a pre-release, put this on npm for now so I can use it already for a personal project (unfortunately, i don't pay for npm private packages sob someone donate)

Getting started

yarn add react-on-sticky

The package consists of three components:

  • useStickyRoot (hook)
  • useOnSticky (hook)
  • StickyContainer

Usage

useOnStickyRoot

Use this hook within parent element/component of the targeted element which has position: sticky. Pass the ref provided by the hook into your parent element's ref.

import { useOnStickyRoot } from 'react-on-sticky';

function MyScrollableParentElement() {
  const [ stickyRootRef ] = useOnStickyRoot();

  return (
    <div
      ref={stickyRootRef}
      style={{
        position: 'absolute';
        overflowY: 'auto';
      }}>
      { children }
    </div>
  );
}

StickyContainer

The sticky container must wrap the target element with position: sticky. This component will inject invisibble header/footer sentinels which the IntersectionObserver will keep track of. Please see the reference article above in the introduction to learn more about the mechanics of this. Play around with the height/offset of the sentinels to get the exact trigger you're looking for.

propDescription
componentstring | JSX.Element - the dom element as string to render or a JSX Element as the wrapper
headerHeightstring | the height of the top sentinel
headerPositionstring | the position of the top sentinel relative to the top of the parent
footerHeightstring | the height of the bottom sentinel
footerPositionstring | the position of the bottom sentinel relative to the bottom of the parent
isDebugboolean | optional, render a visible border around the sentinels
import { useOnStickyRoot, StickyContainer } from 'react-on-sticky';

function MyScrollableParentElement() {
  const [ stickyRootRef ] = useOnStickyRoot();

  return (
    <div
      ref={stickyRootRef}
      style={{
        position: 'absolute';
        overflowY: 'auto';
      }}>
      <StickyContainer
        component="div" // string or a e.g. StyledComponent
        headerHeight="100px"
        headerPosition="0px" // from top
        footerHeight="2rem"
        footerPosition="4rem" // from bottom
      >
      </StickyContainer>
    </div>
  );
}

useOnSticky

The hook that will receive the on sticky event. In the reference article, it toggles a class. This does not do that, but it exposes a boolean isStuck value which you can then do anything under the sun with (including toggling classNames).

Important note: Make sure that the element that has position:sticky has a className sticky. Otherwise this won't work.

import { useOnStickyRoot, StickyContainer, useOnSticky } from 'react-on-sticky';

function MyScrollableParentElement() {
  const [ stickyRootRef ] = useOnStickyRoot();

  return (
    <div
      ref={stickyRootRef}
      style={{
        position: 'absolute';
        overflowY: 'auto';
      }}>
      <StickyContainer
        component="div" // string or a e.g. StyledComponent
        headerHeight="100px"
        headerPosition="0px" // from top
        footerHeight="2rem"
        footerPosition="4rem" // from bottom
      >
      </StickyContainer>
    </div>
  );
}

function MyStickyElement() {
  const id = "someId";
  // important: you need to pass in a unique id
  const [ isStuck ] = useOnSticky(id);

  useEffect(() => {
    console.log(isStuck);
  }, [isStuck]);

  return (
    <div
      className="sticky"
      id={id} // important: you need to pass in a unique id
      style={{
        position: 'sticky',
        top: '10px',
      }}>
      I'm stuck!
    </div>
  );
}

Keywords

FAQs

Last updated on 30 Jul 2020

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc