è¦ç§»å¨é¡µé¢çå ç´ ï¼æä»¬åºè¯¥å çæåæ ã
大夿° JavaScript æ¹æ³å¤ççæ¯ä»¥ä¸ä¸¤ç§åæ ç³»ä¸çä¸ä¸ªï¼
- ç¸å¯¹äºçªå£ ââ 类似äº
position:fixedï¼ä»çªå£çé¡¶é¨/左侧边ç¼è®¡ç®å¾åºã- æä»¬å°è¿äºåæ 表示为
clientX/clientYï¼å½æä»¬ç ç©¶äºä»¶å±æ§æ¶ï¼å°±ä¼æç½ä¸ºä»ä¹ä½¿ç¨è¿ç§åç§°æ¥è¡¨ç¤ºåæ ã
- æä»¬å°è¿äºåæ 表示为
- ç¸å¯¹äºææ¡£ ââ ä¸ææ¡£æ ¹ï¼document rootï¼ä¸ç
position:absolute类似ï¼ä»ææ¡£çé¡¶é¨/左侧边ç¼è®¡ç®å¾åºã- æä»¬å°å®ä»¬è¡¨ç¤ºä¸º
pageX/pageYã
- æä»¬å°å®ä»¬è¡¨ç¤ºä¸º
å½é¡µé¢æ»å¨å°æå¼å§æ¶ï¼æ¤æ¶çªå£çå·¦ä¸è§æ°å¥½æ¯ææ¡£çå·¦ä¸è§ï¼å®ä»¬çåæ å½¼æ¤ç¸çã使¯ï¼å¨ææ¡£ç§»å¨ä¹åï¼å ç´ ççªå£ç¸å¯¹åæ ä¼åçååï¼å 为å ç´ å¨çªå£ä¸ç§»å¨ï¼èå ç´ å¨ææ¡£ä¸çç¸å¯¹åæ ä¿æä¸åã
å¨ä¸å¾ä¸ï¼æä»¬å¨ææ¡£ä¸åä¸ç¹ï¼å¹¶æ¼ç¤ºäºå®æ»å¨ä¹åï¼å·¦ï¼åä¹åï¼å³ï¼çåæ ï¼
å½ææ¡£æ»å¨äºï¼
pageYââ å ç´ å¨ææ¡£ä¸çç¸å¯¹åæ ä¿æä¸åï¼ä»ææ¡£é¡¶é¨ï¼ç°å¨å·²æ»å¨åºå»ï¼å¼å§è®¡ç®ãclientYââ çªå£ç¸å¯¹åæ ç¡®å®åçäºååï¼ç®å¤´åçäºï¼ï¼å 为åä¸ä¸ªç¹è¶æ¥è¶é è¿çªå£é¡¶é¨ã
å ç´ åæ ï¼getBoundingClientRect
æ¹æ³ elem.getBoundingClientRect() è¿åæå°ç©å½¢ççªå£åæ ï¼è¯¥ç©å½¢å° elem ä½ä¸ºå
建 DOMRect ç±»ç对象ã
主è¦ç DOMRect 屿§ï¼
x/yââ ç©å½¢åç¹ç¸å¯¹äºçªå£ç X/Y åæ ï¼width/heightââ ç©å½¢ç width/heightï¼å¯ä»¥ä¸ºè´ï¼ã
æ¤å¤ï¼è¿ææ´¾çï¼derivedï¼å±æ§ï¼
top/bottomââ é¡¶é¨/åºé¨ç©å½¢è¾¹ç¼ç Y åæ ï¼left/rightââ å·¦/å³ç©å½¢è¾¹ç¼ç X åæ ã
ä¾å¦ï¼ç¹å»ä¸é¢è¿ä¸ªæé®ä»¥æ¥çå ¶çªå£åæ ï¼
å¦æä½ æ»å¨æ¤é¡µé¢å¹¶éå¤ç¹å»ä¸é¢é£ä¸ªæé®ï¼ä½ ä¼åç°éççªå£ç¸å¯¹æé®ä½ç½®çæ¹åï¼å
¶çªå£åæ ï¼å¦æä½ åç´æ»å¨é¡µé¢ï¼å为 y/top/bottomï¼ä¹é乿¹åã
ä¸é¢è¿å¼ æ¯ elem.getBoundingClientRect() çè¾åºç示æå¾ï¼
æ£å¦ä½ æçå°çï¼x/y å width/height 对ç©å½¢è¿è¡äºå®æ´çæè¿°ãå¯ä»¥å¾å®¹æå°ä»å®ä»¬è®¡ç®åºæ´¾çï¼derivedï¼å±æ§ï¼
left = xtop = yright = x + widthbottom = y + height
请注æï¼
- åæ å¯è½æ¯å°æ°ï¼ä¾å¦
10.5ãè¿æ¯æ£å¸¸çï¼æµè§å¨å é¨ä½¿ç¨å°æ°è¿è¡è®¡ç®ãå¨è®¾ç½®style.left/topæ¶ï¼æä»¬ä¸æ¯å¿ 须对å®ä»¬è¿è¡èå ¥ã - åæ å¯è½æ¯è´æ°ãä¾å¦æ»å¨é¡µé¢ï¼ä½¿
elemç°å¨ä½äºçªå£ç䏿¹ï¼åelem.getBoundingClientRect().topä¸ºè´æ°ã
x/yï¼ä¸ºä»ä¹è¿è¦è¿ä¼åå¨ top/leftï¼ä»æ°å¦ä¸è®²ï¼ä¸ä¸ªç©å½¢æ¯ä½¿ç¨å
¶èµ·ç¹ (x,y) åæ¹ååé (width,height) å¯ä¸å®ä¹çãå æ¤ï¼å
¶å®æ´¾ç屿§æ¯ä¸ºäºæ¹ä¾¿èµ·è§ã
仿æ¯ä¸è®²ï¼width/height å¯è½ä¸ºè´æ°ï¼ä»èå
许âå®åï¼directedï¼âç©å½¢ï¼ä¾å¦ä»£è¡¨å¸¦ææ£ç¡®æ è®°çå¼å§åç»æçé¼ æ éæ©ã
è´ç width/height å¼è¡¨ç¤ºç©å½¢ä»å
¶å³ä¸è§å¼å§ï¼ç¶åå左䏿¹âå¢é¿âã
è¿æ¯ä¸ä¸ªç©å½¢ï¼å
¶ width å height åä¸ºè´æ°ï¼ä¾å¦ width=-200ï¼height=-100ï¼ï¼
æ£å¦ä½ æçå°çï¼å¨è¿ä¸ªä¾åä¸ï¼left/top ä¸ x/y ä¸ç¸çã
使¯å®é
ä¸ï¼elem.getBoundingClientRect() æ»æ¯è¿åæ£æ°ç width/heightï¼è¿éæä»¬æåè´ç width/height åªæ¯ä¸ºäºå¸®å©ä½ çè§£ï¼ä¸ºä»ä¹è¿äºçèµ·æ¥éå¤ç屿§ï¼å®é
ä¸å¹¶ä¸æ¯éå¤çã
x/yç±äºåå²åå ï¼IE æµè§å¨ä¸æ¯æ x/y 屿§ã
å æ¤ï¼æä»¬å¯ä»¥åä¸ä¸ª polyfillï¼å¨ DomRect.prototype 䏿·»å ä¸ä¸ª getterï¼ï¼æè
ä»
ä½¿ç¨ top/leftï¼å ä¸ºå¯¹äºæ£å¼ç width/height æ¥è¯´ï¼å®ä»¬å x/y ä¸ç´æ¯ä¸æ ·çï¼å°¤å
¶æ¯å¯¹äº elem.getBoundingClientRect() çç»æã
ç¸å¯¹äºçªå£ï¼windowï¼çåæ å CSS position:fixed ä¹é´æææ¾çç¸ä¼¼ä¹å¤ã
使¯å¨ CSS å®ä½ä¸ï¼right 屿§è¡¨ç¤ºè·å³è¾¹ç¼çè·ç¦»ï¼è bottom 屿§è¡¨ç¤ºè·ä¸è¾¹ç¼çè·ç¦»ã
妿æä»¬åçä¸ä¸ä¸é¢çå¾çï¼æä»¬å¯ä»¥çå°å¨ JavaScript ä¸å¹¶é妿¤ãçªå£çææåæ é½ä»å·¦ä¸è§å¼å§è®¡æ°ï¼å æ¬è¿äºåæ ã
elementFromPoint(x, y)
对 document.elementFromPoint(x, y) çè°ç¨ä¼è¿åå¨çªå£åæ (x, y) å¤åµå¥æå¤ï¼the most nestedï¼çå
ç´ ã
è¯æ³å¦ä¸ï¼
let elem = document.elementFromPoint(x, y);
ä¾å¦ï¼ä¸é¢ç代ç ä¼é«äº®æ¾ç¤ºå¹¶è¾åºç°å¨ä½äºçªå£ä¸é´çå ç´ çæ ç¾ï¼
let centerX = document.documentElement.clientWidth / 2;
let centerY = document.documentElement.clientHeight / 2;
let elem = document.elementFromPoint(centerX, centerY);
elem.style.background = "red";
alert(elem.tagName);
å 为å®ä½¿ç¨çæ¯çªå£åæ ï¼æä»¥å ç´ å¯è½ä¼å å½åæ»å¨ä½ç½®èææä¸åã
elementFromPoint è¿å nullæ¹æ³ document.elementFromPoint(x,y) åªå¯¹å¨å¯è§åºåå
çåæ (x,y) èµ·ä½ç¨ã
妿任ä½åæ ä¸ºè´æè
è¶
è¿äºçªå£ç width/heightï¼é£ä¹è¯¥æ¹æ³å°±ä¼è¿å nullã
å¨å¤§å¤æ°æ åµä¸ï¼è¿ç§è¡ä¸ºå¹¶ä¸æ¯ä¸ä¸ªé®é¢ï¼ä½æ¯æä»¬åºè¯¥è®°ä½è¿ä¸ç¹ã
妿æä»¬æ²¡æå¯¹å ¶è¿è¡æ£æ¥ï¼å¯è½å°±ä¼åçä¸é¢è¿ä¸ªå ¸åçé误ï¼
let elem = document.elementFromPoint(x, y);
// å¦æåæ æ°å¥½å¨çªå£å¤ï¼å elem = null
elem.style.background = ''; // Error!
ç¨äº âfixedâ å®ä½
大夿°æ¶åï¼æä»¬éè¦ä½¿ç¨åæ æ¥ç¡®å®æäºå 容çä½ç½®ã
æ³è¦å¨æå
ç´ éè¿å±ç¤ºå
å®¹ï¼æä»¬å¯ä»¥ä½¿ç¨ getBoundingClientRect æ¥è·åè¿ä¸ªå
ç´ çåæ ï¼ç¶åä½¿ç¨ CSS position 以å left/topï¼æ right/bottomï¼ã
ä¾å¦ï¼ä¸é¢ç彿° createMessageUnder(elem, html) å¨ elem 䏿¾ç¤ºäºæ¶æ¯ï¼
let elem = document.getElementById("coords-show-mark");
function createMessageUnder(elem, html) {
// å建 message å
ç´
let message = document.createElement('div');
// å¨è¿éæå¥½ä½¿ç¨ CSS class æ¥å®ä¹æ ·å¼
message.style.cssText = "position:fixed; color: red";
// åé
åæ ï¼ä¸è¦å¿è®° "px"ï¼
let coords = elem.getBoundingClientRect();
message.style.left = coords.left + "px";
message.style.top = coords.bottom + "px";
message.innerHTML = html;
return message;
}
// ç¨æ³ï¼
// å¨ææ¡£ä¸æ·»å message ä¿æ 5 ç§
let message = createMessageUnder(elem, 'Hello, world!');
document.body.append(message);
setTimeout(() => message.remove(), 5000);
ç¹å»ä¸é¢è¿ä¸ªæé®æ¥è¿è¡å®ï¼
æä»¬å¯ä»¥ä¿®æ¹ä»£ç 以å¨å ç´ å·¦ä¾§ï¼å³ä¾§æä¸é¢æ¾ç¤ºæ¶æ¯ï¼ä¹å¯ä»¥åºç¨ CSS å¨ç»æ¥è¥é âæ·¡å ¥æ·¡åºâææçãè¿å¾ç®åï¼å 为æä»¬æè¯¥å ç´ ææåæ å大å°ã
使¯è¯·æ³¨æä¸ä¸ªéè¦çç»èï¼æ»å¨é¡µé¢æ¶ï¼æ¶æ¯å°±ä¼ä»æé®æµåºã
åå 徿¾ç¶ï¼message å
ç´ ä¾èµäº position:fixedï¼å æ¤å½é¡µé¢æ»å¨æ¶ï¼å®ä»ä½äºçªå£çåä¸ä½ç½®ã
è¦æ¹åè¿ä¸ç¹ï¼æä»¬éè¦ä½¿ç¨åºäºææ¡£ï¼documentï¼çåæ å position:absolute æ ·å¼ã
ææ¡£åæ
ææ¡£ç¸å¯¹åæ ä»ææ¡£çå·¦ä¸è§å¼å§è®¡ç®ï¼è䏿¯çªå£ã
å¨ CSS ä¸ï¼çªå£åæ 对åºäº position:fixedï¼èææ¡£åæ ä¸é¡¶é¨ç position:absolute 类似ã
æä»¬å¯ä»¥ä½¿ç¨ position:absolute å top/left æ¥ææäºå
容æ¾å°ææ¡£ä¸çæä¸ªä½ç½®ï¼ä»¥ä¾¿å¨é¡µé¢æ»å¨æ¶ï¼å
ç´ ä»è½ä¿çå¨è¯¥ä½ç½®ã使¯æä»¬é¦å
éè¦æ£ç¡®çåæ ã
è¿éæ²¡ææ åæ¹æ³æ¥è·åå ç´ çææ¡£åæ ã使¯åèµ·æ¥å¾å®¹æã
è¿ä¸¤ä¸ªåæ ç³»ç»éè¿ä»¥ä¸å ¬å¼ç¸è¿æ¥ï¼
pageY=clientY+ ææ¡£çåç´æ»å¨åºçé¨åçé«åº¦ãpageX=clientX+ ææ¡£çæ°´å¹³æ»å¨åºçé¨åç宽度ã
彿° getCoords(elem) å°ä» elem.getBoundingClientRect() è·åçªå£åæ ï¼å¹¶åå
¶ä¸æ·»å å½åæ»å¨ï¼
// è·åå
ç´ çææ¡£åæ
function getCoords(elem) {
let box = elem.getBoundingClientRect();
return {
top: box.top + window.pageYOffset,
right: box.right + window.pageXOffset,
bottom: box.bottom + window.pageYOffset,
left: box.left + window.pageXOffset
};
}
妿å¨ä¸é¢ç示ä¾ä¸ï¼æä»¬å°å
¶ä¸ position:absolute ä¸èµ·ä½¿ç¨ï¼åå¨é¡µé¢æ»å¨æ¶ï¼æ¶æ¯ä»åçå¨å
ç´ éè¿ã
ä¿®æ¹åç createMessageUnder 彿°ï¼
function createMessageUnder(elem, html) {
let message = document.createElement('div');
message.style.cssText = "position:absolute; color: red";
let coords = getCoords(elem);
message.style.left = coords.left + "px";
message.style.top = coords.bottom + "px";
message.innerHTML = html;
return message;
}
æ»ç»
页é¢ä¸çä»»ä½ç¹é½æåæ ï¼
- ç¸å¯¹äºçªå£çåæ ââ
elem.getBoundingClientRect()ã - ç¸å¯¹äºææ¡£çåæ ââ
elem.getBoundingClientRect()å ä¸å½å页颿»å¨ã
çªå£åæ é常éåå position:fixed ä¸èµ·ä½¿ç¨ï¼ææ¡£åæ é常éåå position:absolute ä¸èµ·ä½¿ç¨ã
è¿ä¸¤ä¸ªåæ ç³»ç»åæå©å¼ãææ¶æä»¬éè¦å
¶ä¸ä¸ä¸ªæå¦ä¸ä¸ªï¼å°±å CSS position ç absolute å fixed 䏿 ·ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