0
|
1 define( [
|
|
2 "./core",
|
|
3 "./var/pnum",
|
|
4 "./core/access",
|
|
5 "./core/camelCase",
|
|
6 "./var/document",
|
|
7 "./var/rcssNum",
|
|
8 "./css/var/rnumnonpx",
|
|
9 "./css/var/cssExpand",
|
|
10 "./css/var/getStyles",
|
|
11 "./css/var/swap",
|
|
12 "./css/curCSS",
|
|
13 "./css/adjustCSS",
|
|
14 "./css/addGetHookIf",
|
|
15 "./css/support",
|
|
16
|
|
17 "./core/init",
|
|
18 "./core/ready",
|
|
19 "./selector" // contains
|
|
20 ], function( jQuery, pnum, access, camelCase, document, rcssNum, rnumnonpx, cssExpand,
|
|
21 getStyles, swap, curCSS, adjustCSS, addGetHookIf, support ) {
|
|
22
|
|
23 "use strict";
|
|
24
|
|
25 var
|
|
26
|
|
27 // Swappable if display is none or starts with table
|
|
28 // except "table", "table-cell", or "table-caption"
|
|
29 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
|
|
30 rdisplayswap = /^(none|table(?!-c[ea]).+)/,
|
|
31 rcustomProp = /^--/,
|
|
32 cssShow = { position: "absolute", visibility: "hidden", display: "block" },
|
|
33 cssNormalTransform = {
|
|
34 letterSpacing: "0",
|
|
35 fontWeight: "400"
|
|
36 },
|
|
37
|
|
38 cssPrefixes = [ "Webkit", "Moz", "ms" ],
|
|
39 emptyStyle = document.createElement( "div" ).style;
|
|
40
|
|
41 // Return a css property mapped to a potentially vendor prefixed property
|
|
42 function vendorPropName( name ) {
|
|
43
|
|
44 // Shortcut for names that are not vendor prefixed
|
|
45 if ( name in emptyStyle ) {
|
|
46 return name;
|
|
47 }
|
|
48
|
|
49 // Check for vendor prefixed names
|
|
50 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
|
|
51 i = cssPrefixes.length;
|
|
52
|
|
53 while ( i-- ) {
|
|
54 name = cssPrefixes[ i ] + capName;
|
|
55 if ( name in emptyStyle ) {
|
|
56 return name;
|
|
57 }
|
|
58 }
|
|
59 }
|
|
60
|
|
61 // Return a property mapped along what jQuery.cssProps suggests or to
|
|
62 // a vendor prefixed property.
|
|
63 function finalPropName( name ) {
|
|
64 var ret = jQuery.cssProps[ name ];
|
|
65 if ( !ret ) {
|
|
66 ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
|
|
67 }
|
|
68 return ret;
|
|
69 }
|
|
70
|
|
71 function setPositiveNumber( elem, value, subtract ) {
|
|
72
|
|
73 // Any relative (+/-) values have already been
|
|
74 // normalized at this point
|
|
75 var matches = rcssNum.exec( value );
|
|
76 return matches ?
|
|
77
|
|
78 // Guard against undefined "subtract", e.g., when used as in cssHooks
|
|
79 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
|
|
80 value;
|
|
81 }
|
|
82
|
|
83 function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
|
|
84 var i = dimension === "width" ? 1 : 0,
|
|
85 extra = 0,
|
|
86 delta = 0;
|
|
87
|
|
88 // Adjustment may not be necessary
|
|
89 if ( box === ( isBorderBox ? "border" : "content" ) ) {
|
|
90 return 0;
|
|
91 }
|
|
92
|
|
93 for ( ; i < 4; i += 2 ) {
|
|
94
|
|
95 // Both box models exclude margin
|
|
96 if ( box === "margin" ) {
|
|
97 delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
|
|
98 }
|
|
99
|
|
100 // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
|
|
101 if ( !isBorderBox ) {
|
|
102
|
|
103 // Add padding
|
|
104 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
|
|
105
|
|
106 // For "border" or "margin", add border
|
|
107 if ( box !== "padding" ) {
|
|
108 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
|
|
109
|
|
110 // But still keep track of it otherwise
|
|
111 } else {
|
|
112 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
|
|
113 }
|
|
114
|
|
115 // If we get here with a border-box (content + padding + border), we're seeking "content" or
|
|
116 // "padding" or "margin"
|
|
117 } else {
|
|
118
|
|
119 // For "content", subtract padding
|
|
120 if ( box === "content" ) {
|
|
121 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
|
|
122 }
|
|
123
|
|
124 // For "content" or "padding", subtract border
|
|
125 if ( box !== "margin" ) {
|
|
126 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
|
|
127 }
|
|
128 }
|
|
129 }
|
|
130
|
|
131 // Account for positive content-box scroll gutter when requested by providing computedVal
|
|
132 if ( !isBorderBox && computedVal >= 0 ) {
|
|
133
|
|
134 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
|
|
135 // Assuming integer scroll gutter, subtract the rest and round down
|
|
136 delta += Math.max( 0, Math.ceil(
|
|
137 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
|
|
138 computedVal -
|
|
139 delta -
|
|
140 extra -
|
|
141 0.5
|
|
142 ) );
|
|
143 }
|
|
144
|
|
145 return delta;
|
|
146 }
|
|
147
|
|
148 function getWidthOrHeight( elem, dimension, extra ) {
|
|
149
|
|
150 // Start with computed style
|
|
151 var styles = getStyles( elem ),
|
|
152 val = curCSS( elem, dimension, styles ),
|
|
153 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
|
|
154 valueIsBorderBox = isBorderBox;
|
|
155
|
|
156 // Support: Firefox <=54
|
|
157 // Return a confounding non-pixel value or feign ignorance, as appropriate.
|
|
158 if ( rnumnonpx.test( val ) ) {
|
|
159 if ( !extra ) {
|
|
160 return val;
|
|
161 }
|
|
162 val = "auto";
|
|
163 }
|
|
164
|
|
165 // Check for style in case a browser which returns unreliable values
|
|
166 // for getComputedStyle silently falls back to the reliable elem.style
|
|
167 valueIsBorderBox = valueIsBorderBox &&
|
|
168 ( support.boxSizingReliable() || val === elem.style[ dimension ] );
|
|
169
|
|
170 // Fall back to offsetWidth/offsetHeight when value is "auto"
|
|
171 // This happens for inline elements with no explicit setting (gh-3571)
|
|
172 // Support: Android <=4.1 - 4.3 only
|
|
173 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
|
|
174 if ( val === "auto" ||
|
|
175 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
|
|
176
|
|
177 val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
|
|
178
|
|
179 // offsetWidth/offsetHeight provide border-box values
|
|
180 valueIsBorderBox = true;
|
|
181 }
|
|
182
|
|
183 // Normalize "" and auto
|
|
184 val = parseFloat( val ) || 0;
|
|
185
|
|
186 // Adjust for the element's box model
|
|
187 return ( val +
|
|
188 boxModelAdjustment(
|
|
189 elem,
|
|
190 dimension,
|
|
191 extra || ( isBorderBox ? "border" : "content" ),
|
|
192 valueIsBorderBox,
|
|
193 styles,
|
|
194
|
|
195 // Provide the current computed size to request scroll gutter calculation (gh-3589)
|
|
196 val
|
|
197 )
|
|
198 ) + "px";
|
|
199 }
|
|
200
|
|
201 jQuery.extend( {
|
|
202
|
|
203 // Add in style property hooks for overriding the default
|
|
204 // behavior of getting and setting a style property
|
|
205 cssHooks: {
|
|
206 opacity: {
|
|
207 get: function( elem, computed ) {
|
|
208 if ( computed ) {
|
|
209
|
|
210 // We should always get a number back from opacity
|
|
211 var ret = curCSS( elem, "opacity" );
|
|
212 return ret === "" ? "1" : ret;
|
|
213 }
|
|
214 }
|
|
215 }
|
|
216 },
|
|
217
|
|
218 // Don't automatically add "px" to these possibly-unitless properties
|
|
219 cssNumber: {
|
|
220 "animationIterationCount": true,
|
|
221 "columnCount": true,
|
|
222 "fillOpacity": true,
|
|
223 "flexGrow": true,
|
|
224 "flexShrink": true,
|
|
225 "fontWeight": true,
|
|
226 "lineHeight": true,
|
|
227 "opacity": true,
|
|
228 "order": true,
|
|
229 "orphans": true,
|
|
230 "widows": true,
|
|
231 "zIndex": true,
|
|
232 "zoom": true
|
|
233 },
|
|
234
|
|
235 // Add in properties whose names you wish to fix before
|
|
236 // setting or getting the value
|
|
237 cssProps: {},
|
|
238
|
|
239 // Get and set the style property on a DOM Node
|
|
240 style: function( elem, name, value, extra ) {
|
|
241
|
|
242 // Don't set styles on text and comment nodes
|
|
243 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
|
|
244 return;
|
|
245 }
|
|
246
|
|
247 // Make sure that we're working with the right name
|
|
248 var ret, type, hooks,
|
|
249 origName = camelCase( name ),
|
|
250 isCustomProp = rcustomProp.test( name ),
|
|
251 style = elem.style;
|
|
252
|
|
253 // Make sure that we're working with the right name. We don't
|
|
254 // want to query the value if it is a CSS custom property
|
|
255 // since they are user-defined.
|
|
256 if ( !isCustomProp ) {
|
|
257 name = finalPropName( origName );
|
|
258 }
|
|
259
|
|
260 // Gets hook for the prefixed version, then unprefixed version
|
|
261 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
|
262
|
|
263 // Check if we're setting a value
|
|
264 if ( value !== undefined ) {
|
|
265 type = typeof value;
|
|
266
|
|
267 // Convert "+=" or "-=" to relative numbers (#7345)
|
|
268 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
|
|
269 value = adjustCSS( elem, name, ret );
|
|
270
|
|
271 // Fixes bug #9237
|
|
272 type = "number";
|
|
273 }
|
|
274
|
|
275 // Make sure that null and NaN values aren't set (#7116)
|
|
276 if ( value == null || value !== value ) {
|
|
277 return;
|
|
278 }
|
|
279
|
|
280 // If a number was passed in, add the unit (except for certain CSS properties)
|
|
281 if ( type === "number" ) {
|
|
282 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
|
|
283 }
|
|
284
|
|
285 // background-* props affect original clone's values
|
|
286 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
|
|
287 style[ name ] = "inherit";
|
|
288 }
|
|
289
|
|
290 // If a hook was provided, use that value, otherwise just set the specified value
|
|
291 if ( !hooks || !( "set" in hooks ) ||
|
|
292 ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
|
|
293
|
|
294 if ( isCustomProp ) {
|
|
295 style.setProperty( name, value );
|
|
296 } else {
|
|
297 style[ name ] = value;
|
|
298 }
|
|
299 }
|
|
300
|
|
301 } else {
|
|
302
|
|
303 // If a hook was provided get the non-computed value from there
|
|
304 if ( hooks && "get" in hooks &&
|
|
305 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
|
|
306
|
|
307 return ret;
|
|
308 }
|
|
309
|
|
310 // Otherwise just get the value from the style object
|
|
311 return style[ name ];
|
|
312 }
|
|
313 },
|
|
314
|
|
315 css: function( elem, name, extra, styles ) {
|
|
316 var val, num, hooks,
|
|
317 origName = camelCase( name ),
|
|
318 isCustomProp = rcustomProp.test( name );
|
|
319
|
|
320 // Make sure that we're working with the right name. We don't
|
|
321 // want to modify the value if it is a CSS custom property
|
|
322 // since they are user-defined.
|
|
323 if ( !isCustomProp ) {
|
|
324 name = finalPropName( origName );
|
|
325 }
|
|
326
|
|
327 // Try prefixed name followed by the unprefixed name
|
|
328 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
|
329
|
|
330 // If a hook was provided get the computed value from there
|
|
331 if ( hooks && "get" in hooks ) {
|
|
332 val = hooks.get( elem, true, extra );
|
|
333 }
|
|
334
|
|
335 // Otherwise, if a way to get the computed value exists, use that
|
|
336 if ( val === undefined ) {
|
|
337 val = curCSS( elem, name, styles );
|
|
338 }
|
|
339
|
|
340 // Convert "normal" to computed value
|
|
341 if ( val === "normal" && name in cssNormalTransform ) {
|
|
342 val = cssNormalTransform[ name ];
|
|
343 }
|
|
344
|
|
345 // Make numeric if forced or a qualifier was provided and val looks numeric
|
|
346 if ( extra === "" || extra ) {
|
|
347 num = parseFloat( val );
|
|
348 return extra === true || isFinite( num ) ? num || 0 : val;
|
|
349 }
|
|
350
|
|
351 return val;
|
|
352 }
|
|
353 } );
|
|
354
|
|
355 jQuery.each( [ "height", "width" ], function( i, dimension ) {
|
|
356 jQuery.cssHooks[ dimension ] = {
|
|
357 get: function( elem, computed, extra ) {
|
|
358 if ( computed ) {
|
|
359
|
|
360 // Certain elements can have dimension info if we invisibly show them
|
|
361 // but it must have a current display style that would benefit
|
|
362 return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
|
|
363
|
|
364 // Support: Safari 8+
|
|
365 // Table columns in Safari have non-zero offsetWidth & zero
|
|
366 // getBoundingClientRect().width unless display is changed.
|
|
367 // Support: IE <=11 only
|
|
368 // Running getBoundingClientRect on a disconnected node
|
|
369 // in IE throws an error.
|
|
370 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
|
|
371 swap( elem, cssShow, function() {
|
|
372 return getWidthOrHeight( elem, dimension, extra );
|
|
373 } ) :
|
|
374 getWidthOrHeight( elem, dimension, extra );
|
|
375 }
|
|
376 },
|
|
377
|
|
378 set: function( elem, value, extra ) {
|
|
379 var matches,
|
|
380 styles = getStyles( elem ),
|
|
381 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
|
|
382 subtract = extra && boxModelAdjustment(
|
|
383 elem,
|
|
384 dimension,
|
|
385 extra,
|
|
386 isBorderBox,
|
|
387 styles
|
|
388 );
|
|
389
|
|
390 // Account for unreliable border-box dimensions by comparing offset* to computed and
|
|
391 // faking a content-box to get border and padding (gh-3699)
|
|
392 if ( isBorderBox && support.scrollboxSize() === styles.position ) {
|
|
393 subtract -= Math.ceil(
|
|
394 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
|
|
395 parseFloat( styles[ dimension ] ) -
|
|
396 boxModelAdjustment( elem, dimension, "border", false, styles ) -
|
|
397 0.5
|
|
398 );
|
|
399 }
|
|
400
|
|
401 // Convert to pixels if value adjustment is needed
|
|
402 if ( subtract && ( matches = rcssNum.exec( value ) ) &&
|
|
403 ( matches[ 3 ] || "px" ) !== "px" ) {
|
|
404
|
|
405 elem.style[ dimension ] = value;
|
|
406 value = jQuery.css( elem, dimension );
|
|
407 }
|
|
408
|
|
409 return setPositiveNumber( elem, value, subtract );
|
|
410 }
|
|
411 };
|
|
412 } );
|
|
413
|
|
414 jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
|
|
415 function( elem, computed ) {
|
|
416 if ( computed ) {
|
|
417 return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
|
|
418 elem.getBoundingClientRect().left -
|
|
419 swap( elem, { marginLeft: 0 }, function() {
|
|
420 return elem.getBoundingClientRect().left;
|
|
421 } )
|
|
422 ) + "px";
|
|
423 }
|
|
424 }
|
|
425 );
|
|
426
|
|
427 // These hooks are used by animate to expand properties
|
|
428 jQuery.each( {
|
|
429 margin: "",
|
|
430 padding: "",
|
|
431 border: "Width"
|
|
432 }, function( prefix, suffix ) {
|
|
433 jQuery.cssHooks[ prefix + suffix ] = {
|
|
434 expand: function( value ) {
|
|
435 var i = 0,
|
|
436 expanded = {},
|
|
437
|
|
438 // Assumes a single number if not a string
|
|
439 parts = typeof value === "string" ? value.split( " " ) : [ value ];
|
|
440
|
|
441 for ( ; i < 4; i++ ) {
|
|
442 expanded[ prefix + cssExpand[ i ] + suffix ] =
|
|
443 parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
|
|
444 }
|
|
445
|
|
446 return expanded;
|
|
447 }
|
|
448 };
|
|
449
|
|
450 if ( prefix !== "margin" ) {
|
|
451 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
|
|
452 }
|
|
453 } );
|
|
454
|
|
455 jQuery.fn.extend( {
|
|
456 css: function( name, value ) {
|
|
457 return access( this, function( elem, name, value ) {
|
|
458 var styles, len,
|
|
459 map = {},
|
|
460 i = 0;
|
|
461
|
|
462 if ( Array.isArray( name ) ) {
|
|
463 styles = getStyles( elem );
|
|
464 len = name.length;
|
|
465
|
|
466 for ( ; i < len; i++ ) {
|
|
467 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
|
|
468 }
|
|
469
|
|
470 return map;
|
|
471 }
|
|
472
|
|
473 return value !== undefined ?
|
|
474 jQuery.style( elem, name, value ) :
|
|
475 jQuery.css( elem, name );
|
|
476 }, name, value, arguments.length > 1 );
|
|
477 }
|
|
478 } );
|
|
479
|
|
480 return jQuery;
|
|
481 } );
|