昔話
Google MapsやPrototypeライブラリが認知されるにつれ,
それ以前は,
JavaScriptを使ったとしても,
今ではブラウザの UserAgent 文字列やバージョンを見て分岐する方法よりは,
最近は
では,
1609: getDimensions: function(element) {
1610: element = $(element);
1611: var display = $(element).getStyle('display');
1612: if (display != 'none' && display != null) // Safari bug
1613: return {width: element.offsetWidth, height: element.offsetHeight};
1614:
1615: // All *Width and *Height properties give 0 on elements with display none,
1616: // so enable the element temporarily
1617: var els = element.style;
1618: var originalVisibility = els.visibility;
1619: var originalPosition = els.position;
1620: var originalDisplay = els.display;
1621: els.visibility = 'hidden';
1622: els.position = 'absolute';
1623: els.display = 'block';
1624: var originalWidth = element.clientWidth;
1625: var originalHeight = element.clientHeight;
1626: els.display = originalDisplay;
1627: els.position = originalPosition;
1628: els.visibility = originalVisibility;
1629: return {width: originalWidth, height: originalHeight};
1630: },
1631:
1609行目からはgetDimensions()です。
style.
次に,
displayの値によって,
1632: makePositioned: function(element) {
1633: element = $(element);
1634: var pos = Element.getStyle(element, 'position');
1635: if (pos == 'static' || !pos) {
1636: element._madePositioned = true;
1637: element.style.position = 'relative';
1638: // Opera returns the offset relative to the positioning context, when an
1639: // element is position relative but top and left have not been defined
1640: if (window.opera) {
1641: element.style.top = 0;
1642: element.style.left = 0;
1643: }
1644: }
1645: return element;
1646: },
1647:
1648: undoPositioned: function(element) {
1649: element = $(element);
1650: if (element._madePositioned) {
1651: element._madePositioned = undefined;
1652: element.style.position =
1653: element.style.top =
1654: element.style.left =
1655: element.style.bottom =
1656: element.style.right = '';
1657: }
1658: return element;
1659: },
1660:
1632行目からはmakePositioned()です。
style.
'relative'に設定することで,
コメントで言及されているOperaでの問題ですが,
1648行目からはundoPositioned()です。
先ほどmakePositioned()で設定した_madePositionedフラグが設定されていれば元に戻す処理を行い,
戻す際には,
1661: makeClipping: function(element) {
1662: element = $(element);
1663: if (element._overflow) return element;
1664: element._overflow = element.style.overflow || 'auto';
1665: if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
1666: element.style.overflow = 'hidden';
1667: return element;
1668: },
1669:
1670: undoClipping: function(element) {
1671: element = $(element);
1672: if (!element._overflow) return element;
1673: element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
1674: element._overflow = null;
1675: return element;
1676: }
1677: };
1678:
1661行目からはmakeClipping()です。
この関数とundoClipping()では,
そして,
次にElement.
そして1670行目からはundoClipping()です。
makeClipping()関数により_overflowプロパティが設定されていなければ,
設定されていれば,
最後に,
1679: Object.extend(Element.Methods, {
1680: childOf: Element.Methods.descendantOf,
1681: childElements: Element.Methods.immediateDescendants
1682: });
1683:
1679行目からはElement.