Element.style.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:18k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.Element
  9.  */
  10. Ext.Element.addMethods(function(){
  11.     // local style camelizing for speed
  12.     var propCache = {},
  13.         camelRe = /(-[a-z])/gi,
  14.         classReCache = {},
  15.         view = document.defaultView,
  16.         propFloat = Ext.isIE ? 'styleFloat' : 'cssFloat',
  17.         opacityRe = /alpha(opacity=(.*))/i,
  18.         trimRe = /^s+|s+$/g,
  19.         EL = Ext.Element,
  20.         PADDING = "padding",
  21.         MARGIN = "margin",
  22.         BORDER = "border",
  23.         LEFT = "-left",
  24.         RIGHT = "-right",
  25.         TOP = "-top",
  26.         BOTTOM = "-bottom",
  27.         WIDTH = "-width",
  28.         MATH = Math,
  29.         HIDDEN = 'hidden',
  30.         ISCLIPPED = 'isClipped',
  31.         OVERFLOW = 'overflow',
  32.         OVERFLOWX = 'overflow-x',
  33.         OVERFLOWY = 'overflow-y',
  34.         ORIGINALCLIP = 'originalClip',
  35.         // special markup used throughout Ext when box wrapping elements
  36.         borders = {l: BORDER + LEFT + WIDTH, r: BORDER + RIGHT + WIDTH, t: BORDER + TOP + WIDTH, b: BORDER + BOTTOM + WIDTH},
  37.         paddings = {l: PADDING + LEFT, r: PADDING + RIGHT, t: PADDING + TOP, b: PADDING + BOTTOM},
  38.         margins = {l: MARGIN + LEFT, r: MARGIN + RIGHT, t: MARGIN + TOP, b: MARGIN + BOTTOM},
  39.         data = Ext.Element.data;
  40.     // private
  41.     function camelFn(m, a) {
  42.         return a.charAt(1).toUpperCase();
  43.     }
  44.     function chkCache(prop) {
  45.         return propCache[prop] || (propCache[prop] = prop == 'float' ? propFloat : prop.replace(camelRe, camelFn));
  46.     }
  47.     return {
  48.         // private  ==> used by Fx
  49.         adjustWidth : function(width) {
  50.             var me = this;
  51.             var isNum = Ext.isNumber(width);
  52.             if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
  53.                width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
  54.             }
  55.             return (isNum && width < 0) ? 0 : width;
  56.         },
  57.         // private   ==> used by Fx
  58.         adjustHeight : function(height) {
  59.             var me = this;
  60.             var isNum = Ext.isNumber(height);
  61.             if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
  62.                height -= (me.getBorderWidth("tb") + me.getPadding("tb"));
  63.             }
  64.             return (isNum && height < 0) ? 0 : height;
  65.         },
  66.         /**
  67.          * Adds one or more CSS classes to the element. Duplicate classes are automatically filtered out.
  68.          * @param {String/Array} className The CSS class to add, or an array of classes
  69.          * @return {Ext.Element} this
  70.          */
  71.         addClass : function(className){
  72.             var me = this, i, len, v;
  73.             className = Ext.isArray(className) ? className : [className];
  74.             for (i=0, len = className.length; i < len; i++) {
  75.                 v = className[i];
  76.                 if (v) {
  77.                     me.dom.className += (!me.hasClass(v) && v ? " " + v : "");
  78.                 };
  79.             };
  80.             return me;
  81.         },
  82.         /**
  83.          * Adds one or more CSS classes to this element and removes the same class(es) from all siblings.
  84.          * @param {String/Array} className The CSS class to add, or an array of classes
  85.          * @return {Ext.Element} this
  86.          */
  87.         radioClass : function(className){
  88.             var cn = this.dom.parentNode.childNodes, v;
  89.             className = Ext.isArray(className) ? className : [className];
  90.             for (var i=0, len = cn.length; i < len; i++) {
  91.                 v = cn[i];
  92.                 if(v && v.nodeType == 1) {
  93.                     Ext.fly(v, '_internal').removeClass(className);
  94.                 }
  95.             };
  96.             return this.addClass(className);
  97.         },
  98.         /**
  99.          * Removes one or more CSS classes from the element.
  100.          * @param {String/Array} className The CSS class to remove, or an array of classes
  101.          * @return {Ext.Element} this
  102.          */
  103.         removeClass : function(className){
  104.             var me = this, v;
  105.             className = Ext.isArray(className) ? className : [className];
  106.             if (me.dom && me.dom.className) {
  107.                 for (var i=0, len=className.length; i < len; i++) {
  108.                     v = className[i];
  109.                     if(v) {
  110.                         me.dom.className = me.dom.className.replace(
  111.                             classReCache[v] = classReCache[v] || new RegExp('(?:^|\s+)' + v + '(?:\s+|$)', "g"), " "
  112.                         );
  113.                     }
  114.                 };
  115.             }
  116.             return me;
  117.         },
  118.         /**
  119.          * Toggles the specified CSS class on this element (removes it if it already exists, otherwise adds it).
  120.          * @param {String} className The CSS class to toggle
  121.          * @return {Ext.Element} this
  122.          */
  123.         toggleClass : function(className){
  124.             return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
  125.         },
  126.         /**
  127.          * Checks if the specified CSS class exists on this element's DOM node.
  128.          * @param {String} className The CSS class to check for
  129.          * @return {Boolean} True if the class exists, else false
  130.          */
  131.         hasClass : function(className){
  132.             return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
  133.         },
  134.         /**
  135.          * Replaces a CSS class on the element with another.  If the old name does not exist, the new name will simply be added.
  136.          * @param {String} oldClassName The CSS class to replace
  137.          * @param {String} newClassName The replacement CSS class
  138.          * @return {Ext.Element} this
  139.          */
  140.         replaceClass : function(oldClassName, newClassName){
  141.             return this.removeClass(oldClassName).addClass(newClassName);
  142.         },
  143.         isStyle : function(style, val) {
  144.             return this.getStyle(style) == val;
  145.         },
  146.         /**
  147.          * Normalizes currentStyle and computedStyle.
  148.          * @param {String} property The style property whose value is returned.
  149.          * @return {String} The current value of the style property for this element.
  150.          */
  151.         getStyle : function(){
  152.             return view && view.getComputedStyle ?
  153.                 function(prop){
  154.                     var el = this.dom,
  155.                         v,
  156.                         cs,
  157.                         out,
  158.                         display,
  159.                         wk = Ext.isWebKit,
  160.                         display;
  161.                         
  162.                     if(el == document){
  163.                         return null;
  164.                     }
  165.                     prop = chkCache(prop);
  166.                     // Fix bug caused by this: https://bugs.webkit.org/show_bug.cgi?id=13343
  167.                     if(wk && /marginRight/.test(prop)){
  168.                         display = this.getStyle('display');
  169.                         el.style.display = 'inline-block';
  170.                     }
  171.                     out = (v = el.style[prop]) ? v :
  172.                            (cs = view.getComputedStyle(el, "")) ? cs[prop] : null;
  173.                     // Webkit returns rgb values for transparent.
  174.                     if(wk){
  175.                         if(out == 'rgba(0, 0, 0, 0)'){
  176.                             out = 'transparent';
  177.                         }else if(display){
  178.                             el.style.display = display;
  179.                         }
  180.                     }
  181.                     return out;
  182.                 } :
  183.                 function(prop){
  184.                     var el = this.dom,
  185.                         m,
  186.                         cs;
  187.                     if(el == document) return null;
  188.                     if (prop == 'opacity') {
  189.                         if (el.style.filter.match) {
  190.                             if(m = el.style.filter.match(opacityRe)){
  191.                                 var fv = parseFloat(m[1]);
  192.                                 if(!isNaN(fv)){
  193.                                     return fv ? fv / 100 : 0;
  194.                                 }
  195.                             }
  196.                         }
  197.                         return 1;
  198.                     }
  199.                     prop = chkCache(prop);
  200.                     return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null);
  201.                 };
  202.         }(),
  203.         /**
  204.          * Return the CSS color for the specified CSS attribute. rgb, 3 digit (like #fff) and valid values
  205.          * are convert to standard 6 digit hex color.
  206.          * @param {String} attr The css attribute
  207.          * @param {String} defaultValue The default value to use when a valid color isn't found
  208.          * @param {String} prefix (optional) defaults to #. Use an empty string when working with
  209.          * color anims.
  210.          */
  211.         getColor : function(attr, defaultValue, prefix){
  212.             var v = this.getStyle(attr),
  213.                 color = Ext.isDefined(prefix) ? prefix : '#',
  214.                 h;
  215.             if(!v || /transparent|inherit/.test(v)){
  216.                 return defaultValue;
  217.             }
  218.             if(/^r/.test(v)){
  219.                 Ext.each(v.slice(4, v.length -1).split(','), function(s){
  220.                     h = parseInt(s, 10);
  221.                     color += (h < 16 ? '0' : '') + h.toString(16);
  222.                 });
  223.             }else{
  224.                 v = v.replace('#', '');
  225.                 color += v.length == 3 ? v.replace(/^(w)(w)(w)$/, '$1$1$2$2$3$3') : v;
  226.             }
  227.             return(color.length > 5 ? color.toLowerCase() : defaultValue);
  228.         },
  229.         /**
  230.          * Wrapper for setting style properties, also takes single object parameter of multiple styles.
  231.          * @param {String/Object} property The style property to be set, or an object of multiple styles.
  232.          * @param {String} value (optional) The value to apply to the given property, or null if an object was passed.
  233.          * @return {Ext.Element} this
  234.          */
  235.         setStyle : function(prop, value){
  236.             var tmp,
  237.                 style,
  238.                 camel;
  239.             if (!Ext.isObject(prop)) {
  240.                 tmp = {};
  241.                 tmp[prop] = value;
  242.                 prop = tmp;
  243.             }
  244.             for (style in prop) {
  245.                 value = prop[style];
  246.                 style == 'opacity' ?
  247.                     this.setOpacity(value) :
  248.                     this.dom.style[chkCache(style)] = value;
  249.             }
  250.             return this;
  251.         },
  252.         /**
  253.          * Set the opacity of the element
  254.          * @param {Float} opacity The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc
  255.          * @param {Boolean/Object} animate (optional) a standard Element animation config object or <tt>true</tt> for
  256.          * the default animation (<tt>{duration: .35, easing: 'easeIn'}</tt>)
  257.          * @return {Ext.Element} this
  258.          */
  259.          setOpacity : function(opacity, animate){
  260.             var me = this,
  261.                 s = me.dom.style;
  262.             if(!animate || !me.anim){
  263.                 if(Ext.isIE){
  264.                     var opac = opacity < 1 ? 'alpha(opacity=' + opacity * 100 + ')' : '',
  265.                     val = s.filter.replace(opacityRe, '').replace(trimRe, '');
  266.                     s.zoom = 1;
  267.                     s.filter = val + (val.length > 0 ? ' ' : '') + opac;
  268.                 }else{
  269.                     s.opacity = opacity;
  270.                 }
  271.             }else{
  272.                 me.anim({opacity: {to: opacity}}, me.preanim(arguments, 1), null, .35, 'easeIn');
  273.             }
  274.             return me;
  275.         },
  276.         /**
  277.          * Clears any opacity settings from this element. Required in some cases for IE.
  278.          * @return {Ext.Element} this
  279.          */
  280.         clearOpacity : function(){
  281.             var style = this.dom.style;
  282.             if(Ext.isIE){
  283.                 if(!Ext.isEmpty(style.filter)){
  284.                     style.filter = style.filter.replace(opacityRe, '').replace(trimRe, '');
  285.                 }
  286.             }else{
  287.                 style.opacity = style['-moz-opacity'] = style['-khtml-opacity'] = '';
  288.             }
  289.             return this;
  290.         },
  291.         /**
  292.          * Returns the offset height of the element
  293.          * @param {Boolean} contentHeight (optional) true to get the height minus borders and padding
  294.          * @return {Number} The element's height
  295.          */
  296.         getHeight : function(contentHeight){
  297.             var me = this,
  298.                 dom = me.dom,
  299.                 hidden = Ext.isIE && me.isStyle('display', 'none'),
  300.                 h = MATH.max(dom.offsetHeight, hidden ? 0 : dom.clientHeight) || 0;
  301.             h = !contentHeight ? h : h - me.getBorderWidth("tb") - me.getPadding("tb");
  302.             return h < 0 ? 0 : h;
  303.         },
  304.         /**
  305.          * Returns the offset width of the element
  306.          * @param {Boolean} contentWidth (optional) true to get the width minus borders and padding
  307.          * @return {Number} The element's width
  308.          */
  309.         getWidth : function(contentWidth){
  310.             var me = this,
  311.                 dom = me.dom,
  312.                 hidden = Ext.isIE && me.isStyle('display', 'none'),
  313.                 w = MATH.max(dom.offsetWidth, hidden ? 0 : dom.clientWidth) || 0;
  314.             w = !contentWidth ? w : w - me.getBorderWidth("lr") - me.getPadding("lr");
  315.             return w < 0 ? 0 : w;
  316.         },
  317.         /**
  318.          * Set the width of this Element.
  319.          * @param {Mixed} width The new width. This may be one of:<div class="mdetail-params"><ul>
  320.          * <li>A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  321.          * <li>A String used to set the CSS width style. Animation may <b>not</b> be used.
  322.          * </ul></div>
  323.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  324.          * @return {Ext.Element} this
  325.          */
  326.         setWidth : function(width, animate){
  327.             var me = this;
  328.             width = me.adjustWidth(width);
  329.             !animate || !me.anim ?
  330.                 me.dom.style.width = me.addUnits(width) :
  331.                 me.anim({width : {to : width}}, me.preanim(arguments, 1));
  332.             return me;
  333.         },
  334.         /**
  335.          * Set the height of this Element.
  336.          * <pre><code>
  337. // change the height to 200px and animate with default configuration
  338. Ext.fly('elementId').setHeight(200, true);
  339. // change the height to 150px and animate with a custom configuration
  340. Ext.fly('elId').setHeight(150, {
  341.     duration : .5, // animation will have a duration of .5 seconds
  342.     // will change the content to "finished"
  343.     callback: function(){ this.{@link #update}("finished"); }
  344. });
  345.          * </code></pre>
  346.          * @param {Mixed} height The new height. This may be one of:<div class="mdetail-params"><ul>
  347.          * <li>A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels.)</li>
  348.          * <li>A String used to set the CSS height style. Animation may <b>not</b> be used.</li>
  349.          * </ul></div>
  350.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  351.          * @return {Ext.Element} this
  352.          */
  353.          setHeight : function(height, animate){
  354.             var me = this;
  355.             height = me.adjustHeight(height);
  356.             !animate || !me.anim ?
  357.                 me.dom.style.height = me.addUnits(height) :
  358.                 me.anim({height : {to : height}}, me.preanim(arguments, 1));
  359.             return me;
  360.         },
  361.         /**
  362.          * Gets the width of the border(s) for the specified side(s)
  363.          * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example,
  364.          * passing <tt>'lr'</tt> would get the border <b><u>l</u></b>eft width + the border <b><u>r</u></b>ight width.
  365.          * @return {Number} The width of the sides passed added together
  366.          */
  367.         getBorderWidth : function(side){
  368.             return this.addStyles(side, borders);
  369.         },
  370.         /**
  371.          * Gets the width of the padding(s) for the specified side(s)
  372.          * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example,
  373.          * passing <tt>'lr'</tt> would get the padding <b><u>l</u></b>eft + the padding <b><u>r</u></b>ight.
  374.          * @return {Number} The padding of the sides passed added together
  375.          */
  376.         getPadding : function(side){
  377.             return this.addStyles(side, paddings);
  378.         },
  379.         /**
  380.          *  Store the current overflow setting and clip overflow on the element - use <tt>{@link #unclip}</tt> to remove
  381.          * @return {Ext.Element} this
  382.          */
  383.         clip : function(){
  384.             var me = this,
  385.                 dom = me.dom;
  386.             if(!data(dom, ISCLIPPED)){
  387.                 data(dom, ISCLIPPED, true);
  388.                 data(dom, ORIGINALCLIP, {
  389.                     o: me.getStyle(OVERFLOW),
  390.                     x: me.getStyle(OVERFLOWX),
  391.                     y: me.getStyle(OVERFLOWY)
  392.                 });
  393.                 me.setStyle(OVERFLOW, HIDDEN);
  394.                 me.setStyle(OVERFLOWX, HIDDEN);
  395.                 me.setStyle(OVERFLOWY, HIDDEN);
  396.             }
  397.             return me;
  398.         },
  399.         /**
  400.          *  Return clipping (overflow) to original clipping before <tt>{@link #clip}</tt> was called
  401.          * @return {Ext.Element} this
  402.          */
  403.         unclip : function(){
  404.             var me = this,
  405.                 dom = me.dom;
  406.             if(data(dom, ISCLIPPED)){
  407.                 data(dom, ISCLIPPED, false);
  408.                 var o = data(dom, ORIGINALCLIP);
  409.                 if(o.o){
  410.                     me.setStyle(OVERFLOW, o.o);
  411.                 }
  412.                 if(o.x){
  413.                     me.setStyle(OVERFLOWX, o.x);
  414.                 }
  415.                 if(o.y){
  416.                     me.setStyle(OVERFLOWY, o.y);
  417.                 }
  418.             }
  419.             return me;
  420.         },
  421.         // private
  422.         addStyles : function(sides, styles){
  423.             var val = 0,
  424.                 m = sides.match(/w/g),
  425.                 s;
  426.             for (var i=0, len=m.length; i<len; i++) {
  427.                 s = m[i] && parseInt(this.getStyle(styles[m[i]]), 10);
  428.                 if (s) {
  429.                     val += MATH.abs(s);
  430.                 }
  431.             }
  432.             return val;
  433.         },
  434.         margins : margins
  435.     }
  436. }()
  437. );