Scroller
A scroll container with custom scrollbar styling, optional fade-mask at the edges, and scroll-snap support. Use it inside fixed-size parents (panes, sidebars, modals) where the default browser scrollbar feels out of place.
Props
direction?: 'horizontal' | 'vertical' | 'both'
The scrollable axis.
Default: vertical
has-fade?: boolean
Apply a fade-mask at the scrollable edges that disappears when the user reaches the start or end.
snap?: 'mandatory' | 'proximity'
Enable scroll-snap on the main axis.
snap-align?: 'start' | 'center' | 'end'
Align direct children to the snap points (sets `scroll-snap-align` on direct children).
tag?: keyof HTMLElementTagNameMap
The HTML tag to use for the scroller.
Default: div
Slots
default
The scrollable content.
Examples
Vertical
A vertical scroller with custom scrollbar.
<template>
<FluxScroller style="height: 200px; width: 100%; padding: 9px">
<FluxFlex
direction="vertical"
:gap="6">
<PreviewColumn
v-for="i in 20"
:key="i">
Row {{ i }}
</PreviewColumn>
</FluxFlex>
</FluxScroller>
</template>
<script
setup
lang="ts">
import { FluxFlex, FluxScroller } from '@flux-ui/components';
</script>Horizontal
A horizontal scroller, useful for card rails.
<template>
<FluxScroller
direction="horizontal"
style="width: 100%; padding: 9px">
<FluxFlex :gap="9">
<PreviewColumn
v-for="i in 12"
:key="i"
style="flex: 0 0 160px">
Card {{ i }}
</PreviewColumn>
</FluxFlex>
</FluxScroller>
</template>
<script
setup
lang="ts">
import { FluxFlex, FluxScroller } from '@flux-ui/components';
</script>Snap
Combine `direction` and `snap` to create snap-scrolling lists.
<template>
<FluxScroller
direction="horizontal"
snap="mandatory"
snap-align="start"
style="width: 100%; padding: 9px">
<FluxFlex :gap="9">
<PreviewColumn
v-for="i in 8"
:key="i"
style="flex: 0 0 200px; height: 120px">
Slide {{ i }}
</PreviewColumn>
</FluxFlex>
</FluxScroller>
</template>
<script
setup
lang="ts">
import { FluxFlex, FluxScroller } from '@flux-ui/components';
</script>Fade
Use `has-fade` to fade out content as it approaches the scrollable edges.
<template>
<FluxScroller
has-fade
style="height: 240px; width: 100%; padding: 18px">
<FluxFlex
direction="vertical"
:gap="6">
<PreviewColumn
v-for="i in 30"
:key="i">
Row {{ i }}
</PreviewColumn>
</FluxFlex>
</FluxScroller>
</template>
<script
setup
lang="ts">
import { FluxFlex, FluxScroller } from '@flux-ui/components';
</script>