0.0.8 • Published 2 years ago

@studio-freight/locomotive-scroll v0.0.8

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

npm.io npm.io

Why

Locomotive Scroll seems to not be maintained anymore.

Installation

npm install @studio-freight/locomotive-scroll

Usage

Basic

With simple detection.

HTML

<h1 data-scroll>Hey</h1>
<p data-scroll>👋</p>

CSS

Add the base styles to your CSS file.

locomotive-scroll.css

JS

With a bundler
import LocomotiveScroll from '@studio-freight/locomotive-scroll';

const scroll = new LocomotiveScroll();
Or without
<script src="locomotive-scroll.min.js"></script>
<script>
    (function () {
        var scroll = new LocomotiveScroll();
    })();
</script>

Get the JS file.

Smooth

With smooth scrolling and parallax.

<div data-scroll-container>
    <div data-scroll-section>
        <h1 data-scroll>Hey</h1>
        <p data-scroll>👋</p>
    </div>
    <div data-scroll-section>
        <h2 data-scroll data-scroll-speed="1">What's up?</h2>
        <p data-scroll data-scroll-speed="2">😬</p>
    </div>
</div>
import LocomotiveScroll from '@studio-freight/locomotive-scroll';

const scroll = new LocomotiveScroll({
    el: document.querySelector('[data-scroll-container]'),
    smooth: true
});

Note: scroll-sections are optional but recommended to improve performance, particularly in long pages.

Advanced

Make it do what you want.

With methods

<section id="js-target">Come here please.</section>
import LocomotiveScroll from '@studio-freight/locomotive-scroll';

const scroll = new LocomotiveScroll();
const target = document.querySelector('#js-target');

scroll.scrollTo(target);

With events

<!-- Using modularJS -->
<div data-scroll data-scroll-call="function, module">Trigger</div>
<!-- Using jQuery events -->
<div data-scroll data-scroll-call="EVENT_NAME">Trigger</div>
<!-- Or do it your own way 😎 -->
<div data-scroll data-scroll-call="{y,o,l,o}">Trigger</div>
import LocomotiveScroll from '@studio-freight/locomotive-scroll';

const scroll = new LocomotiveScroll();

scroll.on('call', (func) => {
    // Using modularJS
    this.call(...func);
    // Using jQuery events
    $(document).trigger(func);
    // Or do it your own way 😎
});

Instance options

OptionTypeDefaultDescription
elobjectdocumentScroll container element.
namestring'scroll'Data attribute prefix (data-scroll-xxxx).
offsetarray(2)[0,0]Global in-view trigger offset : [bottom,top]Use a string with % to use a percentage of the viewport height.Use a numeric value for absolute pixels unit.E.g. ["30%",0], [100,0], ["30%", 100]
repeatbooleanfalseRepeat in-view detection.
smoothbooleanfalseSmooth scrolling.
initPositionobject{ x: 0, y: 0 }Smooth onlyAn object defining the initial scroll coordinates on a smooth instance. For example: { x: 0, y: 1000 }
directionstringverticalSmooth onlyScroll direction: vertical or horizontal
lerpnumber0.1Smooth onlyLinear interpolation (lerp) intensity. Float between 0 and 1.This defines the "smoothness" intensity. The closer to 0, the smoother.
getDirectionbooleanfalseAdd direction to scroll event.
getSpeedbooleanfalseAdd speed to scroll event.
classstringis-inviewElement in-view class.
initClassstringhas-scroll-initInitialize class.
scrollingClassstringhas-scroll-scrollingIs scrolling class.
draggingClassstringhas-scroll-draggingIs dragging class.
smoothClassstringhas-scroll-smoothHas smooth scrolling class.
scrollbarContainerobjectfalseSmooth onlySpecifies the container element for the scrollbar to be appended in. If false, scrollbar will be appended to the body.
scrollbarClassstringc-scrollbarSmooth onlyScrollbar element class.
multipliernumber1Smooth onlyFactor applied to the scroll delta, allowing to boost/reduce scrolling speed (regardless of the platform).
firefoxMultipliernumber50Smooth onlyBoost scrolling speed of Firefox on Windows.
touchMultipliernumber2Smooth onlyMultiply touch action to scroll faster than finger movement.
scrollFromAnywherebooleanfalseSmooth onlyBy default locomotive-scroll listens for scroll events only on the scroll container (el option). With this option set to true, it listens on the whole document instead.
gestureDirectionstringverticalSmooth onlyDefines which gesture direction(s) scrolls in your instance. You can use : verticalhorizontalboth
tablet & smartphoneobjectObject allowing to override some options for a particular context. You can specify: smoothdirectionhorizontalGestureFor tablet context you can also define breakpoint (integer, defaults to 1024) to set the max-width breakpoint for tablets.
reloadOnContextChangebooleanfalseAllows to reload the page when switching between desktop, tablet and smartphone contexts. It can be useful if your page changes a lot between contexts and you want to reset everything.
resetNativeScrollbooleantrueSets history.scrollRestoration = 'manual' and calls window.scrollTo(0, 0) on locomotive-scroll init in Native Class. Useful if you use transitions with native scrolling, otherwise we advise to set it to false if you don't want to break History API's scroll restoration feature.
autoRafbooleantrueDefines if locomotive-scroll should use its own raf or a custom one. If true you have to trigger .raf() manually.

