body-scroll-freezer
v1.0.5
Published
Dependency-free JS module to freeze body scroll when opening modal box
Downloads
630
Readme
body-scroll-freezer
Dependency-free JS module to freeze body scroll when opening modal box.
Useful for modal, sliding-panel and lightbox interfaces.
<1kb minified.
A note on performance
Many other alternatives to this module listen to both mousewheel
and DOMMouseScroll
events in order to get some information from the DOM, which usually includes: Element.scrollTop
, event.deltaY
, Element.scrollHeight
or Element.clientHeight
. Check this StackOverflow answer as an example.
The problem is that most of those DOM operations (.scrollTop
and .scrollHeight
, for example) are expensive because they force layout/reflow. For more info on scrolling performance check out this article.
So, to avoid all that, body-scroll-freezer just assigns overflow: hidden;
and padding-right: [scrollWidth]px;
to the <body>
.
The overflow
avoids vertical move on the background when users are scrolling within the modal box. The padding-right
prevents horizontal jumps when hiding/showing the scrollbar.
Usage
// If no AMD/CommonJS: window.bodyScrollFreezer;
var bodyScroll = require('body-scroll-freezer');
1. Init to calculate scroll bar width.
// Note: declaring variable to store init() return is optional.
var scrollWidth = bodyScroll.init();
2. Turn scroll freeze ON when closing modal. Example:
document.querySelector('.modal-open').addEventListener('click', function() {
// Logic to show modal goes here
bodyScroll.freeze();
}, false);
3. Turn scroll freeze OFF when closing modal. Example:
document.querySelector('.modal-close').addEventListener('click', function() {
// Logic to hide modal goes here
bodyScroll.unfreeze();
}, false);