pagesnap
Version:
Lightweight full-page scrolling library in vanilla JavaScript.
164 lines (121 loc) • 3.44 kB
Markdown
# pagesnap
**pagesnap** is a lightweight, zero-dependency JavaScript library for creating full-page scrolling websites.
**Demo**: https://ppetkov89.github.io/pagesnap/
✅ Supports vertical scroll snapping
✅ Mouse, keyboard, and touch navigation
✅ URL hash anchors
✅ Looping scroll
✅ Callbacks + responsive behavior
✅ Destroy/rebuild support
✅ Tiny footprint & easy to integrate
## 🚀 Installation
```bash
npm install pagesnap
```
Or use via CDN:
```html
<script src="https://unpkg.com/pagesnap"></script>
```
## 🔧 Usage
### 1. HTML structure
```html
<div id="container">
<section id="home">Home</section>
<section id="about">About</section>
<section id="contact">Contact</section>
</div>
```
### 2. CSS (required)
```css
html, body {
margin: 0;
padding: 0;
overflow: hidden;
height: 100%;
}
#container {
height: 100vh;
}
section {
height: 100vh;
}
```
### 3. JavaScript
```javascript
import pagesnap from 'pagesnap';
const snap = pagesnap('#container', {
delay: 700,
loop: true,
hash: true,
disableBelow: 768,
onBeforeLeave: (from, to) => {
console.log('Leaving section:', from, '→', to);
},
onAfterLoad: (index) => {
console.log('Arrived at section:', index);
}
});
```
## ⚙️ Options
| Option | Type | Default | Description |
|------------------|----------|---------|--------------------------------------------------------------|
| `delay` | `number` | `700` | Transition delay in milliseconds |
| `loop` | `boolean`| `false` | Loop from last section to first and vice versa |
| `hash` | `boolean`| `false` | Enable hash-based navigation (e.g., `#about`) |
| `disableBelow` | `number` | `0` | Disable snapping if screen width is below this value |
| `onBeforeLeave` | `function`| `null` | Callback before a section change `(fromIndex, toIndex)` |
| `onAfterLoad` | `function`| `null` | Callback after a section change `(currentIndex)` |
## 📦 Public API
```javascript
snap.goTo(index); // Scroll to section index
snap.getCurrent(); // Returns current section index
snap.destroy(); // Disable pagesnap and unbind everything
snap.rebuild(); // Re-enable after destroy
```
## 🎨 Custom Styling (optional)
```css
.pagesnap-nav {
position: fixed;
top: 50%;
right: 20px;
transform: translateY(-50%);
display: flex;
flex-direction: column;
gap: 10px;
z-index: 1000;
}
.pagesnap-dot {
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid white;
background: rgba(255, 255, 255, 0.5);
cursor: pointer;
transition: background 0.3s;
}
.pagesnap-dot.active {
background: white;
}
```
## 📜 License
MIT License © 2025 Petko Petkov
Permission is granted to use, copy, modify, and distribute this software for any purpose.
This software is provided "as is" without warranty of any kind.
## ❤️ Credits
Built with love and simplicity.
Inspired by `fullPage.js` but with a lighter footprint and modern vanilla JavaScript design.
## 🔗 Roadmap (Optional)
- [ ] Horizontal slides support
- [ ] Lazy loading sections
- [ ] Smooth scroll-to-anchor on click
- [ ] Full accessibility (ARIA roles, focus trapping)