Element.style-more.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:12k
源码类别:

中间件编程

开发平台:

JavaScript

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