import { isNode, isNodeList } from '../utils/browser'
export function isElementVisible (element) {
var container = this.store.containers[element.containerId]
var viewFactor = element.config.viewFactor
var viewOffset = element.config.viewOffset
var elementBounds = {
top: element.geometry.bounds.top + element.geometry.height * viewFactor,
right: element.geometry.bounds.right - element.geometry.width * viewFactor,
bottom: element.geometry.bounds.bottom - element.geometry.height * viewFactor,
left: element.geometry.bounds.left + element.geometry.width * viewFactor,
}
var containerBounds = {
top: container.geometry.bounds.top + container.scroll.top + viewOffset.top,
right: container.geometry.bounds.right + container.scroll.left + viewOffset.right,
bottom: container.geometry.bounds.bottom + container.scroll.top + viewOffset.bottom,
left: container.geometry.bounds.left + container.scroll.left + viewOffset.left,
}
return elementBounds.top < containerBounds.bottom
&& elementBounds.right > containerBounds.left
&& elementBounds.bottom > containerBounds.top
&& elementBounds.left < containerBounds.right
|| element.styles.position === 'fixed'
}
export function getGeometry (target, isContainer) {
/**
* We want to ignore padding and scrollbars for container elements.
* More information here: https://goo.gl/vOZpbz
*/
var height = (isContainer) ? target.node.clientHeight : target.node.offsetHeight
var width = (isContainer) ? target.node.clientWidth : target.node.offsetWidth
var offsetTop = 0
var offsetLeft = 0
var node = target.node
do {
if (!isNaN(node.offsetTop)) {
offsetTop += node.offsetTop
}
if (!isNaN(node.offsetLeft)) {
offsetLeft += node.offsetLeft
}
node = node.offsetParent
} while (node)
return {
bounds: {
top: offsetTop,
right: offsetLeft + width,
bottom: offsetTop + height,
left: offsetLeft,
},
height: height,
width: width,
}
}
export function getNode (target, container) {
Eif ( container === void 0 ) container = document;
var node = null
if (typeof target === 'string') {
try {
node = container.querySelector(target)
if (!node) { logger(("Querying the selector \"" + target + "\" returned nothing.")) }
} catch (err) {
logger(("\"" + target + "\" is not a valid selector."))
}
}
return isNode(target) ? target : node
}
export function getNodes (target, container) {
Eif ( container === void 0 ) container = document;
if (isNode(target)) { return [target] }
if (isNodeList(target)) { return Array.prototype.slice.call(target) }
Eif (typeof target === 'string') {
try {
var query = container.querySelectorAll(target)
var nodes = Array.prototype.slice.call(query)
if (nodes.length) { return nodes }
logger(("Querying the selector \"" + target + "\" returned nothing."))
} catch (error) {
logger(("\"" + target + "\" is not a valid selector."))
}
}
return []
}
export function getScrolled (container) {
return (container.node === document.documentElement)
? {
top: window.pageYOffset,
left: window.pageXOffset,
} : {
top: container.node.scrollTop,
left: container.node.scrollLeft,
}
}
export function logger (message) {
var details = [], len = arguments.length - 1;
while ( len-- > 0 ) details[ len ] = arguments[ len + 1 ];
Eif (console) {
var report = "ScrollReveal: " + message
details.forEach(function (detail) { return report += "\n - " + detail; })
console.log(report) // eslint-disable-line no-console
}
}
|