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

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. (function(){
  5. var D = Ext.lib.Dom,
  6.         LEFT = "left",
  7.         RIGHT = "right",
  8.         TOP = "top",
  9.         BOTTOM = "bottom",
  10.         POSITION = "position",
  11.         STATIC = "static",
  12.         RELATIVE = "relative",
  13.         AUTO = "auto",
  14.         ZINDEX = "z-index";
  15. Ext.Element.addMethods({
  16. /**
  17.       * Gets the current X position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  18.       * @return {Number} The X position of the element
  19.       */
  20.     getX : function(){
  21.         return D.getX(this.dom);
  22.     },
  23.     /**
  24.       * Gets the current Y position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  25.       * @return {Number} The Y position of the element
  26.       */
  27.     getY : function(){
  28.         return D.getY(this.dom);
  29.     },
  30.     /**
  31.       * Gets the current position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  32.       * @return {Array} The XY position of the element
  33.       */
  34.     getXY : function(){
  35.         return D.getXY(this.dom);
  36.     },
  37.     /**
  38.       * Returns the offsets of this element from the passed element. Both element must be part of the DOM tree and not have display:none to have page coordinates.
  39.       * @param {Mixed} element The element to get the offsets from.
  40.       * @return {Array} The XY page offsets (e.g. [100, -200])
  41.       */
  42.     getOffsetsTo : function(el){
  43.         var o = this.getXY(),
  44.          e = Ext.fly(el, '_internal').getXY();
  45.         return [o[0]-e[0],o[1]-e[1]];
  46.     },
  47.     /**
  48.      * Sets the X position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  49.      * @param {Number} The X position of the element
  50.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  51.      * @return {Ext.Element} this
  52.      */
  53.     setX : function(x, animate){     
  54.     return this.setXY([x, this.getY()], this.animTest(arguments, animate, 1));
  55.     },
  56.     /**
  57.      * Sets the Y position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  58.      * @param {Number} The Y position of the element
  59.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  60.      * @return {Ext.Element} this
  61.      */
  62.     setY : function(y, animate){     
  63.     return this.setXY([this.getX(), y], this.animTest(arguments, animate, 1));
  64.     },
  65.     /**
  66.      * Sets the element's left position directly using CSS style (instead of {@link #setX}).
  67.      * @param {String} left The left CSS property value
  68.      * @return {Ext.Element} this
  69.      */
  70.     setLeft : function(left){
  71.         this.setStyle(LEFT, this.addUnits(left));
  72.         return this;
  73.     },
  74.     /**
  75.      * Sets the element's top position directly using CSS style (instead of {@link #setY}).
  76.      * @param {String} top The top CSS property value
  77.      * @return {Ext.Element} this
  78.      */
  79.     setTop : function(top){
  80.         this.setStyle(TOP, this.addUnits(top));
  81.         return this;
  82.     },
  83.     /**
  84.      * Sets the element's CSS right style.
  85.      * @param {String} right The right CSS property value
  86.      * @return {Ext.Element} this
  87.      */
  88.     setRight : function(right){
  89.         this.setStyle(RIGHT, this.addUnits(right));
  90.         return this;
  91.     },
  92.     /**
  93.      * Sets the element's CSS bottom style.
  94.      * @param {String} bottom The bottom CSS property value
  95.      * @return {Ext.Element} this
  96.      */
  97.     setBottom : function(bottom){
  98.         this.setStyle(BOTTOM, this.addUnits(bottom));
  99.         return this;
  100.     },
  101.     /**
  102.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  103.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  104.      * @param {Array} pos Contains X & Y [x, y] values for new position (coordinates are page-based)
  105.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  106.      * @return {Ext.Element} this
  107.      */
  108.     setXY : function(pos, animate){
  109.     var me = this;
  110.         if(!animate || !me.anim){
  111.             D.setXY(me.dom, pos);
  112.         }else{
  113.             me.anim({points: {to: pos}}, me.preanim(arguments, 1), 'motion');
  114.         }
  115.         return me;
  116.     },
  117.     /**
  118.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  119.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  120.      * @param {Number} x X value for new position (coordinates are page-based)
  121.      * @param {Number} y Y value for new position (coordinates are page-based)
  122.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  123.      * @return {Ext.Element} this
  124.      */
  125.     setLocation : function(x, y, animate){
  126.         return this.setXY([x, y], this.animTest(arguments, animate, 2));
  127.     },
  128.     /**
  129.      * Sets the position of the element in page coordinates, regardless of how the element is positioned.
  130.      * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
  131.      * @param {Number} x X value for new position (coordinates are page-based)
  132.      * @param {Number} y Y value for new position (coordinates are page-based)
  133.      * @param {Boolean/Object} animate (optional) True for the default animation, or a standard Element animation config object
  134.      * @return {Ext.Element} this
  135.      */
  136.     moveTo : function(x, y, animate){
  137.         return this.setXY([x, y], this.animTest(arguments, animate, 2));        
  138.     },    
  139.     
  140.     /**
  141.      * Gets the left X coordinate
  142.      * @param {Boolean} local True to get the local css position instead of page coordinate
  143.      * @return {Number}
  144.      */
  145.     getLeft : function(local){
  146.     return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0;
  147.     },
  148.     /**
  149.      * Gets the right X coordinate of the element (element X position + element width)
  150.      * @param {Boolean} local True to get the local css position instead of page coordinate
  151.      * @return {Number}
  152.      */
  153.     getRight : function(local){
  154.     var me = this;
  155.     return !local ? me.getX() + me.getWidth() : (me.getLeft(true) + me.getWidth()) || 0;
  156.     },
  157.     /**
  158.      * Gets the top Y coordinate
  159.      * @param {Boolean} local True to get the local css position instead of page coordinate
  160.      * @return {Number}
  161.      */
  162.     getTop : function(local) {
  163.     return !local ? this.getY() : parseInt(this.getStyle(TOP), 10) || 0;
  164.     },
  165.     /**
  166.      * Gets the bottom Y coordinate of the element (element Y position + element height)
  167.      * @param {Boolean} local True to get the local css position instead of page coordinate
  168.      * @return {Number}
  169.      */
  170.     getBottom : function(local){
  171.     var me = this;
  172.     return !local ? me.getY() + me.getHeight() : (me.getTop(true) + me.getHeight()) || 0;
  173.     },
  174.     /**
  175.     * Initializes positioning on this element. If a desired position is not passed, it will make the
  176.     * the element positioned relative IF it is not already positioned.
  177.     * @param {String} pos (optional) Positioning to use "relative", "absolute" or "fixed"
  178.     * @param {Number} zIndex (optional) The zIndex to apply
  179.     * @param {Number} x (optional) Set the page X position
  180.     * @param {Number} y (optional) Set the page Y position
  181.     */
  182.     position : function(pos, zIndex, x, y){
  183.     var me = this;
  184.     
  185.         if(!pos && me.isStyle(POSITION, STATIC)){           
  186.             me.setStyle(POSITION, RELATIVE);           
  187.         } else if(pos) {
  188.             me.setStyle(POSITION, pos);
  189.         }
  190.         if(zIndex){
  191.             me.setStyle(ZINDEX, zIndex);
  192.         }
  193.         if(x || y) me.setXY([x || false, y || false]);
  194.     },
  195.     /**
  196.     * Clear positioning back to the default when the document was loaded
  197.     * @param {String} value (optional) The value to use for the left,right,top,bottom, defaults to '' (empty string). You could use 'auto'.
  198.     * @return {Ext.Element} this
  199.      */
  200.     clearPositioning : function(value){
  201.         value = value || '';
  202.         this.setStyle({
  203.             left : value,
  204.             right : value,
  205.             top : value,
  206.             bottom : value,
  207.             "z-index" : "",
  208.             position : STATIC
  209.         });
  210.         return this;
  211.     },
  212.     /**
  213.     * Gets an object with all CSS positioning properties. Useful along with setPostioning to get
  214.     * snapshot before performing an update and then restoring the element.
  215.     * @return {Object}
  216.     */
  217.     getPositioning : function(){
  218.         var l = this.getStyle(LEFT);
  219.         var t = this.getStyle(TOP);
  220.         return {
  221.             "position" : this.getStyle(POSITION),
  222.             "left" : l,
  223.             "right" : l ? "" : this.getStyle(RIGHT),
  224.             "top" : t,
  225.             "bottom" : t ? "" : this.getStyle(BOTTOM),
  226.             "z-index" : this.getStyle(ZINDEX)
  227.         };
  228.     },
  229.     
  230.     /**
  231.     * Set positioning with an object returned by getPositioning().
  232.     * @param {Object} posCfg
  233.     * @return {Ext.Element} this
  234.      */
  235.     setPositioning : function(pc){
  236.     var me = this,
  237.      style = me.dom.style;
  238.     
  239.         me.setStyle(pc);
  240.         
  241.         if(pc.right == AUTO){
  242.             style.right = "";
  243.         }
  244.         if(pc.bottom == AUTO){
  245.             style.bottom = "";
  246.         }
  247.         
  248.         return me;
  249.     },    
  250.     /**
  251.      * Translates the passed page coordinates into left/top css values for this element
  252.      * @param {Number/Array} x The page x or an array containing [x, y]
  253.      * @param {Number} y (optional) The page y, required if x is not an array
  254.      * @return {Object} An object with left and top properties. e.g. {left: (value), top: (value)}
  255.      */
  256.     translatePoints : function(x, y){              
  257.     y = isNaN(x[1]) ? y : x[1];
  258.         x = isNaN(x[0]) ? x : x[0];
  259.         var me = this,
  260.          relative = me.isStyle(POSITION, RELATIVE),
  261.          o = me.getXY(),
  262.          l = parseInt(me.getStyle(LEFT), 10),
  263.          t = parseInt(me.getStyle(TOP), 10);
  264.         
  265.         l = !isNaN(l) ? l : (relative ? 0 : me.dom.offsetLeft);
  266.         t = !isNaN(t) ? t : (relative ? 0 : me.dom.offsetTop);        
  267.         return {left: (x - o[0] + l), top: (y - o[1] + t)}; 
  268.     },
  269.     
  270.     animTest : function(args, animate, i) {
  271.         return !!animate && this.preanim ? this.preanim(args, i) : false;
  272.     }
  273. });
  274. })();