ページ絶対位置問題の探索を取得
私たちはよくある要素のページの絶対位置を得る必要があります.例えば、絶対位置のdivを特定の位置にポップアップする必要があります.ある要素の周りにいる場合もあります.マウスでクリックした場所にいる場合もあります.もし私たちが便利に希望のページの絶対位置を手に入れたら、top left属性を指定すればいいです.便利です.あいにくこの方面でIEは標準と一致していないので、まとめる必要があります.Extjsは既成のブリッジツールで、各ブラウザの違いを遮断してくれました.
主に2つの場所です.
Ext.Element.getXY()
この方法は、ページ内の要素の枠線の開始(枠線を含まない)の左、上、右、および下のそれぞれがブラウザウィンドウ(すなわち、スクロール長を含まない)に対する位置を取得し、ブラウザモードとは無関係である.
テストコード:
ページ要素の絶対ページ位置を取得します.この方法は主にgetBoundingClientRect(注意:IEデフォルトbodyには枠線があり、firefox、chromeにはない)および現在明確な基準がないoffsetTopおよびoffsetParentを用い、offsetTopは現在の要素と彼の含むブロック要素との間の高さの差を指す(詳細:ボックスモデル参照).この点ie ffはほぼ一致しており,差は小さい.しかし、相対要素offsetParentについては議論がある(詳細はoffsetParent検討参照).
1.getBoundingClientRectが存在する場合
Extの方法は俗称を約束する:
2.その他
offsetParentは、現在の要素の位置付けされた祖先要素(position属性がstaticに等しくない)であるため、親要素offsetTopが現在の要素の上縁ieを含まないとは限らず、ffはbodyにoffsetParentがないと考えている.
そこで大まかに言えば、offsetParentに沿って上へoffsetTopを積算すればよい.Extjsはまさにこのようにしているが、各ブラウザの詳細をより多く考慮しただけで、特にその要素の祖先要素たちがスクロールバー(overflowはvisibleではない)を含んでいる場合、以下のように減算する.
x座標はy座標と同じである.
Ext.EventObject.getPageY()
これは、現在のイベントの発生絶対ページ位置を表し、マウスイベントの場合にのみ有効です.たとえば、クリック、マウスの通過などです.
w 3 cではeventを直接規定する.pageXは、現在のイベントの発生絶対ページの位置です.
ieは直接的な獲得方法がなく、ie専用のevent.ClientXは絶対可視位置であり(スクロールバーを無視)、スクロールバーがスクロールされたページの高さを加算するだけでよい.つまり、ページがどのくらいスクロールされていますか?そうだよscrollTopプロパティ、意味もよくわかります
要素:body
動作:scroll
方向:top
値body.scrollTop
ページがw 3 c標準モードにある場合:以上のbodyはdocumentに変更する.documentElementです.標準モードのとき、これらの属性はhtmlノードに置かれます.
次の記事では、Ext.EventObjectがデフォルトのイベントの発生を阻止する方法と、従来のreturn falseを簡単に説明します.
PS: KISSY実現とiframe内の要素の考慮 :
iframeを考慮して、その内の要素に対してiframeの座標を先に解き、iframe elementが含まれているフォームの座標を再帰的に解きます.
PS2 : ページの絶対位置の設定の検討
主に2つの場所です.
Ext.Element.getXY()
この方法は、ページ内の要素の枠線の開始(枠線を含まない)の左、上、右、および下のそれぞれがブラウザウィンドウ(すなわち、スクロール長を含まない)に対する位置を取得し、ブラウザモードとは無関係である.
テストコード:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> </title>
<style type="text/css">
html,body{
margin:0;
border:0;
padding:0;
}
</style>
</head>
<body>
<div id="q"
style="border:1px solid red;padding:10px;margin:100px;width:600px;height:600px;position:relative;"
>
z
<div id="demo"
style="border:1px solid red;padding:10px;margin:100px;width:10px;height:10px;"
>
</div>
</div>
<script type="text/javascript">
alert(document.getElementById('demo').getBoundingClientRect().top - document.getElementById('q').getBoundingClientRect().top);
</script>
</body>
</html>
ページ要素の絶対ページ位置を取得します.この方法は主にgetBoundingClientRect(注意:IEデフォルトbodyには枠線があり、firefox、chromeにはない)および現在明確な基準がないoffsetTopおよびoffsetParentを用い、offsetTopは現在の要素と彼の含むブロック要素との間の高さの差を指す(詳細:ボックスモデル参照).この点ie ffはほぼ一致しており,差は小さい.しかし、相対要素offsetParentについては議論がある(詳細はoffsetParent検討参照).
1.getBoundingClientRectが存在する場合
Extの方法は俗称を約束する:
if (el.getBoundingClientRect) {
b = el.getBoundingClientRect();
scroll = fly(document).getScroll();
return [b.left + scroll.left, b.top + scroll.top];
}
2.その他
offsetParentは、現在の要素の位置付けされた祖先要素(position属性がstaticに等しくない)であるため、親要素offsetTopが現在の要素の上縁ieを含まないとは限らず、ffはbodyにoffsetParentがないと考えている.
そこで大まかに言えば、offsetParentに沿って上へoffsetTopを積算すればよい.Extjsはまさにこのようにしているが、各ブラウザの詳細をより多く考慮しただけで、特にその要素の祖先要素たちがスクロールバー(overflowはvisibleではない)を含んでいる場合、以下のように減算する.
//x,y offsetTop offsetParent ,
while (p && p != bd) {
if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) {
x -= p.scrollLeft;
y -= p.scrollTop;
}
p = p.parentNode;
}
x座標はy座標と同じである.
Ext.EventObject.getPageY()
これは、現在のイベントの発生絶対ページ位置を表し、マウスイベントの場合にのみ有効です.たとえば、クリック、マウスの通過などです.
w 3 cではeventを直接規定する.pageXは、現在のイベントの発生絶対ページの位置です.
ieは直接的な獲得方法がなく、ie専用のevent.ClientXは絶対可視位置であり(スクロールバーを無視)、スクロールバーがスクロールされたページの高さを加算するだけでよい.つまり、ページがどのくらいスクロールされていますか?そうだよscrollTopプロパティ、意味もよくわかります
要素:body
動作:scroll
方向:top
値body.scrollTop
ページがw 3 c標準モードにある場合:以上のbodyはdocumentに変更する.documentElementです.標準モードのとき、これらの属性はhtmlノードに置かれます.
次の記事では、Ext.EventObjectがデフォルトのイベントの発生を阻止する方法と、従来のreturn falseを簡単に説明します.
PS: KISSY実現とiframe内の要素の考慮 :
iframeを考慮して、その内の要素に対してiframeの座標を先に解き、iframe elementが含まれているフォームの座標を再帰的に解きます.
/**
* support elment in iframe
* @param elem
* @param refDocument
*/
function getOffset(elem, refDocument) {
var box, x = 0,
y = 0,
currentWindow = elem.ownerDocument.defaultView || elem.ownerDocument.parentWindow,
currentDoc = elem.ownerDocument,
currentDocElem = currentDoc.documentElement;
// 1. body docElem, 0, ,
// 2. GBS ,A-Grade Browsers getBoundingClientRect ,
if (elem[GET_BOUNDING_CLIENT_RECT]) {
if (elem !== currentDoc.body && currentDocElem !== elem) {
box = elem[GET_BOUNDING_CLIENT_RECT]();
// :jQuery docElem.clientLeft/clientTop
// , html body / ,
// ,ie6 html margin , html margin
x = box.left + _scrollLeft(currentWindow, currentDocElem, currentDoc);
y = box.top + _scrollTop(currentWindow, currentDocElem, currentDoc);
}
if (refDocument) {
var refWindow = refDocument.defaultView || refDocument.parentWindow;
if (currentWindow != refWindow && currentWindow.frameElement) {
//note:when iframe is static ,still some mistake
var iframePosition = DOM.offset(currentWindow.frameElement, refDocument);
x += iframePosition.left;
y += iframePosition.top;
}
}
}
return { left: x, top: y };
}
PS2 : ページの絶対位置の設定の検討