Smooth
What's Smooth?
Custom library to handle scroll.
There is 3 main things that Smooth can take care of for you :
- Wrapping a container ( usually the page ) and adding a smooth scroll ( with some lerping/momemtum to it )
- This can be some by keeping the real scroll and scrollbar for a more native experience
- Or this can be done using virtual-scroll for a more smooth experience
- Handling Parallax
- Smooth will act as a controller to handle parallax
- Scroll Trigger, to reveal element when they reach a certain
The library works on mobile but I recommend to keep the real scroll on mobile.
Usage
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<title>Title</title>
</head>
<body>
<main id="content">
<section class="page-wrapper">...</section>
</main>
</body>
</html>
Javascript
Create a smooth instance
import Smooth from '@timroussilhe/smooth';
this.smooth = new Smooth({
scrollElement: document.querySelector('.scroll-wrapper'),
scrollOptions: {
useVirtualScroll: false,
smoothContainer: true,
easing: 0.12,
friction: null,
}
});
this.smooth.start();
Add Scroll Elements
const elementParallax = {
el: document.querySelector('.scroll-wrapper'),
parallax: [
{
start: 0,
end: 500,
properties: [['translateY', 0, 250]],
easing: 'easeInOutCubic',
viewFactorStart: 0,
viewFactorEnd: 0,
},
],
};
const $footer = document.querySelector('footer');
const elementTrigger = {
el: $footer,
trigger: {
start: 'in-viewport',
end: 'out-viewport',
viewFactorStart: 0,
viewFactorEnd: 0,
callback: (before) => {
if (before === 0) {
$footer.classList.add('footer--in');
} else if (before === -1) {
$footer.classList.remove('footer--in');
}
},
},
};
this.smooth.addElements([elementParallax, elementTrigger]);
Reflow/resize
this.smooth.reset(this.getScrollElement());
this.smooth.resize();
API
Smooth Properties/Options
property |
type |
default |
description |
scrollElement |
DOM element |
null |
required DOM element for the Scroll wrapper |
scrollbarElement |
DOM element |
null |
optional DOM element for the Scrollbar container |
scrollOptions |
Object |
{} |
required Option for the Scroll |
scrollbarOptions |
Object |
{} |
optional Option for the Scroll |
Scroll Properties/Options
property |
type |
default |
description |
easing |
number |
0.5 |
easing value for the scroll |
friction |
number |
0.2 |
friction value for the scroll |
wheelDeltaMultiplier |
number |
0.45 |
Multiplier to add to the wheel delta |
maxWheel |
number |
400 |
Max value that the wheel event delta can get to |
autoUpdate |
boolean |
true |
Let Scroll update its own requestanimationframe loop |
useVirtualScroll |
boolean |
true |
Use virtual-scroll or the native scroll |
direction |
string |
vertical |
Direction of the scroll, vertical or horizontal |
infinite |
boolean |
false |
Infinite scroll will not stop the Scroll when reaching the limit of the scroll Wrapper. |
Scrollbar Properties/Options
property |
type |
default |
description |
orientation |
string |
vertical |
Orientation and placement of the scrollbar |
minSize |
number |
50 |
Smallest size that the Scrollbar thumb can reach |
fade |
boolean |
true |
If the Scrollbar thumb need to fade or not |
fadeTime |
number |
1200 |
Fade Timer duration |
className |
string |
scrollbar-thumb |
className of the generated Scrollbar |
updateScrollTarget |
function |
null |
Function to called when the Scrollbar get updated |
Smooth Element Option
property |
type |
description |
el |
DOM Element |
Target element |
trigger |
Object |
Trigger Item values |
parallax |
Array |
Array of Parallax Item values |
Smooth Element Paralaxe
property |
type |
description |
start |
string | number |
start value for the scroll element. This can be a number or use 'in-viewport' 'out-viewport' |
end |
string | number |
end value for the scroll element. This can be a number or use 'in-viewport' 'out-viewport' |
properties |
array |
Properties to animate, each property should be an array following this structure [property,valueStart,ValueEnd] ex: ['translateY', 0, 200]
|
viewFactorStart |
string | number |
factor to add to the start value, this can be a number that will be used as a factor of the element height or a fixed pixel value. Ex: 200px
|
viewFactorEnd |
string | number |
factor to add to the end value, this can be a number that will be used as a factor of the element height or a fixed pixel value. Ex: 200px
|
Smooth Element Trigger
property |
type |
description |
start |
string | number |
start value for the scroll element. This can be a number or use 'in-viewport' 'out-viewport' |
end |
string | number |
end value for the scroll element. This can be a number or use 'in-viewport' 'out-viewport' |
viewFactorStart |
string | number |
factor to add to the start value, this can be a number that will be used as a factor of the element height or a fixed pixel value. Ex: 200px
|
viewFactorEnd |
string | number |
factor to add to the end value, this can be a number that will be used as a factor of the element height or a fixed pixel value. Ex: 200px
|
callback |
function (scrollPosition) => {} |
callback function to be called when the trigger start or end scroll values are reached. scrollPosition is -1 for before, 0 for in, 1 for after. |
repeat |
boolean |
Repeat the callback function after the first trigger in. |
Smooth Method
Method |
Description |
start |
Start Smooth |
addElements(elements) |
Add Scroll Elements. Arguments: elements
|
reset(elements) |
Reset Scroll Elements. Usually used on resize |
disable |
Disable Smooth |
enable |
Enable Smooth |
scrollTo(target,direct) |
Set Scroll Position. Arguments: target : scroll position. direct scroll to the target with no animation |
resize(target) |
Resize Smooth. Arguments: target : you can provide a fixed height but this is not necessary |
destroy() |
Destroy Smooth instance and clear events. |
Live Examples