Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

230 wiersze
6.3 KiB

  1. /*
  2. * jQuery UI Position 1.8
  3. *
  4. * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
  5. * Dual licensed under the MIT (MIT-LICENSE.txt)
  6. * and GPL (GPL-LICENSE.txt) licenses.
  7. *
  8. * http://docs.jquery.com/UI/Position
  9. */
  10. (function( $ ) {
  11. $.ui = $.ui || {};
  12. var horizontalPositions = /left|center|right/,
  13. horizontalDefault = "center",
  14. verticalPositions = /top|center|bottom/,
  15. verticalDefault = "center",
  16. _position = $.fn.position,
  17. _offset = $.fn.offset;
  18. $.fn.position = function( options ) {
  19. if ( !options || !options.of ) {
  20. return _position.apply( this, arguments );
  21. }
  22. // make a copy, we don't want to modify arguments
  23. options = $.extend( {}, options );
  24. var target = $( options.of ),
  25. collision = ( options.collision || "flip" ).split( " " ),
  26. offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
  27. targetWidth,
  28. targetHeight,
  29. basePosition;
  30. if ( options.of.nodeType === 9 ) {
  31. targetWidth = target.width();
  32. targetHeight = target.height();
  33. basePosition = { top: 0, left: 0 };
  34. } else if ( options.of.scrollTo && options.of.document ) {
  35. targetWidth = target.width();
  36. targetHeight = target.height();
  37. basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
  38. } else if ( options.of.preventDefault ) {
  39. // force left top to allow flipping
  40. options.at = "left top";
  41. targetWidth = targetHeight = 0;
  42. basePosition = { top: options.of.pageY, left: options.of.pageX };
  43. } else {
  44. targetWidth = target.outerWidth();
  45. targetHeight = target.outerHeight();
  46. basePosition = target.offset();
  47. }
  48. // force my and at to have valid horizontal and veritcal positions
  49. // if a value is missing or invalid, it will be converted to center
  50. $.each( [ "my", "at" ], function() {
  51. var pos = ( options[this] || "" ).split( " " );
  52. if ( pos.length === 1) {
  53. pos = horizontalPositions.test( pos[0] ) ?
  54. pos.concat( [verticalDefault] ) :
  55. verticalPositions.test( pos[0] ) ?
  56. [ horizontalDefault ].concat( pos ) :
  57. [ horizontalDefault, verticalDefault ];
  58. }
  59. pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : horizontalDefault;
  60. pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : verticalDefault;
  61. options[ this ] = pos;
  62. });
  63. // normalize collision option
  64. if ( collision.length === 1 ) {
  65. collision[ 1 ] = collision[ 0 ];
  66. }
  67. // normalize offset option
  68. offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
  69. if ( offset.length === 1 ) {
  70. offset[ 1 ] = offset[ 0 ];
  71. }
  72. offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
  73. if ( options.at[0] === "right" ) {
  74. basePosition.left += targetWidth;
  75. } else if (options.at[0] === horizontalDefault ) {
  76. basePosition.left += targetWidth / 2;
  77. }
  78. if ( options.at[1] === "bottom" ) {
  79. basePosition.top += targetHeight;
  80. } else if ( options.at[1] === verticalDefault ) {
  81. basePosition.top += targetHeight / 2;
  82. }
  83. basePosition.left += offset[ 0 ];
  84. basePosition.top += offset[ 1 ];
  85. return this.each(function() {
  86. var elem = $( this ),
  87. elemWidth = elem.outerWidth(),
  88. elemHeight = elem.outerHeight(),
  89. position = $.extend( {}, basePosition );
  90. if ( options.my[0] === "right" ) {
  91. position.left -= elemWidth;
  92. } else if ( options.my[0] === horizontalDefault ) {
  93. position.left -= elemWidth / 2;
  94. }
  95. if ( options.my[1] === "bottom" ) {
  96. position.top -= elemHeight;
  97. } else if ( options.my[1] === verticalDefault ) {
  98. position.top -= elemHeight / 2;
  99. }
  100. $.each( [ "left", "top" ], function( i, dir ) {
  101. if ( $.ui.position[ collision[i] ] ) {
  102. $.ui.position[ collision[i] ][ dir ]( position, {
  103. targetWidth: targetWidth,
  104. targetHeight: targetHeight,
  105. elemWidth: elemWidth,
  106. elemHeight: elemHeight,
  107. offset: offset,
  108. my: options.my,
  109. at: options.at
  110. });
  111. }
  112. });
  113. if ( $.fn.bgiframe ) {
  114. elem.bgiframe();
  115. }
  116. elem.offset( $.extend( position, { using: options.using } ) );
  117. });
  118. };
  119. $.ui.position = {
  120. fit: {
  121. left: function( position, data ) {
  122. var win = $( window ),
  123. over = position.left + data.elemWidth - win.width() - win.scrollLeft();
  124. position.left = over > 0 ? position.left - over : Math.max( 0, position.left );
  125. },
  126. top: function( position, data ) {
  127. var win = $( window ),
  128. over = position.top + data.elemHeight - win.height() - win.scrollTop();
  129. position.top = over > 0 ? position.top - over : Math.max( 0, position.top );
  130. }
  131. },
  132. flip: {
  133. left: function( position, data ) {
  134. if ( data.at[0] === "center" ) {
  135. return;
  136. }
  137. var win = $( window ),
  138. over = position.left + data.elemWidth - win.width() - win.scrollLeft(),
  139. myOffset = data.my[ 0 ] === "left" ?
  140. -data.elemWidth :
  141. data.my[ 0 ] === "right" ?
  142. data.elemWidth :
  143. 0,
  144. offset = -2 * data.offset[ 0 ];
  145. position.left += position.left < 0 ?
  146. myOffset + data.targetWidth + offset :
  147. over > 0 ?
  148. myOffset - data.targetWidth + offset :
  149. 0;
  150. },
  151. top: function( position, data ) {
  152. if ( data.at[1] === "center" ) {
  153. return;
  154. }
  155. var win = $( window ),
  156. over = position.top + data.elemHeight - win.height() - win.scrollTop(),
  157. myOffset = data.my[ 1 ] === "top" ?
  158. -data.elemHeight :
  159. data.my[ 1 ] === "bottom" ?
  160. data.elemHeight :
  161. 0,
  162. atOffset = data.at[ 1 ] === "top" ?
  163. data.targetHeight :
  164. -data.targetHeight,
  165. offset = -2 * data.offset[ 1 ];
  166. position.top += position.top < 0 ?
  167. myOffset + data.targetHeight + offset :
  168. over > 0 ?
  169. myOffset + atOffset + offset :
  170. 0;
  171. }
  172. }
  173. };
  174. // offset setter from jQuery 1.4
  175. if ( !$.offset.setOffset ) {
  176. $.offset.setOffset = function( elem, options ) {
  177. // set position first, in-case top/left are set even on static elem
  178. if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
  179. elem.style.position = "relative";
  180. }
  181. var curElem = $( elem ),
  182. curOffset = curElem.offset(),
  183. curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
  184. curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
  185. props = {
  186. top: (options.top - curOffset.top) + curTop,
  187. left: (options.left - curOffset.left) + curLeft
  188. };
  189. if ( 'using' in options ) {
  190. options.using.call( elem, props );
  191. } else {
  192. curElem.css( props );
  193. }
  194. };
  195. $.fn.offset = function( options ) {
  196. var elem = this[ 0 ];
  197. if ( !elem || !elem.ownerDocument ) { return null; }
  198. if ( options ) {
  199. return this.each(function() {
  200. $.offset.setOffset( this, options );
  201. });
  202. }
  203. return _offset.call( this );
  204. };
  205. }
  206. }( jQuery ));