JSFiddle - React, Tailwind, and code Playground
by dumptyd
JavaScript
'use strict'
// Default configuration.
const defaultConfig = {
width: '100%',
height: '100%'
}
// Check for valid number.
const isNumber = input => Number(input) === Number(input)
// Add a class to an element.
const addClass = 'classList' in document.documentElement
? (element, className) => {
element.classList.add(className)
}
: (element, className) => {
const oldClass = element.getAttribute('class') || ''
element.setAttribute('class', `${oldClass} ${className}`)
}
/**
* Creates a HyperList instance that virtually scrolls very large amounts of
* data effortlessly.
*/
export default class HyperList {
static create (element, userProvidedConfig) {
return new HyperList(element, userProvidedConfig)
}
/**
* Merge given css style on an element
* @param {DOMElement} element
* @param {Object} style
*/
static mergeStyle (element, style) {
for (let i in style) {
if (element.style[i] !== style[i]) {
element.style[i] = style[i]
}
}
}
static getMaxBrowserHeight () {
// Create two elements, the wrapper is `1px` tall and is transparent and
// positioned at the top of the page. Inside that is an element that gets
// set to 1 billion pixels. Then reads the max height the browser can
// calculate.
const wrapper = document.createElement('div')
const fixture = document.createElement('div')
// As said above, these values get set to put the fixture elements into the
// right visual state.
HyperList.mergeStyle(wrapper, {position: 'absolute', height: '1px', opacity: 0})
HyperList.mergeStyle(fixture, {height: '1e7px'})
// Add the fixture into the wrapper element.
wrapper.appendChild(fixture)
// Apply to the page, the values won't kick in unless this is attached.
document.body.appendChild(wrapper)
// Get the maximum element height in pixels.
const maxElementHeight = fixture.offsetHeight
// Remove the element immediately after...