sticky-and-fixed-elements — Claude Code skill: sticky vs fixed UI
Decides what stays on screen while the user scrolls: sticky headers, bottom toolbars, floating action buttons, pinned table headers.
npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a claude-codeWhat sticky-and-fixed-elements does
The skill walks through the difference between position: fixed and position: sticky and tells you which one fits a given element. Fixed elements leave the document flow and hold one viewport position — global navigation, a bottom toolbar, a floating action button. Sticky elements stay in flow until they hit their scroll threshold, which suits table headers and section headings inside a scroll container.
You get ready CSS: a site header with matching padding-top on body, a sticky thead th, and named z-index tokens instead of ad-hoc values like z-index: 9999. A separate section covers how many fixed layers a page can carry before it gets crowded — usually one at the top, one at the bottom on mobile, and a single floating button. More than that is a signal to consolidate.
A review checklist closes it out: does the bottom toolbar respect env(safe-area-inset-bottom), does content bleed through behind a fixed block, is every z-index declared as a token. The skill activates on paths such as **/*.css, **/*.tsx and components/**, so it fires while you edit styles or components.
What it helps with
- choose between
stickyandfixedfor a site header - pin table headers inside a scroll container
- design a mobile bottom navigation bar
- add a floating action button for the primary action
- replace magic
z-indexnumbers with named tokens
Example prompts for the agent
- Should this header be sticky or fixed?
- Design a bottom toolbar for mobile with safe area handling
- Make the table headers sticky on scroll
How to install sticky-and-fixed-elements
1Skills CLI (Vercel)
npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a claude-code2Manually: put the files in place
~/.claude/skills/sticky-and-fixed-elements/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/sticky-and-fixed-elements/
1Skills CLI (Vercel)
npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a codex2Manually: put the files in place
.agents/skills/sticky-and-fixed-elements/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a cursor2Manually: put the files in place
.cursor/skills/sticky-and-fixed-elements/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install dembrandt/dembrandt-skills sticky-and-fixed-elements2Manually: put the files in place
.github/skills/sticky-and-fixed-elements/SKILL.md1Skills CLI (Vercel)
npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a gemini-cli2Platform CLI
gemini skills install https://github.com/dembrandt/dembrandt-skills --path skills/sticky-and-fixed-elementsManually: put the files in place
.devin/skills/sticky-and-fixed-elements/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about sticky-and-fixed-elements
How do I install sticky-and-fixed-elements in Claude?
Run npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a claude-code. The skill file lands at ~/.claude/skills/sticky-and-fixed-elements/SKILL.md.
What does sticky-and-fixed-elements do?
It helps you decide which UI elements stay visible during scroll and how to build them. Inside are a fixed vs sticky comparison, CSS snippets and a review checklist.
When should I use sticky instead of fixed?
Use sticky for elements scoped to a section or scroll container, such as table headers. Reserve fixed for truly global UI: navigation, bottom toolbars, floating buttons.
Source text
SKILL.md · MIT
---
name: sticky-and-fixed-elements
description: Sticky headers, bottom toolbars, floating action buttons and pinned table headers. Use when deciding what stays on screen while the user scrolls.
metadata:
priority: 6
pathPatterns:
- "**/*.css"
- "**/*.scss"
- "components/**"
- "src/components/**"
- "**/*.tsx"
- "**/*.jsx"
- "design-system/**"
promptSignals:
phrases:
- "sticky"
- "fixed"
- "position: fixed"
- "position: sticky"
- "toolbar"
- "bottom bar"
- "floating"
- "persistent header"
retrieval:
aliases:
- sticky header
- fixed toolbar
- bottom navigation
- floating action button
- sticky table header
- persistent UI
intents:
- keep header visible on scroll
- design a bottom toolbar
- add a floating action button
- make table headers sticky
- decide between sticky and fixed
examples:
- should the header be sticky or fixed
- design a bottom toolbar for mobile
- keep this toolbar visible while scrolling
---
# Sticky and Fixed Elements
## position: fixed vs position: sticky
| Property | Behaviour | Use for |
|---|---|---|
| `position: fixed` | Removed from document flow. Always stays at the same viewport position regardless of scroll or parent. | Global navigation header, bottom toolbar, floating action button |
| `position: sticky` | Stays in document flow until it hits its scroll threshold, then locks in place. Returns to flow when parent scrolls past. | Table column headers, section headings in a long list, in-page toolbars within a scroll container |
**Prefer `sticky` over `fixed`** when the element belongs to a specific section or scroll context. Fixed elements sit above everything and affect the entire viewport — use them only for truly global UI.
## Top — Navigation Header
The global navigation header is the most common fixed element. It should:
- Remain visible at all times so the user can always navigate away
- Be as thin as possible to maximise content area — 48–64px is a common range
- Have a background and shadow so content scrolling beneath it does not bleed through
- On scroll, a subtle shadow (`--shadow-sm`) signals that content is behind it
```css
.site-header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: var(--header-height);
background: var(--color-surface);
box-shadow: var(--shadow-sm);
z-index: var(--z-header);
}
```
Compensate for the fixed header with matching top padding on the page body:
```css
body { padding-top: var(--header-height); }
```
## Bottom — Toolbar on Mobile
On mobile, the bottom of the screen is the most reachable area with one thumb. A persistent bottom toolbar is the natural home for:
- Primary navigation (bottom tab bar — iOS and Android convention)
- Contextual actions for the current view (edit, share, delete)
- A floating action button (FAB) for the single most important action
Bottom toolbars should:
- Respect the safe area inset on devices with a home indicator: `padding-bottom: env(safe-area-inset-bottom)`
- Be visually separated from content (background fill, top border, or shadow)
- Contain 3–5 items maximum — more than 5 should move to a menu or a different pattern
- Use icons with labels for navigation tabs, or icons alone for contextual toolbars (with tooltips)
On desktop, bottom toolbars are uncommon. Status bars, editor toolbars, and command palettes are the desktop equivalent — these are typically `position: fixed` at the bottom or `position: sticky` within their scroll container.
## Sticky Table Headers
For data tables inside a scroll container, sticky column headers prevent the user from losing track of what each column means.
```css
thead th {
position: sticky;
top: 0;
background: var(--color-surface);
z-index: 1;
}
```
If the table also has a sticky first column (for row identifiers), the top-left cell needs both `top: 0` and `left: 0`, and a higher `z-index` to sit above both the header row and the sticky column.
## Stacking and Z-index
Sticky and fixed elements create stacking context. Define z-index as named tokens, not arbitrary numbers:
```css
--z-base: 0;
--z-dropdown: 100;
--z-sticky: 200;
--z-header: 300;
--z-modal: 400;
--z-toast: 500;
```
Every fixed or sticky element must declare its z-index explicitly using a token. Avoid ad-hoc values like `z-index: 9999` — they signal an unmanaged stacking context and will eventually conflict.
## How Many Fixed Layers Is Too Many
Each fixed layer removes space from the content area and adds visual complexity. A page should rarely need more than:
- 1 fixed header (top)
- 1 fixed toolbar or bottom nav (bottom, mobile)
- 1 floating action button or contextual overlay
A fixed header + fixed bottom toolbar + floating button + sticky sidebar + sticky table header all simultaneously is too many layers. Consolidate where possible.
## Review Checklist
- [ ] Is `sticky` used for section-scoped elements and `fixed` only for truly global UI?
- [ ] Does the fixed header compensate for its height with body padding?
- [ ] Does the bottom toolbar respect `env(safe-area-inset-bottom)` on mobile?
- [ ] Are all z-index values defined as named tokens, not arbitrary numbers?
- [ ] Is the total number of simultaneous fixed layers minimal — header + one bottom element maximum in most cases?
- [ ] Does content scrolling behind a fixed element not visually bleed through (background + shadow on the fixed element)?
© dembrandt · MIT · dembrandt/dembrandt-skills