public
Description: Prototype JavaScript framework
Homepage: http://prototypejs.org/
Clone URL: git://github.com/sstephenson/prototype.git
Fix issues with Element#clonePosition and element border/padding.
Sun Jun 29 12:57:39 -0700 2008
commit  b16cd835ae99333e6210c94ada2bb5de47f8eca0
tree    b3aaf7a44944834f367b07eb81fa0319a91ae816
parent  6f27d553226bc27740ff5e64f0f281279d7e0db7
...
 
 
1
2
3
...
1
2
3
4
5
0
@@ -1,3 +1,5 @@
0
+* Fix issues with Element#clonePosition and element border/padding. [staaky, jddalton]
0
+
0
 * Remove the redefinition of Element#getOffsetParent in IE. [staaky, jddalton]
0
 
0
 * Make Element#getDimensions always use offset(Height|Width) rather than client(Height|Width). [staaky, jddalton]
...
624
625
626
627
628
 
629
630
631
632
633
634
635
636
637
638
639
640
 
 
 
 
 
 
641
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
642
643
644
...
732
733
734
 
 
 
735
736
 
737
738
 
 
 
 
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
...
624
625
626
 
 
627
628
 
 
 
 
 
 
 
 
 
 
 
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
...
743
744
745
746
747
748
749
 
750
751
752
753
754
755
756
757
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
758
759
760
0
@@ -624,21 +624,32 @@ Object.extend(Element.Methods, (function() {
0
   }
0
 
0
   function cloneDimension(element, source, dimension) {
0
- var d = Element.getDimensions(source), style = { };
0
- style[dimension] = d[dimension] + 'px';
0
+ var style = { }, properties;
0
     
0
- var styles = $w('margin padding'),
0
- sides = (dimension === 'height') ? $w('top bottom') : $w('left right');
0
-
0
- // Avoiding helpers like $w for speed
0
- var property;
0
- for (var i = 0; i < 2; i++) {
0
- for (var j = 0; j < 2; j++) {
0
- property = styles[i] + sides[j].capitalize();
0
- style[property] = (getNumericStyle(element, property) +
0
- getStyleDiff(element, source, property)) + 'px';
0
- }
0
+ if (dimension === 'height') {
0
+ properties = $w('borderTopWidth marginTop paddingTop ' +
0
+ 'borderBottomWidth marginBottom paddingBottom');
0
+ } else {
0
+ properties = $w('borderLeftWidth marginLeft paddingLeft ' +
0
+ 'borderRightWidth marginRight paddingRight');
0
     }
0
+
0
+ style[dimension] = Element.getDimensions(source)[dimension];
0
+
0
+ // Adjust element border and padding for accurate dimensions and
0
+ // margins for accurate position.
0
+ for (var i = 0, property, value; property = properties[i]; i++) {
0
+ if (property.include('margin')) {
0
+ value = getNumericStyle(element, property);
0
+ style[property] = value + (getNumericStyle(source, property) -
0
+ value) + 'px';
0
+ } else {
0
+ value = getNumericStyle(source, property);
0
+ style[property] = value + 'px';
0
+ style[dimension] -= value;
0
+ }
0
+ }
0
+ style[dimension] += 'px';
0
     Element.setStyle(element, style);
0
   }
0
   
0
@@ -732,30 +743,18 @@ Object.extend(Element.Methods, (function() {
0
         delta[0] -= document.body.offsetLeft;
0
         delta[1] -= document.body.offsetTop;
0
       }
0
+
0
+ // find page position of source
0
+ var p = Element.viewportOffset(source);
0
 
0
- // set dimensions
0
+ // set dimensions and position
0
       if (options.setWidth) cloneDimension(element, source, 'width');
0
       if (options.setHeight) cloneDimension(element, source, 'height');
0
+ if (options.setLeft)
0
+ element.style.left = (p[0] - delta[0] + options.offsetLeft + 'px');
0
+ if (options.setTop)
0
+ element.style.top = (p[1] - delta[1] + options.offsetTop + 'px');
0
 
0
- // find page position of source
0
- var p = Element.viewportOffset(source),
0
- borderOffset = ['borderLeftWidth', 'borderTopWidth'].map(
0
- function(style) { return getStyleDiff(element, source, style) });
0
-
0
- if (options.setLeft) {
0
- var left = p[0] - delta[0] + borderOffset[0];
0
- if (options.offsetLeft)
0
- left += options.offsetLeft + getNumericStyle(element, 'paddingLeft');
0
-
0
- element.style.left = left + 'px';
0
- }
0
- if (options.setTop) {
0
- var top = p[1] - delta[1] + borderOffset[1];
0
- if (options.offsetTop)
0
- top += options.offsetTop + getNumericStyle(element, 'paddingTop');
0
-
0
- element.style.top = top + 'px';
0
- }
0
       return element;
0
     }
0
   };

Comments

    No one has commented yet.