UNPKG

12.2 kBJavaScriptView Raw
1/*!
2 * Copyright (c) 2017 NAVER Corp.
3 * @egjs/jquery-transform project is licensed under the MIT license
4 *
5 * @egjs/jquery-transform JavaScript library
6 *
7 *
8 * @version 2.0.0
9 */
10(function webpackUniversalModuleDefinition(root, factory) {
11 if(typeof exports === 'object' && typeof module === 'object')
12 module.exports = factory(require("jquery"));
13 else if(typeof define === 'function' && define.amd)
14 define("$Transform", ["jquery"], factory);
15 else if(typeof exports === 'object')
16 exports["$Transform"] = factory(require("jquery"));
17 else
18 root["eg"] = root["eg"] || {}, root["eg"]["$Transform"] = factory(root["jQuery"]);
19})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) {
20return /******/ (function(modules) { // webpackBootstrap
21/******/ // The module cache
22/******/ var installedModules = {};
23/******/
24/******/ // The require function
25/******/ function __webpack_require__(moduleId) {
26/******/
27/******/ // Check if module is in cache
28/******/ if(installedModules[moduleId]) {
29/******/ return installedModules[moduleId].exports;
30/******/ }
31/******/ // Create a new module (and put it into the cache)
32/******/ var module = installedModules[moduleId] = {
33/******/ i: moduleId,
34/******/ l: false,
35/******/ exports: {}
36/******/ };
37/******/
38/******/ // Execute the module function
39/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
40/******/
41/******/ // Flag the module as loaded
42/******/ module.l = true;
43/******/
44/******/ // Return the exports of the module
45/******/ return module.exports;
46/******/ }
47/******/
48/******/
49/******/ // expose the modules object (__webpack_modules__)
50/******/ __webpack_require__.m = modules;
51/******/
52/******/ // expose the module cache
53/******/ __webpack_require__.c = installedModules;
54/******/
55/******/ // identity function for calling harmony imports with the correct context
56/******/ __webpack_require__.i = function(value) { return value; };
57/******/
58/******/ // define getter function for harmony exports
59/******/ __webpack_require__.d = function(exports, name, getter) {
60/******/ if(!__webpack_require__.o(exports, name)) {
61/******/ Object.defineProperty(exports, name, {
62/******/ configurable: false,
63/******/ enumerable: true,
64/******/ get: getter
65/******/ });
66/******/ }
67/******/ };
68/******/
69/******/ // getDefaultExport function for compatibility with non-harmony modules
70/******/ __webpack_require__.n = function(module) {
71/******/ var getter = module && module.__esModule ?
72/******/ function getDefault() { return module['default']; } :
73/******/ function getModuleExports() { return module; };
74/******/ __webpack_require__.d(getter, 'a', getter);
75/******/ return getter;
76/******/ };
77/******/
78/******/ // Object.prototype.hasOwnProperty.call
79/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
80/******/
81/******/ // __webpack_public_path__
82/******/ __webpack_require__.p = "";
83/******/
84/******/ // Load entry module and return exports
85/******/ return __webpack_require__(__webpack_require__.s = 2);
86/******/ })
87/************************************************************************/
88/******/ ([
89/* 0 */
90/***/ (function(module, exports) {
91
92module.exports = __WEBPACK_EXTERNAL_MODULE_0__;
93
94/***/ }),
95/* 1 */
96/***/ (function(module, exports, __webpack_require__) {
97
98"use strict";
99
100
101exports.__esModule = true;
102exports.rateFn = exports.toMatrix = exports.toMatrix3d = undefined;
103
104var _jquery = __webpack_require__(0);
105
106var _jquery2 = _interopRequireDefault(_jquery);
107
108function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
109
110var $ = _jquery2["default"];
111
112/**
113 * Convert matrix string to array type.
114 *
115 * eg. matrix(1, 0, 0, 1, 0, 0) ==> ["matrix", [1, 0, 0, 1, 0, 0]]
116 * matrix3d(1,0,0,0,0,1,-2.44929e-16,0,0,2.44929e-16,1,0,0,0,0,1)
117 */
118function toMatrixArray(matrixStr) {
119 if (!matrixStr || matrixStr === "none") {
120 return ["matrix", ["1", "0", "0", "1", "0", "0"]];
121 }
122
123 var matched = matrixStr.replace(/\s/g, "").match(/(matrix)(3d)*\((.*)\)/);
124
125 return [matched[1] + (matched[2] || ""), matched[3].split(",")];
126}
127
128function toMatrix3d(matrix) {
129 var name = matrix[0];
130 var val = matrix[1];
131
132 if (name === "matrix3d") {
133 return matrix;
134 }
135
136 // matrix(a, b, c, d, tx, ty) is a shorthand for matrix3d(a, b, 0, 0, c, d, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1)
137 return [name + "3d", [val[0], val[1], "0", "0", val[2], val[3], "0", "0", "0", "0", "1", "0", val[4], val[5], "0", "1"]];
138}
139
140function unit(name) {
141 var ret = void 0;
142
143 if (name.indexOf("translate") >= 0) {
144 ret = "px";
145 } else if (name.indexOf("rotate") >= 0) {
146 ret = "deg";
147 } else {
148 ret = "";
149 }
150 return ret;
151}
152
153/**
154 * Get a 'px' converted value if it has a %.
155 * Otherwise it returns value appened with 'px'.
156 */
157function getConverted(val, base) {
158 var ret = val;
159 var num = val.match(/((-|\+)*[0-9]+)%/);
160
161 if (num && num.length >= 1) {
162 ret = base * (parseFloat(num[1]) / 100) + "px";
163 } else if (val.indexOf("px") === -1) {
164 ret = val + "px";
165 }
166
167 return ret;
168}
169
170/**
171 * Parse a transform atom value.
172 *
173 * "30px" --> {num: 30, unit: "px"}
174 *
175 * Because calculation of string number is heavy,
176 * In advance, convert a string number to a float number with an unit for the use of transformByPos,
177 * which is called very frequently.
178 */
179function toParsedFloat(val) {
180 var m = val.match(/((-|\+)*[\d|.]+)(px|deg|rad)*/);
181 var ret = void 0;
182
183 if (m && m.length >= 1) {
184 ret = { "num": parseFloat(m[1]), "unit": m[3] };
185 }
186 return ret;
187}
188
189function correctUnit(transform, width, height) {
190 var m = void 0;
191 var ret = "";
192 var arr = transform.split(")");
193
194 for (var i = 0, len = arr.length - 1; i < len; i++) {
195 var name = arr[i];
196
197 // '%' is only meaningful on translate.
198 if ((m = name.match(/(translate([XYZ]|3d)?|rotate)\(([^)]*)/)) && m.length > 1) {
199 if (m[1] === "rotate") {
200 if (m[3].indexOf("deg") === -1) {
201 name = m[1] + "(" + m[3] + "deg";
202 }
203 } else {
204 // 2d, 3d
205 var nums = m[3].split(",");
206 var bases = [width, height, 100];
207
208 switch (m[2]) {
209 case "X":
210 name = m[1] + "(" + getConverted(m[3], width);
211 break;
212 case "Y":
213 name = m[1] + "(" + getConverted(m[3], height);
214 break;
215 case "Z":
216 // Meaningless. Do nothing
217 break;
218 default:
219 for (var k = 0, l = nums.length; k < l; k++) {
220 nums[k] = getConverted(nums[k], bases[k]);
221 }
222 name = m[1] + "(" + nums.join(",");
223 break;
224 }
225 }
226 }
227
228 name = " " + name + ")";
229 ret += name;
230 }
231
232 // Remove wrong '%'s and '+=' because it cannot be translated to a matrix.
233 ret = ret.replace("%", "").replace("+=", "");
234 return ret;
235}
236
237// ["translate" , ["10", "20"]]
238function parseStyle(property) {
239 var m = property.match(/(\b\w+?)\((\s*[^)]+)/);
240 var name = void 0;
241 var value = void 0;
242 var result = ["", ""];
243
244 if (m && m.length > 2) {
245 name = m[1];
246 value = m[2].split(",");
247 value = $.map(value, function (v) {
248 return $.trim(v);
249 });
250 result = [$.trim(name), value];
251 }
252 return result;
253}
254
255function getTransformGenerateFunction(transform) {
256 var splitted = transform.split(")");
257 var list = [];
258
259 // Make parsed transform list.
260 for (var i = 0, len = splitted.length - 1; i < len; i++) {
261 var parsed = parseStyle(splitted[i]);
262
263 parsed[1] = $.map(parsed[1], toParsedFloat);
264 list.push(parsed);
265 }
266
267 var transformByPos = function transformByPos(pos) {
268 var ret = "";
269 var defaultVal = 0;
270
271 $.each(list, function (i) {
272 if (list[i][0].indexOf("scale") >= 0) {
273 defaultVal = 1;
274 } else {
275 defaultVal = 0;
276 }
277
278 var valStr = $.map(list[i][1], function (value) {
279 var val = value.num;
280
281 defaultVal === 1 && (val -= 1);
282 return defaultVal + val * pos + (value.unit || "");
283 }).join(",");
284
285 ret += list[i][0] + "(" + valStr + ") ";
286 });
287
288 return ret;
289 };
290
291 return transformByPos;
292}
293
294/**
295 * ["translate", [100, 0]] --> translate(100px, 0)
296 * {translate : [100, 0]} --> translate(100px, 0)
297 * {matrix : [1, 0, 1, 0, 100, 0]} --> matrix(1, 0, 1, 0, 100, 0)
298 */
299function data2String(property) {
300 var name = void 0;
301 var tmp = [];
302
303 if ($.isArray(property)) {
304 name = property[0];
305 var valExpression = property[1].join(unit(name) + ",");
306
307 return name + "(" + valExpression + unit(name) + ")";
308 } else {
309 for (name in property) {
310 tmp.push(name);
311 }
312 return $.map(tmp, function (v) {
313 return v + "(" + property[v] + unit(v) + ")";
314 }).join(" ");
315 }
316}
317
318function rateFn(element, startTf, endTf) {
319 var isRelative = endTf.indexOf("+=") >= 0;
320 var start = void 0;
321 var end = void 0;
322 var basePos = void 0;
323
324 // Convert translate unit to 'px'.
325 var endTfInPixel = correctUnit(endTf, parseFloat($.css(element, "width")) || 0, parseFloat($.css(element, "height")) || 0);
326
327 if (isRelative) {
328 start = !startTf || startTf === "none" ? "matrix(1, 0, 0, 1, 0, 0)" : startTf;
329 end = getTransformGenerateFunction(endTfInPixel);
330 } else {
331 start = toMatrixArray(startTf);
332 basePos = toMatrixArray("none"); // transform base-position
333
334 // If the type of matrix is not equal, then match to matrix3d
335 if (start[1].length < basePos[1].length) {
336 start = toMatrix3d(start);
337 } else if (start[1].length > basePos[1].length) {
338 basePos = toMatrix3d(basePos);
339 }
340
341 end = getTransformGenerateFunction(endTfInPixel);
342 }
343
344 return function (pos) {
345 var result = [];
346 var ret = ""; // matrix for interpolated value from current to base(1, 0, 0, 1, 0, 0)
347
348 if (isRelative) {
349 // This means a muliply between a matrix and a transform.
350 return start + end(pos);
351 }
352
353 if (pos === 1) {
354 ret = data2String(basePos);
355 } else {
356 for (var i = 0, s, e, l = start[1].length; i < l; i++) {
357 s = parseFloat(start[1][i]);
358 e = parseFloat(basePos[1][i]);
359
360 result.push(s + (e - s) * pos);
361 }
362
363 ret = data2String([start[0], result]);
364 }
365 return ret + end(pos);
366 };
367}
368
369exports.toMatrix3d = toMatrix3d;
370exports.toMatrix = toMatrixArray;
371exports.rateFn = rateFn;
372
373/***/ }),
374/* 2 */
375/***/ (function(module, exports, __webpack_require__) {
376
377"use strict";
378
379
380exports.__esModule = true;
381
382var _jquery = __webpack_require__(0);
383
384var _jquery2 = _interopRequireDefault(_jquery);
385
386var _transform = __webpack_require__(1);
387
388function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
389
390var $ = _jquery2["default"];
391
392/**
393 * @namespace jQuery
394 */
395if (!$) {
396 console.warn("jQuery is not defined.");
397} else {
398 /**
399 * A method that extends the <a href=http://api.jquery.com/animate/>.animate()</a> method provided by jQuery. With this method, you can use the transform property and 3D acceleration
400 * @ko jQuery의<a href=http://api.jquery.com/animate/>animate() 메서드</a>를 확장한 메서드. CSS의 transform 속성과 3D 가속을 사용할 수 있다.
401 * @name jQuery#animate
402 * @alias eg.Transform
403 * @method
404 * @param {Object} properties An object composed of the CSS property and value which will be applied to an animation<ko>애니메이션을 적용할 CSS 속성과 값으로 구성된 객체</ko>
405 * @param {Number|String} [duration=4000] Duration of the animation (unit: ms)<ko>애니메이션 진행 시간(단위: ms)</ko>
406 * @param {String} [easing="swing"] The easing function to apply to an animation<ko>애니메이션에 적용할 easing 함수</ko>
407 * @param {Function} [complete] A function that is called once the animation is complete.<ko>애니메이션을 완료한 다음 호출할 함수</ko>
408 *
409 * @example
410 * $("#box")
411 * .animate({"transform" : "translate3d(150px, 100px, 0px) rotate(20deg) scaleX(1)"} , 3000)
412 * .animate({"transform" : "+=translate3d(150px, 10%, -20px) rotate(20deg) scale3d(2, 4.2, 1)"} , 3000);
413 * @see {@link http://api.jquery.com/animate/}
414 *
415 * @support {"ie": "10+", "ch" : "latest", "sf" : "latest", "edge" : "latest", "ios" : "7+", "an" : "2.3+ (except 3.x)"}
416 */
417 $.fx.step.transform = function (fx) {
418 fx.rateFn = fx.rateFn || (0, _transform.rateFn)(fx.elem, fx.start, fx.end);
419 $.style(fx.elem, "transform", fx.rateFn(fx.pos));
420 };
421}
422
423exports["default"] = $;
424module.exports = exports["default"];
425
426/***/ })
427/******/ ]);
428});
\No newline at end of file