@micropackage/responsive-embeds
Version:
Makes any embed responsive, no markup changes required.
81 lines (66 loc) • 1.89 kB
JavaScript
import './polyfill';
const responsiveEmbeds = ( items, params = {} ) => {
const defaults = {
watch: false,
wrapClass: 'responsive-embed-wrap',
};
params = {
...defaults,
...params,
};
let observer = false;
const addItem = ( item ) => {
const
ration = item.clientHeight / item.clientWidth * 100,
wrap = document.createElement( 'div' );
wrap.style.position = 'relative';
wrap.style.paddingTop = `${ ration }%`;
wrap.classList.add( params.wrapClass );
item.style.position = 'absolute';
item.style.width = '100%';
item.style.height = `100%`;
item.style.top = '0';
item.parentNode.insertBefore( wrap, item );
wrap.appendChild( item );
};
if ( 'string' === typeof items ) {
const selector = items;
items = document.querySelectorAll( selector );
if ( true === params.watch ) {
params.watch = document.querySelector( 'body' );
} else if ( 'string' === typeof params.watch ) {
params.watch = document.querySelector( params.watch );
}
if ( params.watch instanceof HTMLElement ) {
// eslint-disable-next-line no-shadow
observer = new MutationObserver( ( records, observer ) => {
for ( const record of records ) {
for ( const node of record.addedNodes ) {
if ( node.matches( selector ) ) {
observer.disconnect();
addItem( node );
observer.observe( params.watch, {
childList: true,
subtree: true,
} );
}
}
}
} );
}
}
if ( items instanceof NodeList ) {
items.forEach( ( item ) => addItem( item ) );
} else if ( items instanceof HTMLElement ) {
addItem( items );
} else {
throw new Error( 'responsiveEmbeds(): argument should be a string selector, an HTMLElement or NodeList instance.' );
}
if ( observer ) {
observer.observe( params.watch, {
childList: true,
subtree: true,
} );
}
};
export default responsiveEmbeds;