npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

react-stickydiv

v4.0.0

Published

Stick any React element with CSS position: sticky

Readme

Sticky Div

React component that sticks an element with CSS position: sticky.

Requires React 18+ and a current evergreen browser. There is no Internet Explorer support.

Install

npm install react-stickydiv
import { StickyDiv } from 'react-stickydiv'

export function Page() {
  return (
    <StickyDiv offsetTop={16} zIndex={20} className="header">
      I stick when you scroll past me.
    </StickyDiv>
  )
}

require('react-stickydiv') still resolves to the component (CJS default export).

Props

| Prop | Type | Default | Description | | --- | --- | --- | --- | | offsetTop | number | 0 | Distance from the top of the scrollport. Maps to CSS top. | | zIndex | number | 9999 | Stacking order. | | className | string | — | Always applied (3.x only applied it while stuck). | | stuckClassName | string | — | Extra class while the element is stuck. | | onFixedChange | (fixed: boolean) => void | — | Fires when stuck state changes. true means stuck. Not called with false on mount. | | as | element type | 'div' | Render a different tag or component. | | style | CSSProperties | — | Merged with sticky positioning. position: sticky is always set. | | children | ReactNode | — | Rendered once. No hidden clone. |

ref and other HTML attributes are forwarded to the rendered element.

While stuck (and only when onFixedChange or stuckClassName is passed), the element gets a data-stuck attribute for CSS:

.header[data-stuck] {
  box-shadow: 0 4px 16px rgb(0 0 0 / 12%);
}

Stuck detection uses IntersectionObserver. If you pass neither onFixedChange nor stuckClassName, the component is a sticky element with no observers.

Scroll containers

position: sticky is scoped to the nearest scroll ancestor, not necessarily the window. That is what you want for a sticky bar inside an overflow: auto panel.

An ancestor with overflow: hidden, auto, or scroll that is not the intended scroller will prevent sticking. Move that overflow, or use overflow: clip when you only need to clip painting.

Avoid vertical margins on the sticky node (they interact poorly with sticky containing blocks). Use padding instead.

Next.js / RSC

The published bundle starts with 'use client', so you can import StickyDiv from a Server Component file.

Development

npm install
npm test          # unit tests
npm run dev       # playground at http://127.0.0.1:5173
npm run test:e2e  # Playwright against the playground
npm run build

Migrating from 3.x

4.0 is a rewrite. The old implementation used position: fixed, window scroll listeners, findDOMNode, and duplicated children while stuck.

| 3.x | 4.0 | | --- | --- | | createReactClass + require() | import { StickyDiv } from 'react-stickydiv' | | React 0.14 / 16 | React 18+ | | position: fixed + hidden clone | position: sticky | | Children rendered twice when stuck | Children once | | Window scroll only | Nearest scroll ancestor | | className only while stuck | Always applied | | onFixedChange documented but missing | Implemented | | Extra wrapper div | Single element (plus a 1px sentinel when observing stuck state) | | findDOMNode / string refs | ref forwarding |

See CHANGELOG.md for the full 4.0 list.

License

ISC