ìì를 ìì§ì´ë ¤ë©´ ì¢í(coordinates)ì ìµìí´ì ¸ì¼ í©ëë¤.
ëë¶ë¶ì ìë°ì¤í¬ë¦½í¸ ë©ìëë ë¤ì ë ì¢í ì²´ê³ ì¤ íë를 ì´ì©í©ëë¤.
- ì°½ ê¸°ì¤ â
position:fixedì ì ì¬íê² ì°½(window) 맨 ì ì¼ìª½ 모ì리를 기ì¤ì¼ë¡ ì¢í를 ê³ì°í©ëë¤.- ìì¼ë¡ ì°ë¦¬ë ì´ ì¢í를
clientX/clientYë¡ íìí ìì ì¸ë°, ì ì´ë° ì´ë¦ì ì°ëì§ë ëì¤ì event íë¡í¼í°ë¥¼ ê³µë¶í ë ëª íí´ì§ëë¤.
- ìì¼ë¡ ì°ë¦¬ë ì´ ì¢í를
- 문ì ê¸°ì¤ â 문ì(document) ìµìë¨(root)ìì
position:absolute를 ì¬ì©íë ê²ê³¼ ë¹ì·íê² ë¬¸ì 맨 ì ì¼ìª½ 모ì리를 기ì¤ì¼ë¡ ì¢í를 ê³ì°í©ëë¤.- ì´ ì¢íë
pageX/pageYë¡ íìí ìì ì ëë¤.
- ì´ ì¢íë
ì¤í¬ë¡¤ì ìì§ì´ê¸° ì ìë ì°½ì 맨 ì ì¼ìª½ 모ìë¦¬ê° ë¬¸ìì 맨 ì ì¼ìª½ 모ì리ì ì íí ì¼ì¹í©ëë¤. ê·¸ë°ë° ì¤í¬ë¡¤ì´ ìì§ì´ë©´ì 문ìê° ì´ëíë©´ 문ì ê¸°ì¤ ì¢íë ë³ê²½ëì§ ìì§ë§, ì°½ ë´ ììë ìì§ì´ê¸° ë문ì ì°½ ê¸°ì¤ ìì ì¢íê° ë³ê²½ë©ëë¤.
ë¤ì 그림ì 문ì ë´ í ì§ì ì ì¤í¬ë¡¤ì´ ìì§ì´ê¸° ì (ì¼ìª½)ê³¼ í(ì¤ë¥¸ìª½) ì¢í를 ë³´ì¬ì¤ëë¤.
문ìê° ì¤í¬ë¡¤ ëìì ë:
pageYâ 문ì ê¸°ì¤ ì¢íë 문ì 맨 ì(ì¤ë¥¸ìª½ 그림ìì ì¤í¬ë¡¤ ëì´ ë³´ì´ì§ ìì)ë¶í° ê³ì°ë기 ë문ì ì¤í¬ë¡¤ í ê°ì ì ê³¼ ëì¼í©ëë¤.clientYâ 문ìê° ì¤í¬ë¡¤ ëë©´ì í´ë¹ ì§ì ì´ ì°½ ìë¨ê³¼ ê°ê¹ìì¡ê¸° ë문ì ì°½ ê¸°ì¤ ì¢íê° ë³íìµëë¤(íì´íê° ì§§ìì§).
getBoundingClientRectë¡ ìì ì¢í ì»ê¸°
elem.getBoundingClientRect() ë©ìëë elemì ê°ì¸ë ê°ì¥ ìì ë¤ëª¨ì ì°½ ê¸°ì¤ ì¢í를 DOMRect í´ëì¤ì ê°ì²´ ííë¡ ë°íí©ëë¤.
DOMRectì 주ì íë¡í¼í°ë ë¤ìê³¼ ê°ìµëë¤.
xìyâ ìì를 ê°ì¸ë ë¤ëª¨ì ì°½ ê¸°ì¤ X, Y ì¢íwidthìheightâ ìì를 ê°ì¸ë ë¤ëª¨ì ëë¹, ëì´(ììë ê°ë¥)
xì y, widthì height ì´ì¸ì ë¤ìê³¼ ê°ì íì íë¡í¼í°ë ììµëë¤.
topê³¼bottomâ ìì를 ê°ì¸ë ë¤ëª¨ì ì쪽 모ì리, ìë쪽 모ì리ì Y ì¢íleftìrightâ ìì를 ê°ì¸ë ë¤ëª¨ì ì¼ìª½ 모ì리, ì¤ë¥¸ìª½ 모ì리ì X ì¢í
ìë ë²í¼ì ëë¬ ì°½ ê¸°ì¤ ë²í¼ ì¢í를 íì¸í´ë´ ìë¤.
íì´ì§ë¥¼ ì¡°ê¸ì© ì¤í¬ë¡¤ íë©´ì ì°½ ê¸°ì¤ ë²í¼ ìì¹ë¥¼ ë³ê²½íê³ ë²í¼ì ë르면 ì¢í¯ê°ì´ ë°ëë ê²ì íì¸í ì ììµëë¤(ìì§ ì¤í¬ë¡¤ ì y, top, bottom ê°ì´ ë³í¨).
elem.getBoundingClientRect()ì ê° íë¡í¼í°ë¥¼ 그림ì¼ë¡ íííë©´ ë¤ìê³¼ ê°ìµëë¤.
그림ì íµí´ ì°ë¦¬ë x, yì width, height ë§ì¼ë¡ ë¤ëª¨ ììì ìì í ë¬ì¬í ì ìë¤ë ì¬ì¤ì ì ì ììµëë¤. ìë íì íë¡í¼í°ë¤ì x, y, width, height를 ì¬ì©í´ ì½ê² ê³ì° ê°ë¥í©ëë¤.
left = xtop = yright = x + widthbottom = y + height
elem.getBoundingClientRect()를 ì¬ì©í ë 주ìì¬íì ë¤ìê³¼ ê°ìµëë¤.
- ì¢íë
10.5ì²ë¼ ììì¼ ì ììµëë¤. ë¸ë¼ì°ì ë ì¢í ê³ì°ì ìì를 ì¬ì©í기 ë문ì ì´ë ì ìì ëë¤. ë°ë¼ìstyle.left/topì ì¬ì©í ë ê°ì ë°ì¬ë¦¼í íìê° ììµëë¤. - ì¢íë ììì¼ ì ììµëë¤. íì´ì§ê° ì¤í¬ë¡¤ ëì´
elemì´ window ìë¡ ë°ë ¤ë¬ì ëelem.getBoundingClientRect().topì ììê° ë©ëë¤.
x, yê° ìëë° top, leftë ì ì¡´ì¬íëì?ìíì ì¼ë¡ ì¬ê°íì ìì ì§ì ì¸ (x,y)ì ë°©í¥ ë²¡í° (width,height)ë§ì¼ë¡ë ì ìí ì ìëë°, íì íë¡í¼í°ë í¸ì를 ìí´ ì¡´ì¬í©ëë¤.
ì´ë¡ ì widthì heightë âë°©í¥ì´ ìëâ ì¬ê°íì ëíë¼ ë ììê° ë ì ììµëë¤(ìì: ììê³¼ ë ì§ì ì ì§ì íê³ ë§ì°ì¤ë¡ ëëê·¸í´ ììì íìí ë).
ì¬ê°íì´ ì¤ë¥¸ìª½ ìëìì ììí´ ì¼ìª½ ìë¡ âì¬ë¼ê°ë©´â widthì heightë ììê° ëì£ .
widthê³¼ heightê° ììì¸ ì¬ê°íì 그림ì¼ë¡ ëíë´ë©´ ë¤ìê³¼ ê°ìµëë¤(width=-200, height=-100).
그림과 ê°ì ì¬ë¡ìì leftì topì xë yì ë¤ë¦
ëë¤.
ì´ë¡ ì ì°¨ì´ê° ì긴 íì§ë§ ì¤ì elem.getBoundingClientRect()ì widthì heightë íì ììì
ëë¤. ì¬ê¸°ì íì íë¡í¼í°ê° ì ë°ë¡ ì¡´ì¬íëì§ë¥¼ ì¤ëª
í기 ìí´ widthì heightê° ììì¸ ì¬ë¡ë¥¼ ì´í´ë³´ììµëë¤.
x, y를 ì§ìíì§ ììµëë¤.Internet Explorerë ìì ë¶í° x, y íë¡í¼í°ë¥¼ ì§ìíì§ ìììµëë¤.
Internet Explorerìì DomRect.prototypeì getter를 ì¶ê°í´ í´ë¦¬íì ë§ë¤ê±°ë elem.getBoundingClientRect()ì width, heightê° ììì¸ ê²½ì°ì top, leftë x, yì ê°ë¤ë ì¬ì¤ì ì´ì©í´ ëì x, y ëì top, left를 ì¬ì©í©ëë¤.
ì°½ ê¸°ì¤ ì¢íì CSS position:fixed ì¬ì´ìë ëª
ë°±í ì ì¬ì ì´ ììµëë¤.
ê·¸ë¬ë CSSìì right íë¡í¼í°ë ì¤ë¥¸ìª½ 모ì리ë¡ë¶í°ì 거리, bottom íë¡í¼í°ë ìë 모ì리ë¡ë¶í°ì 거리를 ì미í©ëë¤.
ì 그림ì ë³´ë©´ ê·¸ ì°¨ì´ë¥¼ í ë²ì ë³¼ ì ìì£ . ê·¸ë¬ë right, bottomì í¬í¨í ì°½ ê¸°ì¤ ì¢í를 ì¬ì©í ë 측ì 기ì¤ì´ ì¼ìª½ ì 모ì리ë¼ë ì¬ì¤ì 주ìí´ì¼ í©ëë¤.
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);
document.elementFromPoint(x, y)ë ì°½ ê¸°ì¤ ì¢í를 ì¬ì©í기 ë문ì íì¬ ì¤í¬ë¡¤ ìì¹ì ê°ì¡°ëë ììë ë¤ë¥¼ ì ììµëë¤.
elementFromPoint를 í¸ì¶íë©´ nullì´ ë°íë©ëë¤.document.elementFromPoint(x,y) ë©ìëë (x,y)ê° ë³´ì´ë ìì ì(ì°½ ì)ì ìì ëë§ ëìí©ëë¤.
ì¢í ì¤ íëë¼ë ììì´ê±°ë ì°½ì ëë¹, ëì´ë¥¼ ë²ì´ëë©´ nullì´ ë°íë©ëë¤.
ì´ë° í¹ì§ì ëª¨ë¥´ê³ ì½ë를 ì§ë©´ ë¤ìê³¼ ê°ì ì íì ì¸ ì¤ì를 íê² ë©ëë¤.
let elem = document.elementFromPoint(x, y);
// ììê° ì°½ ë°ì¼ë¡ ëê°ë©´ lem = null
elem.style.background = ''; // ìë¬!
ìì를 ì°½ ë´ í¹ì ì¢íì ê³ ì í기
ì¢íë ëë¶ë¶ 무ì¸ê°ë¥¼ ìì¹ìí¤ë ¤ë 목ì ì¼ë¡ ì¬ì©í©ëë¤.
ìì ê·¼ì²ì 무ì¸ê°ë¥¼ íìí ëìë getBoundingClientRect를 ì¬ì©í´ ììì ì¢í를 ì»ê³ CSS positionì left/top(ëë right/bottom)ê³¼ í¨ê» ì¬ì©í´ì íìíì£ .
ì를 ë¤ì´ ìë 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;
}
// ì¬ì©ë²:
// 문ì ìì ë©ìì§ë¥¼ ëì°ê³ , 5ì´ ëìë§ ë³´ì¬ì¤ëë¤.
let message = createMessageUnder(elem, 'ë
ëë ì°ë¦¬ë
!');
document.body.append(message);
setTimeout(() => message.remove(), 5000);
ì§ì ë²í¼ì ëë¬ ì ìì를 ì¤íí´ ë´ ìë¤.
ì ìì를 ìì©íë©´ ë©ìì§ë¥¼ ì¼ìª½ ì´ë ì¤ë¥¸ìª½, ìëì íìí ìë ìê³ CSS ì ëë©ì´ì ì ì ì©íë©´ âfade-inâ ë±ì í¨ê³¼ë ì¤ ì ììµëë¤. ì¢í¯ê°ê³¼ ììì í¬ê¸°ë§ ìë©´ ìì½ê² ìíë ê²ì í ì ìì£ .
ê·¸ë°ë° ìììì ëê° ë¶ìì°ì¤ë¬ì´ ê² ë³´ì ëë¤. íì´ì§ë¥¼ ì¤í¬ë¡¤ íë©´ ë©ìì§ê° ë²í¼ìì ë¨ì´ì§ë¤ì.
ë©ìì§ê° ë²í¼ìì ë¨ì´ì§ë ì´ì ë ì주 ëª
íí©ëë¤. ë©ìì§ ììê° position:fixedì´ê¸° ë문ì íì´ì§ê° ì¤í¬ë¡¤ ëì´ë ì°½ ê¸°ì¤ ëì¼í ìì¹ì ì기 ë문ì
ëë¤.
ì´ë° ë¶ìì°ì¤ë¬ì´ íìì ê°ì íë ¤ë©´ 문ì ê¸°ì¤ ì¢íì 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 ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.