7
|
1 /*!
|
|
2 * jQuery UI Effects Scale 1.10.4
|
|
3 * http://jqueryui.com
|
|
4 *
|
|
5 * Copyright 2014 jQuery Foundation and other contributors
|
|
6 * Released under the MIT license.
|
|
7 * http://jquery.org/license
|
|
8 *
|
|
9 * http://api.jqueryui.com/scale-effect/
|
|
10 *
|
|
11 * Depends:
|
|
12 * jquery.ui.effect.js
|
|
13 */
|
|
14 (function( $, undefined ) {
|
|
15
|
|
16 $.effects.effect.puff = function( o, done ) {
|
|
17 var elem = $( this ),
|
|
18 mode = $.effects.setMode( elem, o.mode || "hide" ),
|
|
19 hide = mode === "hide",
|
|
20 percent = parseInt( o.percent, 10 ) || 150,
|
|
21 factor = percent / 100,
|
|
22 original = {
|
|
23 height: elem.height(),
|
|
24 width: elem.width(),
|
|
25 outerHeight: elem.outerHeight(),
|
|
26 outerWidth: elem.outerWidth()
|
|
27 };
|
|
28
|
|
29 $.extend( o, {
|
|
30 effect: "scale",
|
|
31 queue: false,
|
|
32 fade: true,
|
|
33 mode: mode,
|
|
34 complete: done,
|
|
35 percent: hide ? percent : 100,
|
|
36 from: hide ?
|
|
37 original :
|
|
38 {
|
|
39 height: original.height * factor,
|
|
40 width: original.width * factor,
|
|
41 outerHeight: original.outerHeight * factor,
|
|
42 outerWidth: original.outerWidth * factor
|
|
43 }
|
|
44 });
|
|
45
|
|
46 elem.effect( o );
|
|
47 };
|
|
48
|
|
49 $.effects.effect.scale = function( o, done ) {
|
|
50
|
|
51 // Create element
|
|
52 var el = $( this ),
|
|
53 options = $.extend( true, {}, o ),
|
|
54 mode = $.effects.setMode( el, o.mode || "effect" ),
|
|
55 percent = parseInt( o.percent, 10 ) ||
|
|
56 ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
|
|
57 direction = o.direction || "both",
|
|
58 origin = o.origin,
|
|
59 original = {
|
|
60 height: el.height(),
|
|
61 width: el.width(),
|
|
62 outerHeight: el.outerHeight(),
|
|
63 outerWidth: el.outerWidth()
|
|
64 },
|
|
65 factor = {
|
|
66 y: direction !== "horizontal" ? (percent / 100) : 1,
|
|
67 x: direction !== "vertical" ? (percent / 100) : 1
|
|
68 };
|
|
69
|
|
70 // We are going to pass this effect to the size effect:
|
|
71 options.effect = "size";
|
|
72 options.queue = false;
|
|
73 options.complete = done;
|
|
74
|
|
75 // Set default origin and restore for show/hide
|
|
76 if ( mode !== "effect" ) {
|
|
77 options.origin = origin || ["middle","center"];
|
|
78 options.restore = true;
|
|
79 }
|
|
80
|
|
81 options.from = o.from || ( mode === "show" ? {
|
|
82 height: 0,
|
|
83 width: 0,
|
|
84 outerHeight: 0,
|
|
85 outerWidth: 0
|
|
86 } : original );
|
|
87 options.to = {
|
|
88 height: original.height * factor.y,
|
|
89 width: original.width * factor.x,
|
|
90 outerHeight: original.outerHeight * factor.y,
|
|
91 outerWidth: original.outerWidth * factor.x
|
|
92 };
|
|
93
|
|
94 // Fade option to support puff
|
|
95 if ( options.fade ) {
|
|
96 if ( mode === "show" ) {
|
|
97 options.from.opacity = 0;
|
|
98 options.to.opacity = 1;
|
|
99 }
|
|
100 if ( mode === "hide" ) {
|
|
101 options.from.opacity = 1;
|
|
102 options.to.opacity = 0;
|
|
103 }
|
|
104 }
|
|
105
|
|
106 // Animate
|
|
107 el.effect( options );
|
|
108
|
|
109 };
|
|
110
|
|
111 $.effects.effect.size = function( o, done ) {
|
|
112
|
|
113 // Create element
|
|
114 var original, baseline, factor,
|
|
115 el = $( this ),
|
|
116 props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
|
|
117
|
|
118 // Always restore
|
|
119 props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
|
|
120
|
|
121 // Copy for children
|
|
122 props2 = [ "width", "height", "overflow" ],
|
|
123 cProps = [ "fontSize" ],
|
|
124 vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
|
|
125 hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
|
|
126
|
|
127 // Set options
|
|
128 mode = $.effects.setMode( el, o.mode || "effect" ),
|
|
129 restore = o.restore || mode !== "effect",
|
|
130 scale = o.scale || "both",
|
|
131 origin = o.origin || [ "middle", "center" ],
|
|
132 position = el.css( "position" ),
|
|
133 props = restore ? props0 : props1,
|
|
134 zero = {
|
|
135 height: 0,
|
|
136 width: 0,
|
|
137 outerHeight: 0,
|
|
138 outerWidth: 0
|
|
139 };
|
|
140
|
|
141 if ( mode === "show" ) {
|
|
142 el.show();
|
|
143 }
|
|
144 original = {
|
|
145 height: el.height(),
|
|
146 width: el.width(),
|
|
147 outerHeight: el.outerHeight(),
|
|
148 outerWidth: el.outerWidth()
|
|
149 };
|
|
150
|
|
151 if ( o.mode === "toggle" && mode === "show" ) {
|
|
152 el.from = o.to || zero;
|
|
153 el.to = o.from || original;
|
|
154 } else {
|
|
155 el.from = o.from || ( mode === "show" ? zero : original );
|
|
156 el.to = o.to || ( mode === "hide" ? zero : original );
|
|
157 }
|
|
158
|
|
159 // Set scaling factor
|
|
160 factor = {
|
|
161 from: {
|
|
162 y: el.from.height / original.height,
|
|
163 x: el.from.width / original.width
|
|
164 },
|
|
165 to: {
|
|
166 y: el.to.height / original.height,
|
|
167 x: el.to.width / original.width
|
|
168 }
|
|
169 };
|
|
170
|
|
171 // Scale the css box
|
|
172 if ( scale === "box" || scale === "both" ) {
|
|
173
|
|
174 // Vertical props scaling
|
|
175 if ( factor.from.y !== factor.to.y ) {
|
|
176 props = props.concat( vProps );
|
|
177 el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
|
|
178 el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
|
|
179 }
|
|
180
|
|
181 // Horizontal props scaling
|
|
182 if ( factor.from.x !== factor.to.x ) {
|
|
183 props = props.concat( hProps );
|
|
184 el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
|
|
185 el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
|
|
186 }
|
|
187 }
|
|
188
|
|
189 // Scale the content
|
|
190 if ( scale === "content" || scale === "both" ) {
|
|
191
|
|
192 // Vertical props scaling
|
|
193 if ( factor.from.y !== factor.to.y ) {
|
|
194 props = props.concat( cProps ).concat( props2 );
|
|
195 el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
|
|
196 el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
|
|
197 }
|
|
198 }
|
|
199
|
|
200 $.effects.save( el, props );
|
|
201 el.show();
|
|
202 $.effects.createWrapper( el );
|
|
203 el.css( "overflow", "hidden" ).css( el.from );
|
|
204
|
|
205 // Adjust
|
|
206 if (origin) { // Calculate baseline shifts
|
|
207 baseline = $.effects.getBaseline( origin, original );
|
|
208 el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
|
|
209 el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
|
|
210 el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
|
|
211 el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
|
|
212 }
|
|
213 el.css( el.from ); // set top & left
|
|
214
|
|
215 // Animate
|
|
216 if ( scale === "content" || scale === "both" ) { // Scale the children
|
|
217
|
|
218 // Add margins/font-size
|
|
219 vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
|
|
220 hProps = hProps.concat([ "marginLeft", "marginRight" ]);
|
|
221 props2 = props0.concat(vProps).concat(hProps);
|
|
222
|
|
223 el.find( "*[width]" ).each( function(){
|
|
224 var child = $( this ),
|
|
225 c_original = {
|
|
226 height: child.height(),
|
|
227 width: child.width(),
|
|
228 outerHeight: child.outerHeight(),
|
|
229 outerWidth: child.outerWidth()
|
|
230 };
|
|
231 if (restore) {
|
|
232 $.effects.save(child, props2);
|
|
233 }
|
|
234
|
|
235 child.from = {
|
|
236 height: c_original.height * factor.from.y,
|
|
237 width: c_original.width * factor.from.x,
|
|
238 outerHeight: c_original.outerHeight * factor.from.y,
|
|
239 outerWidth: c_original.outerWidth * factor.from.x
|
|
240 };
|
|
241 child.to = {
|
|
242 height: c_original.height * factor.to.y,
|
|
243 width: c_original.width * factor.to.x,
|
|
244 outerHeight: c_original.height * factor.to.y,
|
|
245 outerWidth: c_original.width * factor.to.x
|
|
246 };
|
|
247
|
|
248 // Vertical props scaling
|
|
249 if ( factor.from.y !== factor.to.y ) {
|
|
250 child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
|
|
251 child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
|
|
252 }
|
|
253
|
|
254 // Horizontal props scaling
|
|
255 if ( factor.from.x !== factor.to.x ) {
|
|
256 child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
|
|
257 child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
|
|
258 }
|
|
259
|
|
260 // Animate children
|
|
261 child.css( child.from );
|
|
262 child.animate( child.to, o.duration, o.easing, function() {
|
|
263
|
|
264 // Restore children
|
|
265 if ( restore ) {
|
|
266 $.effects.restore( child, props2 );
|
|
267 }
|
|
268 });
|
|
269 });
|
|
270 }
|
|
271
|
|
272 // Animate
|
|
273 el.animate( el.to, {
|
|
274 queue: false,
|
|
275 duration: o.duration,
|
|
276 easing: o.easing,
|
|
277 complete: function() {
|
|
278 if ( el.to.opacity === 0 ) {
|
|
279 el.css( "opacity", el.from.opacity );
|
|
280 }
|
|
281 if( mode === "hide" ) {
|
|
282 el.hide();
|
|
283 }
|
|
284 $.effects.restore( el, props );
|
|
285 if ( !restore ) {
|
|
286
|
|
287 // we need to calculate our new positioning based on the scaling
|
|
288 if ( position === "static" ) {
|
|
289 el.css({
|
|
290 position: "relative",
|
|
291 top: el.to.top,
|
|
292 left: el.to.left
|
|
293 });
|
|
294 } else {
|
|
295 $.each([ "top", "left" ], function( idx, pos ) {
|
|
296 el.css( pos, function( _, str ) {
|
|
297 var val = parseInt( str, 10 ),
|
|
298 toRef = idx ? el.to.left : el.to.top;
|
|
299
|
|
300 // if original was "auto", recalculate the new value from wrapper
|
|
301 if ( str === "auto" ) {
|
|
302 return toRef + "px";
|
|
303 }
|
|
304
|
|
305 return val + toRef + "px";
|
|
306 });
|
|
307 });
|
|
308 }
|
|
309 }
|
|
310
|
|
311 $.effects.removeWrapper( el );
|
|
312 done();
|
|
313 }
|
|
314 });
|
|
315
|
|
316 };
|
|
317
|
|
318 })(jQuery);
|