[69] | 1 | /* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net) |
---|
| 2 | * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) |
---|
| 3 | * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. |
---|
| 4 | * |
---|
| 5 | * $LastChangedDate: 2007-11-14 21:20:00 +0100 (Wed, 14 Nov 2007) $ |
---|
| 6 | * $Rev: 3824 $ |
---|
| 7 | * |
---|
| 8 | * Version: @VERSION |
---|
| 9 | * |
---|
| 10 | * Requires: jQuery 1.2+ |
---|
| 11 | */ |
---|
| 12 | |
---|
| 13 | (function($){ |
---|
| 14 | |
---|
| 15 | $.dimensions = { |
---|
| 16 | version: '@VERSION' |
---|
| 17 | }; |
---|
| 18 | |
---|
| 19 | // Create innerHeight, innerWidth, outerHeight and outerWidth methods |
---|
| 20 | $.each( [ 'Height', 'Width' ], function(i, name){ |
---|
| 21 | |
---|
| 22 | // innerHeight and innerWidth |
---|
| 23 | $.fn[ 'inner' + name ] = function() { |
---|
| 24 | if (!this[0]) return; |
---|
| 25 | |
---|
| 26 | var torl = name == 'Height' ? 'Top' : 'Left', // top or left |
---|
| 27 | borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right |
---|
| 28 | |
---|
| 29 | return this.is(':visible') ? this[0]['client' + name] : num( this, name.toLowerCase() ) + num(this, 'padding' + torl) + num(this, 'padding' + borr); |
---|
| 30 | }; |
---|
| 31 | |
---|
| 32 | // outerHeight and outerWidth |
---|
| 33 | $.fn[ 'outer' + name ] = function(options) { |
---|
| 34 | if (!this[0]) return; |
---|
| 35 | |
---|
| 36 | var torl = name == 'Height' ? 'Top' : 'Left', // top or left |
---|
| 37 | borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right |
---|
| 38 | |
---|
| 39 | options = $.extend({ margin: false }, options || {}); |
---|
| 40 | |
---|
| 41 | var val = this.is(':visible') ? |
---|
| 42 | this[0]['offset' + name] : |
---|
| 43 | num( this, name.toLowerCase() ) |
---|
| 44 | + num(this, 'border' + torl + 'Width') + num(this, 'border' + borr + 'Width') |
---|
| 45 | + num(this, 'padding' + torl) + num(this, 'padding' + borr); |
---|
| 46 | |
---|
| 47 | return val + (options.margin ? (num(this, 'margin' + torl) + num(this, 'margin' + borr)) : 0); |
---|
| 48 | }; |
---|
| 49 | }); |
---|
| 50 | |
---|
| 51 | // Create scrollLeft and scrollTop methods |
---|
| 52 | $.each( ['Left', 'Top'], function(i, name) { |
---|
| 53 | $.fn[ 'scroll' + name ] = function(val) { |
---|
| 54 | if (!this[0]) return; |
---|
| 55 | |
---|
| 56 | return val != undefined ? |
---|
| 57 | |
---|
| 58 | // Set the scroll offset |
---|
| 59 | this.each(function() { |
---|
| 60 | this == window || this == document ? |
---|
| 61 | window.scrollTo( |
---|
| 62 | name == 'Left' ? val : $(window)[ 'scrollLeft' ](), |
---|
| 63 | name == 'Top' ? val : $(window)[ 'scrollTop' ]() |
---|
| 64 | ) : |
---|
| 65 | this[ 'scroll' + name ] = val; |
---|
| 66 | }) : |
---|
| 67 | |
---|
| 68 | // Return the scroll offset |
---|
| 69 | this[0] == window || this[0] == document ? |
---|
| 70 | self[ (name == 'Left' ? 'pageXOffset' : 'pageYOffset') ] || |
---|
| 71 | $.boxModel && document.documentElement[ 'scroll' + name ] || |
---|
| 72 | document.body[ 'scroll' + name ] : |
---|
| 73 | this[0][ 'scroll' + name ]; |
---|
| 74 | }; |
---|
| 75 | }); |
---|
| 76 | |
---|
| 77 | $.fn.extend({ |
---|
| 78 | position: function() { |
---|
| 79 | var left = 0, top = 0, elem = this[0], offset, parentOffset, offsetParent, results; |
---|
| 80 | |
---|
| 81 | if (elem) { |
---|
| 82 | // Get *real* offsetParent |
---|
| 83 | offsetParent = this.offsetParent(); |
---|
| 84 | |
---|
| 85 | // Get correct offsets |
---|
| 86 | offset = this.offset(); |
---|
| 87 | parentOffset = offsetParent.offset(); |
---|
| 88 | |
---|
| 89 | // Subtract element margins |
---|
| 90 | offset.top -= num(elem, 'marginTop'); |
---|
| 91 | offset.left -= num(elem, 'marginLeft'); |
---|
| 92 | |
---|
| 93 | // Add offsetParent borders |
---|
| 94 | parentOffset.top += num(offsetParent, 'borderTopWidth'); |
---|
| 95 | parentOffset.left += num(offsetParent, 'borderLeftWidth'); |
---|
| 96 | |
---|
| 97 | // Subtract the two offsets |
---|
| 98 | results = { |
---|
| 99 | top: offset.top - parentOffset.top, |
---|
| 100 | left: offset.left - parentOffset.left |
---|
| 101 | }; |
---|
| 102 | } |
---|
| 103 | |
---|
| 104 | return results; |
---|
| 105 | }, |
---|
| 106 | |
---|
| 107 | offsetParent: function() { |
---|
| 108 | var offsetParent = this[0].offsetParent; |
---|
| 109 | while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static') ) |
---|
| 110 | offsetParent = offsetParent.offsetParent; |
---|
| 111 | return $(offsetParent); |
---|
| 112 | } |
---|
| 113 | }); |
---|
| 114 | |
---|
| 115 | function num(el, prop) { |
---|
| 116 | return parseInt($.css(el.jquery?el[0]:el,prop))||0; |
---|
| 117 | }; |
---|
| 118 | |
---|
| 119 | })(jQuery); |
---|