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

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.Element
  3.  */
  4. // special markup used throughout Ext when box wrapping elements
  5. Ext.Element.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
  6. Ext.Element.addMethods(function(){
  7.     var INTERNAL = "_internal",
  8.         pxMatch = /(d+)px/;
  9.     return {
  10.         /**
  11.          * More flexible version of {@link #setStyle} for setting style properties.
  12.          * @param {String/Object/Function} styles A style specification string, e.g. "width:100px", or object in the form {width:"100px"}, or
  13.          * a function which returns such a specification.
  14.          * @return {Ext.Element} this
  15.          */
  16.         applyStyles : function(style){
  17.             Ext.DomHelper.applyStyles(this.dom, style);
  18.             return this;
  19.         },
  20.         /**
  21.          * Returns an object with properties matching the styles requested.
  22.          * For example, el.getStyles('color', 'font-size', 'width') might return
  23.          * {'color': '#FFFFFF', 'font-size': '13px', 'width': '100px'}.
  24.          * @param {String} style1 A style name
  25.          * @param {String} style2 A style name
  26.          * @param {String} etc.
  27.          * @return {Object} The style object
  28.          */
  29.         getStyles : function(){
  30.             var ret = {};
  31.             Ext.each(arguments, function(v) {
  32.                ret[v] = this.getStyle(v);
  33.             },
  34.             this);
  35.             return ret;
  36.         },
  37.         // deprecated
  38.         getStyleSize : function(){
  39.             var me = this,
  40.                 w,
  41.                 h,
  42.                 d = this.dom,
  43.                 s = d.style;
  44.             if(s.width && s.width != 'auto'){
  45.                 w = parseInt(s.width, 10);
  46.                 if(me.isBorderBox()){
  47.                    w -= me.getFrameWidth('lr');
  48.                 }
  49.             }
  50.             if(s.height && s.height != 'auto'){
  51.                 h = parseInt(s.height, 10);
  52.                 if(me.isBorderBox()){
  53.                    h -= me.getFrameWidth('tb');
  54.                 }
  55.             }
  56.             return {width: w || me.getWidth(true), height: h || me.getHeight(true)};
  57.         },
  58.         // private  ==> used by ext full
  59.         setOverflow : function(v){
  60.             var dom = this.dom;
  61.             if(v=='auto' && Ext.isMac && Ext.isGecko2){ // work around stupid FF 2.0/Mac scroll bar bug
  62.                 dom.style.overflow = 'hidden';
  63.                 (function(){dom.style.overflow = 'auto';}).defer(1);
  64.             }else{
  65.                 dom.style.overflow = v;
  66.             }
  67.         },
  68.        /**
  69.         * <p>Wraps the specified element with a special 9 element markup/CSS block that renders by default as
  70.         * a gray container with a gradient background, rounded corners and a 4-way shadow.</p>
  71.         * <p>This special markup is used throughout Ext when box wrapping elements ({@link Ext.Button},
  72.         * {@link Ext.Panel} when <tt>{@link Ext.Panel#frame frame=true}</tt>, {@link Ext.Window}).  The markup
  73.         * is of this form:</p>
  74.         * <pre><code>
  75.     Ext.Element.boxMarkup =
  76.     &#39;&lt;div class="{0}-tl">&lt;div class="{0}-tr">&lt;div class="{0}-tc">&lt;/div>&lt;/div>&lt;/div>
  77.      &lt;div class="{0}-ml">&lt;div class="{0}-mr">&lt;div class="{0}-mc">&lt;/div>&lt;/div>&lt;/div>
  78.      &lt;div class="{0}-bl">&lt;div class="{0}-br">&lt;div class="{0}-bc">&lt;/div>&lt;/div>&lt;/div>&#39;;
  79.         * </code></pre>
  80.         * <p>Example usage:</p>
  81.         * <pre><code>
  82.     // Basic box wrap
  83.     Ext.get("foo").boxWrap();
  84.     // You can also add a custom class and use CSS inheritance rules to customize the box look.
  85.     // 'x-box-blue' is a built-in alternative -- look at the related CSS definitions as an example
  86.     // for how to create a custom box wrap style.
  87.     Ext.get("foo").boxWrap().addClass("x-box-blue");
  88.         * </code></pre>
  89.         * @param {String} class (optional) A base CSS class to apply to the containing wrapper element
  90.         * (defaults to <tt>'x-box'</tt>). Note that there are a number of CSS rules that are dependent on
  91.         * this name to make the overall effect work, so if you supply an alternate base class, make sure you
  92.         * also supply all of the necessary rules.
  93.         * @return {Ext.Element} The outermost wrapping element of the created box structure.
  94.         */
  95.         boxWrap : function(cls){
  96.             cls = cls || 'x-box';
  97.             var el = Ext.get(this.insertHtml("beforeBegin", "<div class='" + cls + "'>" + String.format(Ext.Element.boxMarkup, cls) + "</div>"));        //String.format('<div class="{0}">'+Ext.Element.boxMarkup+'</div>', cls)));
  98.             Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
  99.             return el;
  100.         },
  101.         /**
  102.          * Set the size of this Element. If animation is true, both width and height will be animated concurrently.
  103.          * @param {Mixed} width The new width. This may be one of:<div class="mdetail-params"><ul>
  104.          * <li>A Number specifying the new width in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  105.          * <li>A String used to set the CSS width style. Animation may <b>not</b> be used.
  106.          * <li>A size object in the format <code>{width: widthValue, height: heightValue}</code>.</li>
  107.          * </ul></div>
  108.          * @param {Mixed} height The new height. This may be one of:<div class="mdetail-params"><ul>
  109.          * <li>A Number specifying the new height in this Element's {@link #defaultUnit}s (by default, pixels).</li>
  110.          * <li>A String used to set the CSS height style. Animation may <b>not</b> be used.</li>
  111.          * </ul></div>
  112.          * @param {Boolean/Object} animate (optional) true for the default animation or a standard Element animation config object
  113.          * @return {Ext.Element} this
  114.          */
  115.         setSize : function(width, height, animate){
  116.             var me = this;
  117.             if(Ext.isObject(width)){ // in case of object from getSize()
  118.                 height = width.height;
  119.                 width = width.width;
  120.             }
  121.             width = me.adjustWidth(width);
  122.             height = me.adjustHeight(height);
  123.             if(!animate || !me.anim){
  124.                 me.dom.style.width = me.addUnits(width);
  125.                 me.dom.style.height = me.addUnits(height);
  126.             }else{
  127.                 me.anim({width: {to: width}, height: {to: height}}, me.preanim(arguments, 2));
  128.             }
  129.             return me;
  130.         },
  131.         /**
  132.          * Returns either the offsetHeight or the height of this element based on CSS height adjusted by padding or borders
  133.          * when needed to simulate offsetHeight when offsets aren't available. This may not work on display:none elements
  134.          * if a height has not been set using CSS.
  135.          * @return {Number}
  136.          */
  137.         getComputedHeight : function(){
  138.             var me = this,
  139.                 h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
  140.             if(!h){
  141.                 h = parseInt(me.getStyle('height'), 10) || 0;
  142.                 if(!me.isBorderBox()){
  143.                     h += me.getFrameWidth('tb');
  144.                 }
  145.             }
  146.             return h;
  147.         },
  148.         /**
  149.          * Returns either the offsetWidth or the width of this element based on CSS width adjusted by padding or borders
  150.          * when needed to simulate offsetWidth when offsets aren't available. This may not work on display:none elements
  151.          * if a width has not been set using CSS.
  152.          * @return {Number}
  153.          */
  154.         getComputedWidth : function(){
  155.             var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
  156.             if(!w){
  157.                 w = parseInt(this.getStyle('width'), 10) || 0;
  158.                 if(!this.isBorderBox()){
  159.                     w += this.getFrameWidth('lr');
  160.                 }
  161.             }
  162.             return w;
  163.         },
  164.         /**
  165.          * Returns the sum width of the padding and borders for the passed "sides". See getBorderWidth()
  166.          for more information about the sides.
  167.          * @param {String} sides
  168.          * @return {Number}
  169.          */
  170.         getFrameWidth : function(sides, onlyContentBox){
  171.             return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
  172.         },
  173.         /**
  174.          * Sets up event handlers to add and remove a css class when the mouse is over this element
  175.          * @param {String} className
  176.          * @return {Ext.Element} this
  177.          */
  178.         addClassOnOver : function(className){
  179.             this.hover(
  180.                 function(){
  181.                     Ext.fly(this, INTERNAL).addClass(className);
  182.                 },
  183.                 function(){
  184.                     Ext.fly(this, INTERNAL).removeClass(className);
  185.                 }
  186.             );
  187.             return this;
  188.         },
  189.         /**
  190.          * Sets up event handlers to add and remove a css class when this element has the focus
  191.          * @param {String} className
  192.          * @return {Ext.Element} this
  193.          */
  194.         addClassOnFocus : function(className){
  195.             this.on("focus", function(){
  196.                 Ext.fly(this, INTERNAL).addClass(className);
  197.             }, this.dom);
  198.             this.on("blur", function(){
  199.                 Ext.fly(this, INTERNAL).removeClass(className);
  200.             }, this.dom);
  201.             return this;
  202.         },
  203.         /**
  204.          * Sets up event handlers to add and remove a css class when the mouse is down and then up on this element (a click effect)
  205.          * @param {String} className
  206.          * @return {Ext.Element} this
  207.          */
  208.         addClassOnClick : function(className){
  209.             var dom = this.dom;
  210.             this.on("mousedown", function(){
  211.                 Ext.fly(dom, INTERNAL).addClass(className);
  212.                 var d = Ext.getDoc(),
  213.                     fn = function(){
  214.                         Ext.fly(dom, INTERNAL).removeClass(className);
  215.                         d.removeListener("mouseup", fn);
  216.                     };
  217.                 d.on("mouseup", fn);
  218.             });
  219.             return this;
  220.         },
  221.         /**
  222.          * <p>Returns the dimensions of the element available to lay content out in.<p>
  223.          * <p>If the element (or any ancestor element) has CSS style <code>display : none</code>, the dimensions will be zero.</p>
  224.          * example:<pre><code>
  225.         var vpSize = Ext.getBody().getViewSize();
  226.         // all Windows created afterwards will have a default value of 90% height and 95% width
  227.         Ext.Window.override({
  228.             width: vpSize.width * 0.9,
  229.             height: vpSize.height * 0.95
  230.         });
  231.         // To handle window resizing you would have to hook onto onWindowResize.
  232.         </code></pre>
  233.          * @param {Boolean} contentBox True to return the W3 content box <i>within</i> the padding area of the element. False
  234.          * or omitted to return the full area of the element within the border. See <a href="http://www.w3.org/TR/CSS2/box.html">http://www.w3.org/TR/CSS2/box.html</a>
  235.          * @return {Object} An object containing the elements's area: <code>{width: &lt;element width>, height: &lt;element height>}</code>
  236.          */
  237.         getViewSize : function(contentBox){
  238.             var doc = document,
  239.                 me = this,
  240.                 d = me.dom,
  241.                 extdom = Ext.lib.Dom,
  242.                 isDoc = (d == doc || d == doc.body),
  243.                 isBB, w, h, tbBorder = 0, lrBorder = 0,
  244.                 tbPadding = 0, lrPadding = 0;
  245.             if (isDoc) {
  246.                 return { width: extdom.getViewWidth(), height: extdom.getViewHeight() };
  247.             }
  248.             isBB = me.isBorderBox();
  249.             tbBorder = me.getBorderWidth('tb');
  250.             lrBorder = me.getBorderWidth('lr');
  251.             tbPadding = me.getPadding('tb');
  252.             lrPadding = me.getPadding('lr');
  253.             // Width calcs
  254.             // Try the style first, then clientWidth, then offsetWidth
  255.             if (w = me.getStyle('width').match(pxMatch)){
  256.                 if ((w = parseInt(w[1], 10)) && isBB){
  257.                     // Style includes the padding and border if isBB
  258.                     w -= (lrBorder + lrPadding);
  259.                 }
  260.                 if (!contentBox){
  261.                     w += lrPadding;
  262.                 }
  263.             } else {
  264.                 if (!(w = d.clientWidth) && (w = d.offsetWidth)){
  265.                     w -= lrBorder;
  266.                 }
  267.                 if (w && contentBox){
  268.                     w -= lrPadding;
  269.                 }
  270.             }
  271.             // Height calcs
  272.             // Try the style first, then clientHeight, then offsetHeight
  273.             if (h = me.getStyle('height').match(pxMatch)){
  274.                 if ((h = parseInt(h[1], 10)) && isBB){
  275.                     // Style includes the padding and border if isBB
  276.                     h -= (tbBorder + tbPadding);
  277.                 }
  278.                 if (!contentBox){
  279.                     h += tbPadding;
  280.                 }
  281.             } else {
  282.                 if (!(h = d.clientHeight) && (h = d.offsetHeight)){
  283.                     h -= tbBorder;
  284.                 }
  285.                 if (h && contentBox){
  286.                     h -= tbPadding;
  287.                 }
  288.             }
  289.             return {
  290.                 width : w,
  291.                 height : h
  292.             };
  293.         },
  294.         /**
  295.          * Returns the size of the element.
  296.          * @param {Boolean} contentSize (optional) true to get the width/size minus borders and padding
  297.          * @return {Object} An object containing the element's size {width: (element width), height: (element height)}
  298.          */
  299.         getSize : function(contentSize){
  300.             return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
  301.         },
  302.         /**
  303.          * Forces the browser to repaint this element
  304.          * @return {Ext.Element} this
  305.          */
  306.         repaint : function(){
  307.             var dom = this.dom;
  308.             this.addClass("x-repaint");
  309.             setTimeout(function(){
  310.                 Ext.fly(dom).removeClass("x-repaint");
  311.             }, 1);
  312.             return this;
  313.         },
  314.         /**
  315.          * Disables text selection for this element (normalized across browsers)
  316.          * @return {Ext.Element} this
  317.          */
  318.         unselectable : function(){
  319.             this.dom.unselectable = "on";
  320.             return this.swallowEvent("selectstart", true).
  321.                         applyStyles("-moz-user-select:none;-khtml-user-select:none;").
  322.                         addClass("x-unselectable");
  323.         },
  324.         /**
  325.          * Returns an object with properties top, left, right and bottom representing the margins of this element unless sides is passed,
  326.          * then it returns the calculated width of the sides (see getPadding)
  327.          * @param {String} sides (optional) Any combination of l, r, t, b to get the sum of those sides
  328.          * @return {Object/Number}
  329.          */
  330.         getMargins : function(side){
  331.             var me = this,
  332.                 key,
  333.                 hash = {t:"top", l:"left", r:"right", b: "bottom"},
  334.                 o = {};
  335.             if (!side) {
  336.                 for (key in me.margins){
  337.                     o[hash[key]] = parseInt(me.getStyle(me.margins[key]), 10) || 0;
  338.                 }
  339.                 return o;
  340.             } else {
  341.                 return me.addStyles.call(me, side, me.margins);
  342.             }
  343.         }
  344.     };
  345. }());