私の問題は、次のデモhttp://jsfiddle.net/legrass/ca22L/およびhttp://jsfiddle.net/legrass/eER66/2/に関連しています。
つまり、ページ上のいくつかの要素を(たとえば、赤い境界線で)強調表示する必要がありますが、実際の要素には触れないでください(元のページのレイアウトに影響を与えないようにするため)。そのために、JSでは、要素の上に絶対的に配置された「オーバーレイ」要素を作成して、左上の座標を使用して強調表示します。これらは本文に追加され、CSSを介してスタイル設定されます(最初のJSFiddleを参照)。例えば:
<body>
<div class='overlay'>
<span class="a" style="top: 14px; left: 321px; width: 200px; height: 140px;"> </span>
<span class="b" style="top: 52px; left: 351px; width: 140px; height: 63px;"> </span>
<span class="c" style="top: 72px; left: 400px; width: 8px; height: 16px;"></span>
<span class="c" style="top: 74px; left: 420px; width: 8px; height: 16px;"></span>
</div>
....
それはうまくいきます。ただし、より柔軟なcssセレクター(子など)を使用できるようにするには、次のようにネストして上記のオーバーレイを作成する必要があります。
<body>
<div class='overlay'>
<span class="a" style="top: 14px; left: 321px; width: 200px; height: 140px;">
<span class="b" style="top: 52px; left: 351px; width: 140px; height: 63px;">
<span class="c" style="top: 72px; left: 400px; width: 8px; height: 16px;"></span>
<span class="c" style="top: 74px; left: 420px; width: 8px; height: 16px;"></span>
<span/>
<span/>
</div>
....
入れ子は任意の深さにすることができます。残念ながら、現在の位置は正しくありません(2番目のJSFiddleを参照)。
これは、各スパンが絶対的に配置されているが、その親を基準にして配置されており、単一のコンテナdivに対しては配置されていないためだと理解しています。相対測位を試しましたが、もちろん機能しません。
質問:最初のJSfiddleのようにレイアウトを取得する方法はありますが、階層全体を維持する方法はありますか?
更新 以下の回答から、offsetLeftとoffsetTopを使用して座標を調整すると非常に役立ちます。DOMを上って、offsetParentが存在するまでoffsetLeft(offsetTop)を追加する合計オフセットを計算します。ただし、結果はまだ数ピクセルシフトされており、考慮すべきことが他にあるようです。何か案が?
解決済み コメントで後述するように、境界線の幅も考慮する必要があります。