zlide
Version:
Plain JavaScript to collapse or expand an element in height
185 lines (150 loc) • 5 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.zlide = factory());
}(this, (function () { 'use strict';
var root = typeof window !== 'undefined' ? window : global;
var rAF = root.requestAnimationFrame
? root.requestAnimationFrame.bind(root)
: function (callback) { return setTimeout(callback, 0); };
var rAF2 = function (callback) { return rAF(function () { return rAF(callback); }); };
var TRANSITION_END = 'transitionend';
var AEL = 'addEventListener';
var REL = 'removeEventListener';
var BCR = 'getBoundingClientRect';
var qs = function (expr, context) { return (context || document).querySelector(expr); };
var qsa = function (expr, context) { return [].slice.call((context || document).querySelectorAll(expr), 0); };
function parseProps(props) {
if (typeof props === 'string') {
return { element: qs(props) };
} else if (props instanceof Element) {
return { element: props };
} else if (typeof props === 'function') {
return parseProps(props());
}
return props || {};
}
function setToCollapsed(props) {
var ref = parseProps(props);
var element = ref.element;
var doneCallback = ref.doneCallback;
element.classList.add('zlide-inert');
element.style.maxHeight = '0px';
if (doneCallback) {
doneCallback({ type: 'collapsed' });
}
return this;
}
function setToExpanded(props) {
var ref = parseProps(props);
var element = ref.element;
var doneCallback = ref.doneCallback;
element.style.maxHeight = '';
element.classList.remove('zlide-inert');
if (doneCallback) {
doneCallback({ type: 'expanded' });
}
return this;
}
function collapse(props) {
var ref = parseProps(props);
var element = ref.element;
var beforeCallback = ref.beforeCallback;
var doneCallback = ref.doneCallback;
if (beforeCallback) {
beforeCallback({ type: 'collapsing' });
}
var ref$1 = element[BCR]();
var height = ref$1.height;
if (height === 0) {
setToCollapsed({ element: element, doneCallback: doneCallback });
return this;
}
var elTransitionBackup = element.style.transition;
element.style.transition = 'max-height 0s !important';
var transitionEvent = function (event) {
if (event.propertyName === 'max-height') {
element[REL](TRANSITION_END, transitionEvent);
setToCollapsed({ element: element, doneCallback: doneCallback });
}
};
rAF(function () {
element.style.maxHeight = height + "px";
element.style.transition = elTransitionBackup;
element[AEL](TRANSITION_END, transitionEvent);
rAF(function () {
element.style.maxHeight = '0px';
});
});
return this;
}
function expand(props) {
var ref = parseProps(props);
var element = ref.element;
var beforeCallback = ref.beforeCallback;
var doneCallback = ref.doneCallback;
if (beforeCallback) {
beforeCallback({ type: 'expanding' });
}
element.classList.remove('zlide-inert');
var transitionEvent = function (event) {
if (event.propertyName === 'max-height') {
element[REL](TRANSITION_END, transitionEvent);
setToExpanded({ element: element, doneCallback: doneCallback });
}
};
var elTransitionBackup = element.style.transition;
element.style.transition = 'max-height 0s !important';
rAF(function () {
/*
Same level of nested rAF as collapse to synchronize timing of animation.
*/
element.style.maxHeight = '';
var ref = element[BCR]();
var height = ref.height;
// const height = element.scrollHeight;
element.style.maxHeight = '0px';
element.style.transition = elTransitionBackup;
element[AEL](TRANSITION_END, transitionEvent);
rAF(function () {
element.style.maxHeight = height + "px";
});
});
}
function toggle(props) {
var ref = parseProps(props);
var element = ref.element;
var beforeCallback = ref.beforeCallback;
var doneCallback = ref.doneCallback;
if (element.classList.contains('zlide-inert')) {
expand({ element: element, beforeCallback: beforeCallback, doneCallback: doneCallback });
} else {
collapse({ element: element, beforeCallback: beforeCallback, doneCallback: doneCallback });
}
return this;
}
function applyDefaultStyleSheet() {
if (!qs('#zlide-stylesheet')) {
var sheet = document.createElement('style');
sheet.setAttribute('id', 'zlide-stylesheet');
sheet.innerHTML = "\n .zlide-inert{display:none !important;}\n ";
document.head.appendChild(sheet);
}
return this;
}
var zlide = function () {};
zlide.toggle = toggle;
zlide.collapse = collapse;
zlide.up = collapse;
zlide.expand = expand;
zlide.down = expand;
zlide.setToCollapsed = setToCollapsed;
zlide.setToExpanded = setToExpanded;
zlide.applyDefaultStyleSheet = applyDefaultStyleSheet;
zlide.rAF = rAF;
zlide.rAF2 = rAF2;
zlide.qs = qs;
zlide.qsa = qsa;
zlide.VERSION = '0.0.9';
return zlide;
})));