- 3.3KB minified and Gzipped
- No dependencies
- From the of @jlmakes
1. Getting Started
1.1. Installation
The simplest method is to copy paste this snippet just before your closing </body>
tag.
<script src="https://cdn.jsdelivr.net/scrollreveal.js/3.1.5/scrollreveal.min.js"></script>
But you can also:
- Download ZIP
npm install scrollreveal
bower install scrollreveal
1.2. The Basics
The reveal()
method is the primary API, and makes it easy to create and manage various types of animations.
<div class="foo"> Foo </div>
<div class="bar"> Bar </div>
window.sr = ScrollReveal();
sr.reveal('.foo');
sr.reveal('.bar');
1.3. Method Chaining
The ScrollReveal constructor, and it's primary methods all support chaining.
window.sr = ScrollReveal();
sr.reveal('.foo');
sr.reveal('.bar');
window.sr = ScrollReveal().reveal('.foo, .bar');
2. Configuration
Passing a configuration object to ScrollReveal()
changes the defaults for all reveals, and passing reveal()
a configuration object customizes that reveal set further.
2.1. Practical Example
window.sr = ScrollReveal({ reset: true });
sr.reveal('.foo', { duration: 200 });
2.2. The Starting Defaults
origin : 'bottom',
distance : '20px',
duration : 500,
delay : 0,
rotate : { x: 0, y: 0, z: 0 },
opacity : 0,
scale : 0.9,
easing : 'cubic-bezier(0.6, 0.2, 0.1, 1)',
container : null,
mobile : true,
reset : false,
useDelay : 'always',
viewFactor : 0.2,
viewOffset : { top: 0, right: 0, bottom: 0, left: 0 },
afterReveal : function(domEl) {},
afterReset : function(domEl) {}
3. Advanced
3.1. Sequenced Animations
You can pass a sequence interval (in milliseconds) to the reveal()
method, making sequenced animations a breeze.
Note: The interval is the time until the next element in the sequence begins its reveal, which is separate from the time until the element’s animation completes. In this example, the animation duration is 2 seconds, but the sequence interval is 50 milliseconds.
window.sr = ScrollReveal({ duration: 2000 });
sr.reveal('.box', 50);
window.sr = ScrollReveal();
sr.reveal('.box', { duration: 2000 }, 50);
3.2. Override Configurations
reveal()
is equipped to handle calls on the same element, so it's easy to override element configuration.
<div class="foo"> Foo </div>
<div class="foo" id="chocolate"> Chip </div>
var fooReveal = {
delay : 200,
distance : '90px',
easing : 'ease-in-out',
rotate : { z: 10 },
scale : 1.1
};
window.sr = ScrollReveal();
sr.reveal('.foo', fooReveal);
sr.reveal('#chocolate', { delay: 500, scale: 0.9 });
3.3. Working With DOM Nodes (e.g. React)
You are not just limited to using selectors with reveal()
, it also accepts a DOM node as the first argument.
sr.reveal(document.getElementById('chocolate'));
3.4. Custom/Multiple Containers
The default container is the viewport, but you can assign any container to any reveal set.
Tip: ScrollReveal works just as well with horizontally scrolling containers too!
<div id="fooContainer">
<div class="foo"> Foo 1 </div>
<div class="foo"> Foo 2 </div>
<div class="foo"> Foo 3 </div>
</div>
<div id="barContainer">
<div class="bar"> Bar 1 </div>
<div class="bar"> Bar 2 </div>
<div class="bar"> Bar 3 </div>
</div>
window.sr = ScrollReveal();
var fooContainer = document.getElementById('fooContainer');
sr.reveal('.foo', { container: fooContainer });
sr.reveal('.bar', { container: '#barContainer' });
3.5. Asynchronous Content
The sync()
method updates asynchronously loaded content with any existing reveal sets.
Example:
<div id="fooContainer">
<div class="foo">foo</div>
<div class="foo">foo</div>
<div class="foo">foo</div>
</div>
<div class="foo">foo async</div>
<div class="foo">foo async</div>
<div class="foo">foo async</div>
var fooContainer, content, sr, xmlhttp;
fooContainer = document.getElementById('fooContainer');
sr = ScrollReveal();
sr.reveal('.foo', { container: fooContainer });
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) {
if (xmlhttp.status == 200) {
var content = document.createElement('div');
content.innerHTML = xmlhttp.responseText;
content = content.childNodes;
for (var i = 0; i < content.length; i++) {
fooContainer.appendChild(content[ i ]);
};
sr.sync();
}
}
}
xmlhttp.open('GET', 'ajax.html', true);
xmlhttp.send();
4. Tips
4.1. Order Matters
It’s important that reveal()
calls be made as close to last in your page as possible, so that:
- Elements on the page have loaded
- Any other 3rd party libraries have had a chance to run
- Any other styles added to your elements wont be overwritten
Example:
<!DOCTYPE html>
<html>
<head>
<script src="js/scrollreveal.min.js"></script>
<script>
window.sr = ScrollReveal();
</script>
</head>
<body>
<div class="fooContainer">
<div class="fooReveal"> Foo </div>
<div class="fooReveal"> Foo </div>
<div class="fooReveal"> Foo </div>
</div>
<script>
sr.reveal('.fooReveal', { container: '.fooContainer' });
</script>
</body>
</html>
4.2. Improve User Experience
In most cases, your elements will start at opacity: 0
so they can fade in. However, since JavaScript loads after the page begins rendering, you might see your elements flickering as they begin rendering before being hidden by ScrollReveal's JavaScript.
The ideal solution is to set your reveal elements visibility to hidden in the <head>
of your page, to ensure they render hidden while your JavaScript loads:
Continuing our example from 4.1.
<!DOCTYPE html>
<html>
<head>
<script src="js/scrollreveal.min.js"></script>
<script>
window.sr = ScrollReveal();
if (sr.isSupported()) {
document.documentElement.classList.add('sr');
}
</script>
<style>
.sr .fooReveal { visibility: hidden; }
</style>
</head>
<body>
<div class="fooContainer">
<div class="fooReveal"> Foo </div>
<div class="fooReveal"> Foo </div>
<div class="fooReveal"> Foo </div>
</div>
<script>
sr.reveal('.fooReveal', { container: '.fooContainer' });
</script>
</body>
</html>
Note: If you prefer not to put styles in the <head>
of your page, including this style in your primary stylesheet will still help with element flickering since your CSS will likely load before your JavaScript.
4.3. Add Perspective to 3D Rotation
ScrollReveal supports 3d rotation out of the box, but you may want to emphasize the effect by specifying a perspective property on your container.
Continuing our example from 4.2.
<!DOCTYPE html>
<html>
<head>
<script src="js/scrollreveal.min.js"></script>
<script>
window.sr = ScrollReveal();
if (sr.isSupported()) {
document.documentElement.classList.add('sr');
}
</script>
<style>
.sr .fooReveal { visibility: hidden; }
.fooContainer { perspective: 800px; }
</style>
</head>
<body>
<div class="fooContainer">
<div class="fooReveal"> Foo </div>
<div class="fooReveal"> Foo </div>
<div class="fooReveal"> Foo </div>
</div>
<script>
sr.reveal('.fooReveal', { container: '.fooContainer', rotate: {x: 65} });
</script>
</body>
</html>
5. Appendix
Open source under the MIT License. ©2014–2016 Julian Lloyd.
5.1. Browser Compatibility
ScrollReveal works on any JavaScript enabled browser that supports both CSS Transform and CSS Transition. This includes Internet Explorer 10+, and most modern desktop and mobile browsers.
5.2. Issues and Reporting Bugs
Please search existing issues, before creating a new one; every issue is labeled and attended carefully. If you open a duplicate issue, it will be closed immediately.
If you cannot find your issue/bug in a previous ticket, please include details such as your browser, any other 3rd party JavaScript libraries you are using, and ideally a code sample demonstrating the problem. (Try JSBin)
5.3. Pull Requests
Feeling inspired? Please contribute! Optimizations, compatibility and bug fixes are greatly preferred over new features, but don’t be shy. One thing sorely missing from ScrollReveal right now is a test suite.
5.4. Showcase
Here are some cool sites using ScrollReveal:
Want to see your page here? Please send me your work (or of others) using ScrollReveal on Twitter (@jlmakes)
5.5. Special Thanks
ScrollReveal was inspired by the talented Manoela Ilic and her cbpScroller.js.