zzdom
Version:
A tiny javascript API that implements only the DOM functions of jquery including chaining.
122 lines (104 loc) • 3.78 kB
JavaScript
export const plugin = {};
plugin.register = function( zzDOM ){
this._registerUtils( zzDOM );
this._registerSS( zzDOM );
this._registerMM( zzDOM );
};
plugin._registerUtils = function( zzDOM ){
/* Visible */
zzDOM._dd = {};
zzDOM._getDefaultDisplay = function( el ) {
var nodeName = el.nodeName;
var display = zzDOM._dd[ nodeName ];
if ( display ) {
return display;
}
var doc = el.ownerDocument;
var temp = doc.body.appendChild( doc.createElement( nodeName ) );
display = getComputedStyle( temp )[ 'display' ];
temp.parentNode.removeChild( temp );
if ( display === 'none' ) {
display = 'block';
}
zzDOM._dd[ nodeName ] = display;
return display;
};
/* End of visible */
};
plugin._registerSS = function( zzDOM ){
/* Visible */
zzDOM.SS.prototype.hide = function () {
if ( this.isVisible() ){
this.attr(
'data-display',
getComputedStyle( this.el, null )[ 'display' ]
);
this.el.style.display = 'none';
}
return this;
};
zzDOM.SS.prototype.isVisible = function () {
return !! this.el.offsetParent;
//return getComputedStyle( this.el, null ).getPropertyValue( 'display' ) !== 'none';
};
zzDOM.SS.prototype.show = function () {
if ( ! this.isVisible() ){
var display = this.attr( 'data-display' );
this.el.style.display = display? display: zzDOM._getDefaultDisplay( this.el );
}
return this;
};
zzDOM.SS.prototype.toggle = function ( state ) {
var value = state !== undefined? ! state: this.isVisible();
return value? this.hide(): this.show();
};
/** @suppress {missingProperties} */
zzDOM.SS.prototype.fadeIn = function ( params = {} ) {
var { ms, callback } = params;
ms = ms || 400;
var finishFadeIn = () => {
this.el.removeEventListener( 'transitionend', finishFadeIn );
callback && callback();
};
this.el.style.transition = 'opacity 0s';
this.el.style.display = '';
this.el.style.opacity = 0;
requestAnimationFrame(() => {
requestAnimationFrame(() => {
this.el.addEventListener( 'transitionend', finishFadeIn );
this.el.style.transition = `opacity ${ms/1000}s`;
this.el.style.opacity = 1;
});
});
return this;
};
/** @suppress {missingProperties} */
zzDOM.SS.prototype.fadeOut = function ( params = {} ) {
var { ms, callback } = params;
ms = ms || 400;
var finishFadeOut = () => {
this.el.style.display = 'none';
this.el.removeEventListener( 'transitionend', finishFadeOut );
callback && callback();
};
this.el.style.transition = 'opacity 0s';
this.el.style.opacity = 1;
requestAnimationFrame(() => {
requestAnimationFrame(() => {
this.el.style.transition = `opacity ${ms/1000}s`;
this.el.addEventListener( 'transitionend', finishFadeOut );
this.el.style.opacity = 0;
});
});
return this;
};
/* End of visible */
};
plugin._registerMM = function( zzDOM ){
zzDOM.add( zzDOM.SS.prototype.fadeIn, zzDOM.MM.constructors.callback );
zzDOM.add( zzDOM.SS.prototype.fadeOut, zzDOM.MM.constructors.callback );
zzDOM.add( zzDOM.SS.prototype.hide );
zzDOM.add( zzDOM.SS.prototype.isVisible, zzDOM.MM.constructors.getVal );
zzDOM.add( zzDOM.SS.prototype.show );
zzDOM.add( zzDOM.SS.prototype.toggle );
};