{"version":3,"file":"parallax.js","sources":["../src/browser.js","../src/consts.js","../src/utils.js","../src/Parallax.js"],"sourcesContent":["/* eslint-disable no-new-func, no-nested-ternary */\n\nlet win;\n\nif (typeof window === \"undefined\") {\n\t// window is undefined in node.js\n\twin = {\n\t\tdocument: {},\n\t\tnavigator: {\n\t\t\tuserAgent: \"\",\n\t\t},\n\t};\n} else {\n\twin = window;\n}\n/* eslint-enable no-new-func, no-nested-ternary */\n\nexport {win as window};\nexport const document = win.document;\n","import {window, document} from \"./browser\";\n\nconst ua = window.navigator.userAgent;\n\nexport const SUPPORT_COMPUTEDSTYLE = !!(\"getComputedStyle\" in window);\nexport const SUPPORT_ADDEVENTLISTENER = !!(\"addEventListener\" in document);\nexport const SUPPORT_PASSIVE = (() => {\n\tlet supportsPassiveOption = false;\n\n\ttry {\n\t\tif (SUPPORT_ADDEVENTLISTENER && Object.defineProperty) {\n\t\t\tdocument.addEventListener(\"test\", null, Object.defineProperty({},\n\t\t\t\t\"passive\", {\n\t\t\t\t\tget() {\n\t\t\t\t\t\tsupportsPassiveOption = true;\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\t}\n\t} catch (e) {}\n\treturn supportsPassiveOption;\n})();\n\nexport const IS_IE = /MSIE|Trident|Windows Phone|Edge/.test(ua);\nexport const IS_IOS = /iPhone|iPad/.test(ua);\nexport const IS_ANDROID2 = /Android 2\\./.test(ua);\nexport const CONTAINER_CLASSNAME = \"_eg-infinitegrid-container_\";\nexport const IGNORE_CLASSNAME = \"_eg-infinitegrid-ignore_\";\nexport const TRANSITION_NAME = \"_INFINITEGRID_TRANSITION\";\n\nexport const APPEND = true;\nexport const PREPEND = false;\nexport const VERTICAL = \"vertical\";\nexport const HORIZONTAL = \"horizontal\";\nexport const CACHE = true;\nexport const NO_CACHE = false;\nexport const TRUSTED = true;\nexport const NO_TRUSTED = false;\nexport const MULTI = true;\nexport const SINGLE = false;\nexport const DUMMY_POSITION = -100000;\nexport const GROUPKEY_ATT = \"data-groupkey\";\n\nexport const DEFAULT_OPTIONS = {\n\thorizontal: false,\n\tmargin: 0,\n};\n\nexport const agent = ua.toLowerCase();\nexport const isMobile = /mobi|ios|android/.test(agent);\n\nexport const ALIGN = {\n\tSTART: \"start\",\n\tCENTER: \"center\",\n\tEND: \"end\",\n\tJUSTIFY: \"justify\",\n};\n\nexport const IDLE = 0;\nexport const LOADING_APPEND = 1;\nexport const LOADING_PREPEND = 2;\nexport const PROCESSING = 4;\n\n\nconst webkit = /applewebkit\\/([\\d|.]*)/g.exec(agent);\n\nexport const WEBKIT_VERSION = (webkit && parseInt(webkit[1], 10)) || 0;\nexport const DEFENSE_BROWSER = (WEBKIT_VERSION && WEBKIT_VERSION < 537);\n\n\nexport const [TRANSFORM, TRANSITION, TRANSITION_END] = (function() {\n\tconst properties = {\n\t\ttransitionend: \"\",\n\t\twebkitTransitionEnd: \"-webkit-\",\n\t\toTransitionEnd: \"-o-\",\n\t\tmozTransitionEnd: \"-moz-\",\n\t};\n\n\tfor (const property in properties) {\n\t\tconst prefix = properties[property];\n\n\t\tif (`on${property.toLowerCase()}` in window) {\n\t\t\treturn [`${prefix}transform`, `${prefix}transition`, property];\n\t\t}\n\t}\n\treturn [];\n})();\n","import {window, document} from \"./browser\";\nimport {\n\tSUPPORT_COMPUTEDSTYLE,\n\tSUPPORT_ADDEVENTLISTENER,\n\tSUPPORT_PASSIVE,\n\tVERTICAL,\n\tHORIZONTAL,\n\tDEFAULT_OPTIONS,\n} from \"./consts\";\n\nexport function toArray(nodes) {\n\t// SCRIPT5014 in IE8\n\tconst array = [];\n\n\tif (nodes) {\n\t\tfor (let i = 0, len = nodes.length; i < len; i++) {\n\t\t\tarray.push(nodes[i]);\n\t\t}\n\t}\n\treturn array;\n}\nexport function matchHTML(html) {\n\treturn html.match(/^<([A-z]+)\\s*([^>]*)>/);\n}\n/**\n * Select or create element\n * @param {String|HTMLElement|jQuery} param\n * when string given is as HTML tag, then create element\n * otherwise it returns selected elements\n * @param {Boolean} multi\n * @returns {HTMLElement}\n */\nexport function $(param, multi = false) {\n\tlet el;\n\n\tif (typeof param === \"string\") { // String (HTML, Selector)\n\t\t// check if string is HTML tag format\n\t\tconst match = matchHTML(param);\n\n\t\t// creating element\n\t\tif (match) { // HTML\n\t\t\tconst dummy = document.createElement(\"div\");\n\n\t\t\tdummy.innerHTML = param;\n\t\t\tel = dummy.childNodes;\n\t\t} else { // Selector\n\t\t\tel = document.querySelectorAll(param);\n\t\t}\n\t\tif (multi) {\n\t\t\tel = toArray(el);\n\t\t} else {\n\t\t\tel = (el && el.length > 0 && el[0]) || undefined;\n\t\t}\n\t} else if (param === window) { // window\n\t\tel = param;\n\t} else if (param.nodeName &&\n\t\t(param.nodeType === 1 || param.nodeType === 9)) { // HTMLElement, Document\n\t\tel = param;\n\t} else if ((typeof window.jQuery === \"function\" && param instanceof window.jQuery) ||\n\t\tparam.constructor.prototype.jquery) { // jQuery\n\t\tel = $(multi ? param.toArray() : param.get(0), multi);\n\t} else if (Array.isArray(param)) {\n\t\tel = param.map(v => $(v));\n\t\tif (!multi) {\n\t\t\tel = el.length >= 1 ? el[0] : undefined;\n\t\t}\n\t}\n\treturn el;\n}\nexport function addEvent(element, type, handler, eventListenerOptions) {\n\tif (SUPPORT_ADDEVENTLISTENER) {\n\t\tlet options = eventListenerOptions || false;\n\n\t\tif (typeof eventListenerOptions === \"object\") {\n\t\t\toptions = SUPPORT_PASSIVE ? eventListenerOptions : false;\n\t\t}\n\t\telement.addEventListener(type, handler, options);\n\t} else if (element.attachEvent) {\n\t\telement.attachEvent(`on${type}`, handler);\n\t} else {\n\t\telement[`on${type}`] = handler;\n\t}\n}\nexport function removeEvent(element, type, handler) {\n\tif (element.removeEventListener) {\n\t\telement.removeEventListener(type, handler, false);\n\t} else if (element.detachEvent) {\n\t\telement.detachEvent(`on${type}`, handler);\n\t} else {\n\t\telement[`on${type}`] = null;\n\t}\n}\nexport function addOnceEvent(element, type, handler, eventListenerOptions) {\n\tconst callback = e => {\n\t\tremoveEvent(element, type, callback);\n\t\thandler(e);\n\t};\n\n\taddEvent(element, type, callback, eventListenerOptions);\n}\nexport function scroll(el, horizontal = false) {\n\tconst prop = `scroll${horizontal ? \"Left\" : \"Top\"}`;\n\n\tif (el === window) {\n\t\treturn window[horizontal ? \"pageXOffset\" : \"pageYOffset\"] || document.body[prop] || document.documentElement[prop];\n\t} else {\n\t\treturn el[prop];\n\t}\n}\nexport function scrollTo(el, x, y) {\n\tif (el === window) {\n\t\tel.scroll(x, y);\n\t} else {\n\t\tel.scrollLeft = x;\n\t\tel.scrollTop = y;\n\t}\n}\nexport function scrollBy(el, x, y) {\n\tif (el === window) {\n\t\tel.scrollBy(x, y);\n\t} else {\n\t\tel.scrollLeft += x;\n\t\tel.scrollTop += y;\n\t}\n}\nexport function getStyles(el) {\n\treturn (SUPPORT_COMPUTEDSTYLE ?\n\t\twindow.getComputedStyle(el) : el.currentStyle) || {};\n}\nfunction _getSize(el, name, isOffset) {\n\tif (el === window) { // WINDOW\n\t\treturn window[`inner${name}`] || document.body[`client${name}`];\n\t} else if (el.nodeType === 9) { // DOCUMENT_NODE\n\t\tconst doc = el.documentElement;\n\n\t\treturn Math.max(\n\t\t\tel.body[`scroll${name}`], doc[`scroll${name}`],\n\t\t\tel.body[`offset${name}`], doc[`offset${name}`],\n\t\t\tdoc[`client${name}`]\n\t\t);\n\t} else { // NODE\n\t\tlet size = 0;\n\n\t\tif (isOffset) {\n\t\t\tconst clientRect = el.getBoundingClientRect();\n\n\t\t\tsize = name === \"Width\" ? clientRect.right - clientRect.left : clientRect.bottom - clientRect.top;\n\t\t} else {\n\t\t\tsize = el[`client${name}`] || el[`offset${name}`];\n\t\t}\n\t\treturn parseFloat(size || getStyles(el)[name.toLowerCase()]) || 0;\n\t}\n}\nexport function innerWidth(el) {\n\treturn _getSize(el, \"Width\", false);\n}\nexport function innerHeight(el) {\n\treturn _getSize(el, \"Height\", false);\n}\nexport function outerWidth(el) {\n\treturn _getSize(el, \"Width\", true);\n}\nexport function outerHeight(el) {\n\treturn _getSize(el, \"Height\", true);\n}\nexport function getSize(el) {\n\treturn {\n\t\twidth: outerWidth(el),\n\t\theight: outerHeight(el),\n\t};\n}\nexport const STYLE = {\n\tvertical: {\n\t\tpos1: \"top\",\n\t\tendPos1: \"bottom\",\n\t\tsize1: \"height\",\n\t\tpos2: \"left\",\n\t\tendPos2: \"right\",\n\t\tsize2: \"width\",\n\t},\n\thorizontal: {\n\t\tpos1: \"left\",\n\t\tendPos1: \"right\",\n\t\tsize1: \"width\",\n\t\tpos2: \"top\",\n\t\tendPos2: \"bottom\",\n\t\tsize2: \"height\",\n\t},\n};\n\nexport function getStyleNames(isHorizontal) {\n\treturn STYLE[isHorizontal ? HORIZONTAL : VERTICAL];\n}\n\nexport function assignOptions(defaultOptions, options) {\n\treturn Object.assign({},\n\t\tDEFAULT_OPTIONS,\n\t\tdefaultOptions,\n\t\toptions);\n}\n\nexport function toZeroArray(outline) {\n\tif (!outline || !outline.length) {\n\t\treturn [0];\n\t}\n\treturn outline;\n}\nexport function cloneItems(items) {\n\treturn items.map(item => Object.assign({}, item));\n}\nexport function isWindow(el) {\n\treturn el === window;\n}\n\nexport function fill(arr, value) {\n\tconst length = arr.length;\n\n\tfor (let i = length - 1; i >= 0; --i) {\n\t\tarr[i] = value;\n\t}\n\n\treturn arr;\n}\n\nexport function isUndefined(target) {\n\treturn typeof target === \"undefined\";\n}\n","import {ALIGN, isMobile} from \"./consts\";\nimport {$, isWindow} from \"./utils\";\n\nconst style = {\n\t\"vertical\": {position: \"top\", size: \"height\", cammelSize: \"Height\", coordinate: \"Y\"},\n\t\"horizontal\": {position: \"left\", size: \"width\", cammelSize: \"Width\", coordinate: \"X\"},\n};\nconst {START, CENTER} = ALIGN;\nconst TRANSFORM = (function() {\n\tconst bodyStyle = (document.head || document.getElementsByTagName(\"head\")[0]).style;\n\tconst target = [\"transform\", \"webkitTransform\", \"msTransform\", \"mozTransform\"];\n\n\tfor (let i = 0, len = target.length; i < len; i++) {\n\t\tif (target[i] in bodyStyle) {\n\t\t\treturn target[i];\n\t\t}\n\t}\n\treturn \"\";\n})();\n\n/**\n * @classdesc Parallax is a displacement or difference in the apparent position of an object viewed along two different lines of sight. You can apply parallax by scrolling the image and speed of the item.\n * @ko Parallax는 서로 다른 두 개의 시선에서 바라본 물체의 외관상 위치의 변위 또는 차이입니다. 스크롤에 따라 이미지와 아이템의 속도를 차이를 줌으로써 parallax을 적용할 수 있습니다.\n * @class eg.Parallax\n * @param {Element|String} [root=window] Scrolling target. If you scroll in the body, set window. 스크롤하는 대상. 만약 body에서 스크롤하면 window로 설정한다.\n * @param {Object} [options] The option object of eg.Parallax module eg.Parallax 모듈의 옵션 객체\n * @param {Boolean} [options.horizontal=false] Direction of the scroll movement (false: vertical, true: horizontal) 스크롤 이동 방향 (false: 세로방향, true: 가로방향)\n * @param {Element|String} [options.container=null] Container wrapping items. If root and container have no gaps, do not set option. 아이템들을 감싸고 있는 컨테이너. 만약 root와 container간의 차이가 없으면, 옵션을 설정하지 않아도 된다.\n * @param {String} [options.selector=\"img\"] The selector of the image to apply the parallax in the item 아이템안에 있는 parallax를 적용할 이미지의 selector \n * @param {Boolean} [options.strength=1] Dimensions that indicate the sensitivity of parallax. The higher the strength, the faster.\n * @param {Boolean} [options.center=0] The middle point of parallax. The top is 1 and the bottom is -1. parallax가 가운데로 오는 점. 상단이 1이고 하단이 -1이다. \n * @param {Boolean} [options.range=[-1, 1]] Range to apply the parallax. The top is 1 and the bottom is -1. parallax가 적용되는 범위, 상단이 1이고 하단이 -1이다. \n * @param {Boolean} [options.align=\"start\"] The alignment of the image in the item. (\"start\" : top or left, \"center\": middle) 아이템안의 이미지의 정렬 \n * @example\n```\n\n```\n **/\nclass Parallax {\n\tconstructor(root = window, options = {}) {\n\t\tthis.options = Object.assign({\n\t\t\tcontainer: null,\n\t\t\tselector: \"img\",\n\t\t\tstrength: 1,\n\t\t\tcenter: 0,\n\t\t\trange: [-1, 1],\n\t\t\talign: START,\n\t\t\thorizontal: false,\n\t\t}, options);\n\t\tthis._root = $(root);\n\t\tthis._container = this.options.container && $(this.options.container);\n\t\tthis._rootSize = 0;\n\t\tthis._containerPosition = 0;\n\t\tthis._style = style[this.options.horizontal ? \"horizontal\" : \"vertical\"];\n\t\tthis.resize();\n\t}\n\t_checkParallaxItem(element) {\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\t\tconst selector = this.options.selector;\n\n\t\tif (!element.__IMAGE__) {\n\t\t\tconst img = element.querySelector(selector);\n\n\t\t\telement.__IMAGE__ = img || -1;\n\t\t\tif (element.__IMAGE__ === -1) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telement.__BOX__ = img.parentNode;\n\t\t}\n\t\tif (element.__IMAGE__ === -1) {\n\t\t\treturn;\n\t\t}\n\t\tconst sizeName = this._style.cammelSize;\n\n\t\telement.__IMAGE__.__SIZE__ = element.__IMAGE__[`offset${sizeName}`];\n\t\telement.__BOX__.__SIZE__ = element.__BOX__[`offset${sizeName}`];\n\t}\n\t/**\n\t * As the browser is resized, the gaps between the root and the container and the size of the items are updated.\n\t * @ko 브라우저의 크기가 변경됨으로 써 root와 container의 간격과 아이템들의 크기를 갱신한다.\n\t * @method eg.Parallax#resize\n\t * @param {Array} [items = []] Items to apply parallax. It does not apply if it is not in visible range. parallax를 적용할 아이템들. 가시거리에 존재하지 않으면 적용이 안된다.\n\t * @return {eg.Parallax} An instance of a module itself모듈 자신의 인스턴스\n\t * @example\n```js\nwindow.addEventListener(\"resize\", function (e) {\n\tparallax.resize(items);\n});\n```\n\t */\n\tresize(items = []) {\n\t\tconst root = this._root;\n\t\tconst container = this._container;\n\t\tconst positionName = this._style.position;\n\t\tconst sizeName = this._style.cammelSize;\n\n\t\tif (!container || root === container) {\n\t\t\tthis._containerPosition = 0;\n\t\t} else {\n\t\t\tconst rootRect = (isWindow(root) ? document.body : root).getBoundingClientRect();\n\t\t\tconst containertRect = container.getBoundingClientRect();\n\n\t\t\tthis._containerPosition = containertRect[positionName] - rootRect[positionName];\n\t\t}\n\t\tthis._rootSize = isWindow(root) ? window[`inner${sizeName}`] || document.documentElement[`client${sizeName}`] : root[`client${sizeName}`];\n\t\tif (isMobile & isWindow(root)) {\n\t\t\tconst bodyWidth = document.body.offsetWidth || document.documentElement.offsetWidth;\n\t\t\tconst windowWidth = window.innerWidth;\n\n\t\t\tthis._rootSize = this._rootSize / (bodyWidth / windowWidth);\n\t\t}\n\t\titems.forEach(item => {\n\t\t\tthis._checkParallaxItem(item.el);\n\t\t});\n\n\t\treturn this;\n\t}\n\t/**\n\t * Scrolls the image in the item by a parallax.\n\t * @ko 스크롤하면 아이템안의 이미지를 시차적용시킨다.\n\t * @method eg.Parallax#refresh\n\t * @param {Array} [items = []] Items to apply parallax. It does not apply if it is not in visible range. parallax를 적용할 아이템들. 가시거리에 존재하지 않으면 적용이 안된다.\n\t * @param {Number} [scrollPositionStart = 0] The scroll position.\n\t * @return {eg.Parallax} An instance of a module itself모듈 자신의 인스턴스\n\t * @example\n```js\ndocument.body.addEventListener(\"scroll\", function (e) {\n\tparallax.refresh(items, e.scrollTop);\n});\n```\n\t */\n\trefresh(items = [], scrollPositionStart = 0) {\n\t\tconst styleNames = this._style;\n\t\tconst positionName = styleNames.position;\n\t\tconst coordinateName = styleNames.coordinate;\n\t\tconst sizeName = styleNames.size;\n\t\tconst options = this.options;\n\t\tconst {strength, center, range, align} = options;\n\t\tconst rootSize = this._rootSize;\n\t\tconst scrollPositionEnd = scrollPositionStart + rootSize;\n\t\tconst containerPosition = this._containerPosition;\n\n\t\titems.forEach(item => {\n\t\t\tif (!item.rect || !item.size || !item.el) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst position = containerPosition + item.rect[positionName];\n\t\t\tconst itemSize = item.rect[sizeName] || item.size[sizeName];\n\n\t\t\t// check item is in container.\n\t\t\tif (scrollPositionStart > position + itemSize ||\n\t\t\t\tscrollPositionEnd < position) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst el = item.el;\n\n\t\t\tif (!el.__IMAGE__) {\n\t\t\t\tthis._checkParallaxItem(el);\n\t\t\t}\n\t\t\tif (el.__IMAGE__ === -1) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst imageElement = el.__IMAGE__;\n\t\t\tconst boxElement = el.__BOX__;\n\t\t\tconst boxSize = boxElement.__SIZE__;\n\t\t\tconst imageSize = imageElement.__SIZE__;\n\n\t\t\t// no parallax\n\t\t\tif (boxSize >= imageSize) {\n\t\t\t\t// remove transform style\n\t\t\t\timageElement.style[TRANSFORM] = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if area's position is center, ratio is 0.\n\t\t\t// if area is hidden at the top, ratio is 1.\n\t\t\t// if area is hidden at the bottom, ratio is -1.\n\t\t\tconst imagePosition = position + boxSize / 2;\n\t\t\tlet ratio = (scrollPositionStart + rootSize / 2 -\n\t\t\t\t(rootSize + boxSize) / 2 * center - imagePosition) /\n\t\t\t\t(rootSize + boxSize) * 2 * strength;\n\n\t\t\t// if ratio is out of the range of -1 and 1, show empty space.\n\t\t\tratio = Math.max(Math.min(ratio, range[1]), range[0]);\n\n\t\t\t// dist is the position when thumnail's image is centered.\n\t\t\tconst dist = (boxSize - imageSize) / 2;\n\t\t\tlet translate = dist * (1 - ratio);\n\n\t\t\tif (align === CENTER) {\n\t\t\t\ttranslate -= dist;\n\t\t\t}\n\n\t\t\timageElement.__TRANSLATE__ = translate;\n\t\t\timageElement.__RATIO__ = ratio;\n\t\t\timageElement.style[TRANSFORM] = `translate${coordinateName}(${translate}px)`;\n\t\t});\n\t\treturn this;\n\t}\n}\n\nexport default Parallax;\n"],"names":["win","window","document","navigator","userAgent","ua","SUPPORT_ADDEVENTLISTENER","SUPPORT_PASSIVE","supportsPassiveOption","Object","defineProperty","addEventListener","get","e","IS_IE","test","IS_IOS","IS_ANDROID2","agent","toLowerCase","isMobile","ALIGN","START","CENTER","END","JUSTIFY","webkit","exec","WEBKIT_VERSION","parseInt","properties","transitionend","webkitTransitionEnd","oTransitionEnd","mozTransitionEnd","property","prefix","TRANSFORM","TRANSITION","TRANSITION_END","toArray","nodes","array","i","len","length","push","matchHTML","html","match","$","param","multi","el","dummy","createElement","innerHTML","childNodes","querySelectorAll","undefined","nodeName","nodeType","jQuery","constructor","prototype","jquery","Array","isArray","map","v","isWindow","style","position","size","cammelSize","coordinate","bodyStyle","head","getElementsByTagName","target","Parallax","root","options","container","selector","strength","center","range","align","horizontal","_root","_container","_rootSize","_containerPosition","_style","resize","_checkParallaxItem","element","__IMAGE__","img","querySelector","__BOX__","parentNode","sizeName","__SIZE__","items","positionName","rootRect","body","getBoundingClientRect","containertRect","documentElement","bodyWidth","offsetWidth","windowWidth","innerWidth","forEach","item","refresh","scrollPositionStart","styleNames","coordinateName","rootSize","scrollPositionEnd","containerPosition","rect","itemSize","imageElement","boxElement","boxSize","imageSize","imagePosition","ratio","Math","max","min","dist","translate","__TRANSLATE__","__RATIO__"],"mappings":"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"}