0
@@ -18,6 +18,24 @@ Element.Layout = Class.create({
0
+ _applyTemporaryStyles: function(element, styles) {
0
+ for (var property in styles) {
0
+ element['_original_' + property] = element.style[property];
0
+ element.setStyle(styles);
0
+ _removeTemporaryStyles: function(element) {
0
+ var prop, styles = {};
0
+ for (var property in element) {
0
+ if (!property.startsWith('_original_')) continue;
0
+ prop = property.replace(/^_original_/, '');
0
+ styles[prop] = element[property] || '';
0
+ element[property] = undefined;
0
+ element.setStyle(styles);
0
getLayout: function() {
0
var element = this.element,
0
display = element.getStyle('display'),
0
@@ -25,24 +43,32 @@ Element.Layout = Class.create({
0
// The style object is inaccessible in Safari <= 2.0 when the element
0
- var isNotShown = display === "none" || display === null
;
0
+ var isNotShown = display === "none" || display === null
|| element.offsetHeight == 0;
0
var isTable = element.tagName.toUpperCase() == 'TABLE';
0
+ var hasHiddenAncestor = false;
0
// If the element is hidden, we show it for an instant
0
- // to grab its dimensions.
0
+ // to grab its dimensions.
0
- var style = element.style;
0
- visibility: style.visibility,
0
- position: style.position,
0
- display: style.display
0
- Object.extend(style, {
0
+ this._applyTemporaryStyles(element, {
0
+ // If, after showing the element, it still has an offsetHeight of 0,
0
+ // we assume one of its ancestors is hidden.
0
+ hasHiddenAncestor = element.offsetHeight == 0;
0
+ if (hasHiddenAncestor) {
0
+ var ancestors = element.ancestors();
0
+ ancestors.each( function(ancestor) {
0
+ if (ancestor !== element && ancestor.visible()) return;
0
+ this._applyTemporaryStyles(ancestor, {
0
+ display: 'block', visibility: 'visible', position: 'absolute'
0
if (this.options.dimensions === true) {
0
@@ -69,7 +95,7 @@ Element.Layout = Class.create({
0
this.layout.paddingBox = paddingBox;
0
- var padding = this.
getStyleValuesFor('padding', 'trbl');
0
+ var padding = this.
_getStyleValuesFor('padding', 'trbl');
0
this.layout.padding = padding;
0
@@ -79,7 +105,7 @@ Element.Layout = Class.create({
0
this.layout.contentBox = contentBox;
0
- var border = this.
getStyleValuesFor('border', 'trbl');
0
+ var border = this.
_getStyleValuesFor('border', 'trbl');
0
this.layout.border = border;
0
@@ -106,7 +132,10 @@ Element.Layout = Class.create({
0
// If we altered the element's styles, return them to their
0
- Object.extend(style, originalStyle);
0
+ this._removeTemporaryStyles(element);
0
+ if (hasHiddenAncestor) {
0
+ ancestors.each(this._removeTemporaryStyles, this);
0
@@ -122,7 +151,7 @@ Element.Layout = Class.create({
0
// sidesNeeded argument is a string.
0
// "trbl" = top, right, bottom, left
0
-
getStyleValuesFor: function(property, sidesNeeded) {
0
+
_getStyleValuesFor: function(property, sidesNeeded) {
0
var sides = $w('top bottom left right');
0
var propertyNames = sides.map( function(s) {
0
return property + s.capitalize();
0
@@ -244,7 +273,7 @@ Element.Layout = Class.create({
0
// Then subtract cumulative scroll offsets
0
element = this.element;
0
- if (!Prototype.Browser.Opera || element.tagName.toUpperCase() == '
BODY') {
0
+ if (!Prototype.Browser.Opera || element.tagName.toUpperCase() == '
HTML') {
0
valueT -= element.scrollTop || 0;
0
valueL -= element.scrollLeft || 0;
0
@@ -279,7 +308,8 @@ Element.Layout = Class.create({
0
if (element.offsetParent) return $(element.offsetParent);
0
if (element == document.body) return $(element);
0
- while ((element = element.parentNode) && element !== document.body)
0
+ while ((element = element.parentNode) && element !== document.body
0
+ && element.nodeType !== 9)
0
if (Element.getStyle(element, 'position') !== 'static')
Comments
No one has commented yet.