è¦ç´ ãç§»åãããã«ã¯ã座æ¨ã«ã¤ãã¦ããç¥ã£ã¦ããå¿ è¦ãããã¾ãã
ã»ã¨ãã©ã® JavaScript ã¡ã½ããã¯ï¼ã¤ã®åº§æ¨ç³»ã®ãããããæ±ãã¾ã:
- ã¦ã£ã³ãã¦(ãããã¯å¥ã®ãã¥ã¼ãã¼ã)ã® ä¸/å·¦ ãåºæºã«ãã¾ã
- ããã¥ã¡ã³ãã® ä¸/å·¦ ãåºæºã¨ãã¾ã
éããçè§£ããã©ã®ã¿ã¤ããã©ãã«ããããçè§£ãããã¨ã¯éè¦ã§ãã
ã¦ã£ã³ãã¦åº§æ¨: getBoundingClientRect
ã¦ã£ã³ãã¦åº§æ¨ã¯ã¦ã£ã³ãã¦ã®å·¦ä¸ç«¯ããå§ã¾ãã¾ãã
ã¡ã½ãã elem.getBoundingClientRect() ã¯ããããã£ãæã¤ãªãã¸ã§ã¯ãã¨ã㦠elem ã«å¯¾ããã¦ã£ã³ãã¦åº§æ¨ãè¿ãã¾ãã:
topâ è¦ç´ ã®ä¸ç«¯ã® Y-座æ¨,leftâ è¦ç´ ã®å·¦ç«¯ã® X-座æ¨,rightâ è¦ç´ ã®å³ç«¯ã® X-座æ¨,bottomâ è¦ç´ ã®ä¸ç«¯ã® Y-座æ¨.
ãã®ããã«ãªãã¾ã:
ã¦ã£ã³ãã¦åº§æ¨ã¯ããã¥ã¡ã³ãã®ã¹ã¯ãã¼ã«ã¢ã¦ãé¨åãèæ ®ãããã¦ã£ã³ãã¦ã®å·¦ä¸ç«¯ããè¨ç®ããããã®ã«ãªãã¾ãã
è¨ãæããã¨ããã¼ã¸ãã¹ã¯ãã¼ã«ããã¨ããè¦ç´ ã¯ä¸ä¸ã«ç§»åãããã®ã¦ã£ã³ãã¦åº§æ¨ã¯å¤ããã¾ããããã¯ã¨ã¦ãéè¦ã§ãã
ãã¿ã³ãã¯ãªãã¯ãã¦ã¦ã£ã³ãã¦åº§æ¨ãè¦ã¦ã¿ã¦ãã ãã:
ãããã¼ã¸ãã¹ã¯ãã¼ã«ããã¨ããã¿ã³ä½ç½®ã¯ä»£ãããã¦ã£ã³ãã¦åº§æ¨ãåæ§ã«å¤ããã¾ãã
ã¾ã:
- 座æ¨ã¯å°æ°ã®å ´åãããã¾ããããã¯æ£å¸¸ã§ãå
é¨çã«ã¯ãã©ã¦ã¶ã¯è¨ç®ã®ããã«ããã使ç¨ãã¾ããç§ãã¡ã¯
style.position.left/topã¸è¨å®ããã¨ãã«ãããã丸ããå¿ è¦ã¯ããã¾ããããã©ã¦ã¶ã§å°æ°ã¯åé¡ããã¾ããã - 座æ¨ã¯è² ã®å¤ã«ãªãå ´åãããã¾ããä¾ãã°ããã¼ã¸ãä¸ã«ã¹ã¯ãã¼ã«ããã
elemã®ä¸ç«¯ãã¦ã£ã³ãã¦ã®ä¸ã«ããå ´åãelem.getBoundingClientRect().topã¯è² ã®å¤ã«ãªãã¾ãã - Chromeãããªä¸é¨ã®ãã©ã¦ã¶ã§ã¯ãçµæ
getBoundingClientRectã«ããããã£widthã¨heightã追å ãã¾ããæ¸ç®ãããã¨ã§ãããããåå¾ãããã¨ã¯å¯è½ã§ã:height=bottom-top,width=right-leftã
ã¦ã£ã³ãã¦åº§æ¨ã¨ CSSã®é
ç½®ãæ¯è¼ããã¨ãposition:fixed ã¨ã®æãããªé¡ä¼¼ç¹ãããã¾ã â ãã¥ã¼ãã¼ããåºæºã¨ããä½ç½®ãåãã§ãã
ããããCSS ã§ã¯ right ããããã£ã¯å³ç«¯ããã®è·é¢ãæå³ããbottom 㯠â ä¸ç«¯ããã®è·é¢ã§ãã
ä¸ã®å³ãè¦ãæãJavaScriptã§ã¯ããã§ãªããã¨ãåããã¾ãããã¹ã¦ã®ã¦ã£ã³ãã¦åº§æ¨ã¯å·¦ä¸é ããæ°ãããã¾ãã
elementFromPoint(x, y)
document.elementFromPoint(x, y) ã®å¼ã³åºãã¯ãã¦ã£ã³ãã¦åº§æ¨ (x, y) ã§æããã¹ããããè¦ç´ ãè¿ãã¾ãã
æ§æã¯æ¬¡ã®éãã§ã:
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) ãå¯è¦é åã«ããå ´åã«ã®ã¿åä½ãã¾ãã
ãããã座æ¨ãè² ã®å¤ã¾ãã¯ã¦ã£ã³ãã¦ã®å¹
/é«ããè¶
ãã¦ããå ´åãnull ãè¿ãã¾ãã
ã»ã¨ãã©ã®å ´åããã®ãããªæ¯ãèãã¯åé¡ã§ã¯ããã¾ãããããããå¿ã«çãã¦ããå¿ è¦ãããã¾ãã
ããã¯ãããããã§ãã¯ããªãå ´åã«çºçããå¯è½æ§ã®ããå ¸åçãªã¨ã©ã¼ã§ã:
let elem = document.elementFromPoint(x, y);
// 座æ¨ãã¦ã£ã³ãã¦å¤ã®å ´åãelem = null
elem.style.background = ''; // ã¨ã©ã¼!
position:fixed ãç¨ãã
å¤ãã®å ´åãä½ããé
ç½®ããããã«åº§æ¨ãå¿
è¦ã¨ãã¾ããCSS ã§ã¯ãã¥ã¼ãã¼ããåºæºã¨ãã¦è¦ç´ ãé
ç½®ããããã«ãleft/top (ã¾ã㯠right/bottom) ã¨ä¸ç·ã« position:fixed ã使ãã¾ãã
ç§ãã¡ã¯ãgetBoundingClientRect ã使ã£ã¦è¦ç´ ã®åº§æ¨ãåå¾ãããã®è¿ãã«ä½ãã表示ãããã¨ãã§ãã¾ãã
ä¾ãã°ãä¸ã®é¢æ° createMessageUnder(elem, html) 㯠elem ã®ä¸ã«ã¡ãã»ã¼ã¸ã表示ãã¾ãã:
let elem = document.getElementById("coords-show-mark");
function createMessageUnder(elem, html) {
// ã¡ãã»ã¼ã¸è¦ç´ ã®ä½æ
let message = document.createElement('div');
// ããã§ã¯ãã¹ã¿ã¤ã«ã«CSSã¯ã©ã¹ãä½¿ãæ¹ãè¯ãã§ã
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;
}
// 使ç¨ä¾:
// ããã¥ã¡ã³ãä¸ã«ï¼ç§é追å ãã¾ã
let message = createMessageUnder(elem, 'Hello, world!');
document.body.append(message);
setTimeout(() => message.remove(), 5000);
å®è¡ããã«ã¯ãã¿ã³ãã¯ãªãã¯ãã¦ãã ãã:
ãã®ã³ã¼ãã夿´ãã¦ãã¡ãã»ã¼ã¸ãå·¦ãå³ãä¸ã«è¡¨ç¤ºããããâãã§ã¼ãã¤ã³â ããããã® CSS ã¢ãã¡ã¼ã·ã§ã³ãé©ç¨ãããã¨ãã§ãã¾ããç§ãã¡ã¯è¦ç´ ã®ãã¹ã¦ã®åº§æ¨ã¨ãµã¤ãºãç¥ã£ã¦ããã®ã§ç°¡åã«ã§ãã¾ãã
ããããéè¦ãªç¹ã«æ³¨æãã¦ãã ãã: ãã¼ã¸ãã¹ã¯ãã¼ã«ãããã¨ããã¡ãã»ã¼ã¸ã¯ãã¿ã³ããé¢ãã¦ããã¾ãã
çç±ã¯æããã§ã: ã¡ãã»ã¼ã¸è¦ç´ 㯠position:fixed ã«ä¾åãã¦ããã®ã§ããã¼ã¸ãã¹ã¯ãã¼ã«ãã¦ããéãã¦ã£ã³ãã¦ã®åãå ´æã«ãç¶ãã¾ãã
夿´ããããã«ã¯ãããã¥ã¡ã³ããã¼ã¹ã®åº§æ¨ã使ããposition:absolute ã使ãå¿
è¦ãããã¾ãã
ããã¥ã¡ã³ã座æ¨
ããã¥ã¡ã³ãç¸å¯¾åº§æ¨ã¯ãã¦ã£ã³ãã¦ã§ã¯ãªãããã¥ã¡ã³ãã®å·¦ä¸ç«¯ããå§ãã¾ãã
CSS ã§ã¯ãã¦ã£ã³ãã¦åº§æ¨ã¯ position:fixed ã«å¯¾å¿ãã䏿¹ãããã¥ã¡ã³ã座æ¨ã¯ position:absolute ã«ä¼¼ã¦ãã¾ãã
position:absolute 㨠top/left ã使ããã¨ã§ãããã¥ã¡ã³ãä¸ã®ç¹å®ã®å ´æã«ä½ããç½®ããã¨ãã§ãã¾ãããªã®ã§ããã¼ã¸ã®ã¹ã¯ãã¼ã«æã«ããã«æ®ããã¨ãã§ãã¾ããããããæåã«æ£ãã座æ¨ãå¿
è¦ã§ãã
åãããããããããã«ãã¦ã£ã³ãã¦åº§æ¨ (clientX,clientY) ã¨ããã¥ã¡ã³ãåº§æ¨ (pageX,pageY) ãå¼ã³åºãã¾ãã
ãã¼ã¸ãã¹ã¯ãã¼ã«ããã¦ããªãã¨ããã¦ã£ã³ãã¦åº§æ¨ã¨ããã¥ã¡ã³ã座æ¨ã¯ã¾ã£ããåãã§ãããããã®ã¼ãã®ç¹ãä¸è´ãã¾ã:
ããã¦ãã¹ã¯ãã¼ã«ãããã¨ã(clientX,clientY) ãå¤ããã¾ãããªããªãããããã¯ã¦ã£ã³ãã¦ã«ç¸å¯¾çãªããã§ãããããã(pageX,pageY) ã¯åãã¾ã¾ã§ãã
ããã¯ç¸¦ã¹ã¯ãã¼ã«å¾ã®åããã¼ã¸ã§ã:
- è¦ç´ ã¯ä»ã¦ã£ã³ãã¦ã®ä¸é¨ã«ããã®ã§ããããã¼
"From today's featured article"ã®clientYã¯0ã«ãªãã¾ããã - æ°´å¹³ã¹ã¯ãã¼ã«ãããªãã£ãããã
clientXã¯å¤ããã¾ããã§ããã - è¦ç´ ã®
pageXã¨pageY座æ¨ã¯ä¾ç¶ã¨ãã¦åãã§ãããªããªãããããã¯ããã¥ã¡ã³ãã«ç¸å¯¾çã ããã§ãã
ããã¥ã¡ã³ã座æ¨ã®åå¾
è¦ç´ ã®ããã¥ã¡ã³ã座æ¨ãåå¾ããããã®æ¨æºã¡ã½ããã¯ããã¾ãããããããç°¡åã«æ¸ãã¾ãã
ï¼ã¤ã®åº§æ¨ç³»ã¯æ¬¡ã®å¼ã§ç¹ããã¾ã:
pageY=clientY+ ããã¥ã¡ã³ãã®ã¹ã¯ãã¼ã«ã¢ã¦ãããåç´é¨åã®é«ãpageX=clientX+ ããã¥ã¡ã³ãã®ã¹ã¯ãã¼ã«ã¢ã¦ãããæ°´å¹³é¨åã®å¹
颿° getCoords(elem) 㯠elem.getBoundingClientRect() ããã¦ã£ã³ãã¦åº§æ¨ãåãããããã«ç¾å¨ã®ã¹ã¯ãã¼ã«ãå ãã¾ãã:
// è¦ç´ ã®ããã¥ã¡ã³ã座æ¨ãåå¾
function getCoords(elem) {
let box = elem.getBoundingClientRect();
return {
top: box.top + pageYOffset,
left: box.left + pageXOffset
};
}
ãµããª
ãã¼ã¸ä¸ã«ä»»æã®ç¹ã¯åº§æ¨ãæã£ã¦ãã¾ã:
- ã¦ã£ã³ãã¦ã«ç¸å¯¾ç â
elem.getBoundingClientRect() - ããã¥ã¡ã³ãã«ç¸å¯¾ç â
elem.getBoundingClientRect()+ ç¾å¨ã®ãã¼ã¸ã¹ã¯ãã¼ã«
ã¦ã£ã³ãã¦åº§æ¨ã¯ position:fixed ã¨ä¸ç·ã«ä½¿ç¨ããã®ãè³¢æã§ãããã¥ã¡ã³ã座æ¨ã¯ position:absolute ã¨ä¸æãããã¾ãã
ã©ã¡ãã®åº§æ¨ç³»ã âé·æâ 㨠âçæâ ãæã£ã¦ãããCSS ã® position absolute 㨠fixed ã®ããã«ãã©ã¡ãã䏿¹ãå¿
è¦ãªã¨ããããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã