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

中间件编程

开发平台:

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