Element attributes

AttributeValuesDescription
data-scrollDetect if in-view.
data-scroll-idstring(Optional) Useful if you want to scope your element and get the progress of your element in the viewport for example.
data-scroll-containerDefines the scroll container. Required for basic styling.
data-scroll-sectionDefines a scrollable section. Splitting your page into sections may improve performance.
data-scroll-classstringElement in-view class.
data-scroll-offsetstringElement in-view trigger offset : bottom,topFirst value is bottom offset, second (optional) is top offset. Percent is relative to viewport height, otherwise it's absolute pixels.E.g. "10", "100,50%", "25%, 15%"
data-scroll-repeatbooleanElement in-view detection repeat.
data-scroll-callstringElement in-view trigger call event.
data-scroll-positionstringtop, bottom, left or rightWindow position of in-view trigger.
data-scroll-speednumberSmooth onlyElement parallax speed. A negative value will reverse the direction.
data-scroll-delaynumberSmooth onlyElement's parallax lerp delay.
data-scroll-directionstringSmooth onlyElement's parallax direction. vertical or horizontal
data-scroll-stickySmooth onlySticky element. Starts and stops at data-scroll-target position.
data-scroll-targetstringSmooth onlyTarget element's in-view position.

Instance methods

MethodDescriptionArguments
init()Reinitializes the scroll.
on(eventName, function)Listen instance events ⬇.
update()Updates all element positions.
destroy()Destroys the scroll events.
start()Restarts the scroll events.
stop()Stops the scroll events.
scrollTo(target, options)Scroll to a target.target: Defines where you want to scroll. Available values types are :node : a dom elementstring : you can type your own selector, or use values "top" and "bottom" to reach scroll boundariesint : An absolute scroll coordinate in pixelsoptions (optional, object) : Settings object. Available values are: offset (integer) : Defines an offset from your target. E.g. -100 if you want to scroll 100 pixels above your targetcallback (function) : Called when scrollTo completes (note that it won't wait for lerp to stabilize)duration (integer) : Defines the duration of the scroll animation in milliseconds. Defaults to 1000Smooth onlyeasing (array) : An array of 4 floats between 0 and 1 defining the bezier curve for the animation's easing. Defaults to [0.25, 0.00, 0.35, 1.00]See http://greweb.me/bezier-easing-editor/example/Keep in mind this will also be affected by the lerp unless you set disableLerp to true.Smooth onlydisableLerp (boolean) : Lerp effect won't be applied if set to trueSmooth only

Instance events

EventArgumentsDescription
scrollobjReturns scroll instance (position, limit, speed, direction and current in-view elements).
callfuncTrigger if in-view. Returns your string or array if contains ,.

Progressive playing animations example (like gsap)

All data-scroll elements have a progress value. In the on scroll event you can get all current in-view elements.

HTML

<h1 data-scroll data-scroll-id="hey">Hey</h1>

JS

scroll.on('scroll', (args) => {
    // Get all current elements : args.currentElements
    if(typeof args.currentElements['hey'] === 'object') {
        let progress = args.currentElements['hey'].progress;
        console.log(progress);
        // ouput log example: 0.34
        // gsap example : myGsapAnimation.progress(progress);
    }
}

Dependencies

NameDescription
Virtual ScrollCustom scroll event with inertia/momentum.
modularScrollElements in viewport detection. Forked from it, not a dependency.
bezier-easingAllows to define an easing to scrollTo movement

Browser support

Works on most modern browsers. Chrome, Firefox, Safari, Edge...

To get IE 11 support, you need polyfills. You can use your own or include these before our script.

<script
    nomodule
    src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.6.0/polyfill.min.js"
    crossorigin="anonymous"
></script>
<script
    nomodule
    src="https://polyfill.io/v3/polyfill.min.js?features=Object.assign%2CElement.prototype.append%2CNodeList.prototype.forEach%2CCustomEvent%2Csmoothscroll"
    crossorigin="anonymous"
></script>

Who's using Locomotive Scroll?

Related

0.0.8

2 years ago

0.0.5

2 years ago

0.0.4

2 years ago

0.0.7

2 years ago

0.0.6

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

3 years ago