slider-pro-js
Version:
Modular JavaScript slider that is dependency-free, rich-featured, flexible and easy to use
146 lines (114 loc) • 5.21 kB
JavaScript
class Fullscreen {
// The namespace to be used when adding event listeners
namespace = 'fullscreen';
// Reference to the base slider instance
slider;
// Stores the current settings of the slider
settings;
// Indicates whether the slider is currently in fullscreen mode
isFullscreen = false;
// Reference to the fullscreen button
fullscreenButtonEl = null;
// Reference to a set of settings that influence the slider's size
// before it goes fullscreen
sizeBeforeFullscreen = {};
// Default add-on settings
defaults = {
// Indicates whether the fullscreen button is enabled
fullscreen: false,
// Indicates whether the button will fade in only on hover
fadeFullscreen: true
};
// Stores references the event handlers in pairs containing the event identifier and the event handler
// in order to be able to retrieve them when they need to be removed
eventHandlerReferences = {};
constructor( slider ) {
this.slider = slider;
this.init();
}
init() {
if ( document.fullscreenEnabled === false ) {
return;
}
this.slider.addEventListener( 'update.' + this.namespace, this.updateHandler.bind( this ) );
}
// Create or remove the fullscreen button depending on the value of the 'fullscreen' option
updateHandler() {
this.settings = { ...this.defaults, ...this.slider.settings };
if ( this.settings.fullscreen === true && this.fullscreenButtonEl === null ) {
this.add();
} else if ( this.settings.fullscreen === false && this.fullscreenButtonEl !== null ) {
this.remove();
}
if ( this.settings.fullscreen === true ) {
if ( this.settings.fadeFullscreen === true ) {
this.fullscreenButtonEl.classList.add( 'sp-fade-fullscreen' );
} else if ( this.settings.fadeFullscreen === false ) {
this.fullscreenButtonEl.classList.remove( 'sp-fade-fullscreen' );
}
}
}
// Create the fullscreen button
add() {
this.fullscreenButtonEl = document.createElement('div');
this.fullscreenButtonEl.classList.add( 'sp-fullscreen-button' );
this.slider.sliderEl.appendChild( this.fullscreenButtonEl );
const fullscreenButtonClickHandlerReference = () => {
this.fullscreenButtonClickHandler();
};
this.eventHandlerReferences['click.fullscreenButton'] = fullscreenButtonClickHandlerReference;
this.fullscreenButtonEl.addEventListener( 'click', fullscreenButtonClickHandlerReference );
const fullscreenChangeHandlerReference = () => {
this.fullscreenChangeHandler();
};
this.eventHandlerReferences['fullscreenchange'] = fullscreenChangeHandlerReference;
document.addEventListener( 'fullscreenchange', fullscreenChangeHandlerReference );
}
// Remove the fullscreen button
remove() {
if ( this.fullscreenButtonEl !== null ) {
const fullscreenButtonClickHandlerReference = this.eventHandlerReferences['click.fullscreenButton'];
this.fullscreenButtonEl.removeEventListener( 'click', fullscreenButtonClickHandlerReference );
this.fullscreenButtonEl.remove();
this.fullscreenButtonEl = null;
const fullscreenChangeHandlerReference = this.eventHandlerReferences['fullscreenchange'];
document.removeEventListener( 'fullscreenchange', fullscreenChangeHandlerReference );
}
}
// When the fullscreen button is clicked, put the slider into fullscreen mode, and
// take it out of the fullscreen mode when it's clicked again.
fullscreenButtonClickHandler() {
if ( this.isFullscreen === false ) {
this.slider.sliderEl.requestFullscreen();
} else {
document.exitFullscreen();
}
}
// This will be called whenever the fullscreen mode changes.
// If the slider is in fullscreen mode, set it to 'full window', and if it's
// not in fullscreen mode anymore, set it back to the original size.
fullscreenChangeHandler() {
this.isFullscreen = document.fullscreenElement ? true : false;
if ( this.isFullscreen === true ) {
this.sizeBeforeFullscreen = {
forceSize: this.settings.forceSize,
autoHeight: this.settings.autoHeight
};
this.slider.sliderEl.classList.add( 'sp-fullscreen' );
this.slider.settings.forceSize = 'fullWindow';
this.slider.settings.autoHeight = false;
} else {
this.slider.sliderEl.style.margin = '';
this.slider.sliderEl.classList.remove( 'sp-fullscreen' );
this.slider.settings.forceSize = this.sizeBeforeFullscreen.forceSize;
this.slider.settings.autoHeight = this.sizeBeforeFullscreen.autoHeight;
}
this.slider.resize();
}
// Destroy the module
destroy() {
this.slider.removeEventListener( 'update.' + this.namespace );
this.remove();
}
}
export default Fullscreen;