Tja, das ist ja wohl wirklich nicht ganz einfach. Der einzige Anhaltspunkt ist offsetLeft, und mir fällt zur Berechnung keine bessere Methode ein als diese:
function getMarginLeftUsedValue(element) {
var elementComputedStyle = window.getComputedStyle(element, null);
var computedMarginLeft = elementComputedStyle.marginLeft;
if (parseFloat(computedMarginLeft) != 0)
return computedMarginLeft;
if (!/^(relative|static)$/.test(elementComputedStyle.position))
return computedMarginLeft;
var offsetParent = element.offsetParent;
var containingBlock = element.parentNode;
var containingBlockComputedStyle = window.getComputedStyle(containingBlock, null);
while(!/^((inline-)?block|list-item|run-in|table(-cell)?)$/i.test(containingBlockComputedStyle.display)) {
containingBlock = containingBlock.parentNode;
containingBlockComputedStyle = window.getComputedStyle(containingBlock, null);
}
var distanceLeft; // horizontal distance to containing block
if (containingBlock == offsetParent) { // containing block is positioned
distanceLeft = element.offsetLeft;
} else { // containing block has position:static -> containingBlock.offsetParent = root element
distanceLeft = element.offsetLeft - containingBlock.offsetLeft;
do {
distanceLeft += offsetParent.offsetLeft;
} while (offsetParent = offsetParent.offsetParent) // confusing, eh?
}
if (elementComputedStyle.position == 'relative')
return (distanceLeft - parseFloat(containingBlockComputedStyle.paddingLeft) - parseFloat(elementComputedStyle.left)) + 'px';
else // elementComputedStyle.position = 'static'
return (distanceLeft - parseFloat(containingBlockComputedStyle.paddingLeft)) + 'px';
}
Und alles nur weil
The CSS Object Model doesn't provide an access to the specified or actual values of the CSS cascade.
Wenn euch eine einfachere Lösung einfällt, her damit!