Super lightweight and fast scroll-syncing utility for React Native
Synchronize scroll positions between multiple scrollable components — ScrollView, FlatList, and SectionList — with a super simple API, zero dependencies, and buttery 60fps performance.
| Component | iOS | Android | Web |
|---|---|---|---|
ScrollView |
✅ | ✅ | ✅ |
FlatList |
✅ | ✅ | ✅ |
SectionList |
✅ | ✅ | ✅ |
📱 Scan this QR Code with the Expo Go app:
- 🧩 Perfect for collapsible headers, tab views, or split layouts
- 🧘♂️ Flexible — from simple synced lists to advanced animated layouts
- 🤝 Compatible with
react-native-gesture-handlerandreact-native-reanimated - ⚡️ Full JavaScript — no native code, no linking
- 📱 Expo Go compatible
- 🧵 Works with
ScrollView,FlatList, andSectionList - 🧠 Dead simple API
- 🛡️ Fully typed in TypeScript
- 🪶 Lightweight — a single file (~300 lines)
- 💨 Smooth 60fps scroll syncing
- 📦 Zero dependencies
npm install react-native-scroll-sync
# or
yarn add react-native-scroll-sync
# or
bun install react-native-scroll-syncimport { ScrollView } from 'react-native-scroll-sync';
export default function MyComponent() {
return (
<>
<ScrollView>
{/* ScrollView A */}
</ScrollView>
<ScrollView>
{/* ScrollView B */}
</ScrollView>
</>
);
}Use syncKey to group views explicitly, syncInterval to control the active sync range, and syncType to define how views synchronize.
import { ScrollView, FlatList, SectionList } from 'react-native-scroll-sync';
export default function MyComponent() {
return (
<>
<ScrollView syncKey="myGroup" syncInterval={[0, 1000]}>
{/* ScrollView content */}
</ScrollView>
<FlatList
syncKey="myGroup"
syncInterval={[0, 1000]}
data={[1, 2, 3]}
renderItem={({ item }) => <Text>{item}</Text>}
/>
<SectionList
syncKey="mySecondGroup"
syncType="relative"
syncInterval={[0, 500]}
sections={[{ title: 'A', data: ['x', 'y'] }]}
renderItem={({ item }) => <Text>{item}</Text>}
renderSectionHeader={({ section }) => <Text>{section.title}</Text>}
/>
</>
);
}All components expand the props of the original component.
| Prop | Type | Default | Description |
|---|---|---|---|
syncKey |
string |
undefined |
Identifier used to group multiple scroll views together |
syncInterval |
[number, number] |
undefined |
Scroll range (in pixels) within which synchronization should apply |
syncType |
'absolute' | 'relative' |
'absolute' |
Defines how synced views react inside the sync interval: • 'absolute': all views match the same scroll offset• 'relative': each view scrolls relative to its current position🔁 Only takes effect when syncInterval is defined |
- 🔑 Views with the same syncKey will scroll together.
- 📏 syncInterval prevents syncing outside of the specified vertical range (e.g. [0, 1000]).
- ⚙️ Use syncType with syncInterval to fine-tune how scroll positions are aligned or compensated.
See the contributing guide to learn how to contribute to the repository and the development workflow.
MIT
Made with create-react-native-library




