v1/web/modules/contrib/blazy/js/plugin/blazy.viewport.js

119 lines
2.5 KiB
JavaScript

/**
* @file
* Provides reusable methods across lazyloaders: Bio and bLazy.
*
* @internal
* This is an internal part of the Blazy system and should only be used by
* blazy-related code in Blazy sub-modules.
* It is extending dBlazy as a separate plugin.
*/
(function ($, _win, _doc) {
'use strict';
$.ww = 0;
$.vp = {
top: 0,
right: 0,
bottom: 0,
left: 0
};
/**
* Returns element visibility.
*
* @private
*
* @param {Object|Element} el
* The bounding rect object, or HTML element to test.
* @param {Object} vp
* The window viewport.
*
* @return {bool}
* Returns true if visible.
*/
function isVisible(el, vp) {
var rect = $.isElm(el) ? $.rect(el) : el;
return rect.right >= vp.left &&
rect.bottom >= vp.top &&
rect.left <= vp.right &&
rect.top <= vp.bottom;
}
$.isVisible = function (e, vp) {
var target = e.target;
var el = target || e;
return $.isIo ? (e.isIntersecting || e.intersectionRatio > 0) : isVisible(el, vp);
};
$.isResized = function (scope, e) {
return (!!e.contentRect || !!scope.resizeTrigger || false);
};
/**
* Returns viewport info.
*
* @private
*
* @param {Element} offset
* The offset defined via UI normally related to header fixed position.
*
* @return {Object}
* Returns the window viewport info.
*/
function viewport(offset) {
offset = offset || 0;
var size = $.windowSize();
return {
top: 0 - offset,
left: 0 - offset,
bottom: size.height + offset,
right: size.width + offset
};
}
$.viewport = viewport;
// Must be called after initViewport and updateViewport.
$.windowData = function (opts, init) {
var me = this;
var offset = opts.offset || 100;
var mobileFirst = opts.mobileFirst || false;
if (init) {
me.initViewport(opts);
}
me.ww = me.vp.right - offset;
return {
vp: me.vp,
ww: me.ww,
up: mobileFirst
};
};
$.initViewport = function (opts) {
var me = this;
me.vp = viewport(opts.offset);
// me.vp.top = 0 - offset;
// me.vp.left = 0 - offset;
return me.vp;
};
$.updateViewport = function (opts) {
var me = this;
var offset = opts.offset;
me.vp.bottom = (_win.innerHeight || _doc.documentElement.clientHeight) + offset;
me.vp.right = (_win.innerWidth || _doc.documentElement.clientWidth) + offset;
return me.windowData(opts);
};
})(dBlazy, this, this.document);