ÐÐ»Ñ Ñого, Ñоб пеÑемÑÑÑваÑи елеменÑи на екÑанÑ, ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¿Ð¾Ð·Ð½Ð°Ð¹Ð¾Ð¼Ð¸ÑиÑÑ Ð· ÑиÑÑеми кооÑдинаÑ.
ÐÑлÑÑÑÑÑÑ Ð²ÑдповÑÐ´Ð½Ð¸Ñ Ð¼ÐµÑодÑв JavaScript пÑаÑÑÑÑÑ Ð· однÑÑÑ Ð· Ð´Ð²Ð¾Ñ ÑиÑÑем кооÑдинаÑ:
- ÐÑдноÑно вÑкна бÑаÑзеÑа â ÑÑ
оже на
position:fixed, обÑиÑлÑÑÑÑÑÑ Ð²Ñд веÑÑ Ð½Ñого лÑвого кÑÑа вÑкна бÑаÑзеÑа.- познаÑимо ÑÑ ÐºÐ¾Ð¾ÑдинаÑи Ñк
clientX/clientY, аÑгÑменÑаÑÑÑ ÑÐ°ÐºÐ¾Ñ Ð½Ð°Ð·Ð²Ð¸ ÑÑане зÑозÑмÑла пÑзнÑÑе, коли ми вивÑимо влаÑÑивоÑÑÑ Ð¿Ð¾Ð´ÑÑ.
- познаÑимо ÑÑ ÐºÐ¾Ð¾ÑдинаÑи Ñк
- ÐÑдноÑно докÑменÑа â ÑÑ
оже на
position:absoluteÑ ÐºÐ¾ÑÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа, обÑиÑлÑÑÑÑÑÑ Ð²Ñд веÑÑ Ð½Ñого лÑвого кÑÑа докÑменÑа.- познаÑимо ÑÑ
Ñк
pageX/pageY.
- познаÑимо ÑÑ
Ñк
Ðоли ÑÑоÑÑнка пÑокÑÑÑена до Ñамого поÑаÑкÑ, Ñо веÑÑ Ð½Ñй лÑвий кÑÑ Ð²Ñкна ÑоÑно збÑгаÑÑÑÑÑ Ð· веÑÑ Ð½Ñм лÑвим кÑÑом докÑменÑа, ÑÐ¾Ð¼Ñ ÑÑ ÑиÑÑеми кооÑÐ´Ð¸Ð½Ð°Ñ Ñакож збÑгаÑÑÑÑÑ. Ðле ÑкÑо докÑÐ¼ÐµÐ½Ñ Ð¿ÑокÑÑÑиÑи, Ñо кооÑдинаÑи елеменÑÑв вÑдноÑно вÑкна змÑнÑÑÑÑÑÑ, а кооÑдинаÑи, вÑдноÑно докÑменÑа, залиÑаÑÑÑÑÑ ÑÑалими.
Ðа ÑÑÐ¾Ð¼Ñ Ð¼Ð°Ð»ÑÐ½ÐºÑ Ð¼Ð¸ беÑемо ÑоÑÐºÑ Ð² докÑменÑÑ Ñа демонÑÑÑÑÑмо ÑÑ ÐºÐ¾Ð¾ÑдинаÑи пеÑед пÑокÑÑÑÐºÐ¾Ñ (лÑвоÑÑÑ) Ñ Ð¿ÑÑÐ»Ñ Ð½ÐµÑ (пÑавоÑÑÑ):
ÐÑÑÐ»Ñ Ð¿ÑокÑÑÑки докÑменÑа:
pageYâ кооÑдинаÑа вÑдноÑно докÑменÑа залиÑилаÑÑ Ð½ÐµÐ·Ð¼ÑнноÑ, оÑкÑлÑки вона вÑдÑÐ°Ñ Ð¾Ð²ÑÑÑÑÑÑ Ð²Ñд веÑÑ Ð½Ñого кÑÐ°Ñ Ð´Ð¾ÐºÑменÑа (Ñкий заÑаз пÑокÑÑÑений вгоÑÑ).clientYâ кооÑдинаÑа вÑдноÑно вÑкна змÑнилаÑÑ (ÑÑÑÑлка ÑÑала коÑоÑÑоÑ), оÑкÑлÑки Ñа Ñама ÑоÑка ÑÑала ближÑе до веÑÑини вÑкна.
ÐооÑдинаÑи елеменÑа вÑдноÑно вÑкна: getBoundingClientRect
ÐеÑод elem.getBoundingClientRect() повеÑÑÐ°Ñ ÐºÐ¾Ð¾ÑдинаÑи Ñ ÐºÐ¾Ð½ÑекÑÑÑ Ð²Ñкна Ð´Ð»Ñ Ð¼ÑнÑмалÑного за ÑозмÑÑами пÑÑмокÑÑника, Ñкий вмÑÑÑÑ elem Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ Ð¾Ð±âÑкÑа вбÑдованого клаÑÑ DOMRect.
ÐÑÐ½Ð¾Ð²Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ DOMRect:
x/yâ кооÑдинаÑи X/Y поÑаÑÐºÑ Ð¿ÑÑмокÑÑника вÑдноÑно вÑкна,width/heightâ ÑиÑина/виÑоÑа пÑÑмокÑÑника (можÑÑÑ Ð±ÑÑи вÑдâÑмними).
ÐÑÑм Ñого, в обâÑкÑÑ Ð¼ÑÑÑÑÑÑÑÑ ÑÐ°ÐºÑ Ð¿Ð¾Ñ ÑÐ´Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ:
top/bottomâ Y-кооÑдинаÑа Ð´Ð»Ñ Ð²ÐµÑÑ Ð½Ñого/нижнÑого кÑÐ°Ñ Ð¿ÑÑмокÑÑника,left/rightâ X-кооÑдинаÑа Ð´Ð»Ñ Ð»Ñвого/пÑавого кÑÐ°Ñ Ð¿ÑÑмокÑÑника.
ÐапÑиклад, наÑиÑнÑÑÑ Ð½Ð° ÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ, Ñоб побаÑиÑи ÐРкооÑдинаÑи вÑдноÑно вÑкна:
ЯкÑо ви пÑокÑÑÑиÑе ÑÑоÑÑÐ½ÐºÑ Ñа ÑпÑобÑÑÑе зновÑ, Ñо помÑÑиÑе, Ñо по мÑÑÑ Ð·Ð¼Ñни Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸, змÑнÑÑÑÑÑÑ Ñ ÐРкооÑдинаÑи вÑдноÑно вÑкна (y/top/bottom, пÑи веÑÑикалÑнÑй пÑокÑÑÑÑÑ).
ÐÑÑ Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð· ÑезÑлÑÑаÑом Ð²Ð¸ÐºÐ»Ð¸ÐºÑ elem.getBoundingClientRect():
Як баÑиÑе, x/y Ñа width/height повнÑÑÑÑ Ð¾Ð¿Ð¸ÑÑÑÑÑ Ð¿ÑÑмокÑÑник. РниÑ
можна легко обÑиÑлиÑи поÑ
ÑÐ´Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ:
left = xtop = yright = x + widthbottom = y + height
ÐвеÑнÑÑÑ ÑвагÑ:
- ÐооÑдинаÑи можÑÑÑ Ð±ÑÑи деÑÑÑковими дÑобами, напÑиклад
10.5. Це ноÑмалÑно, ÑомÑ, Ñо внÑÑÑÑÑнÑо бÑаÑÐ·ÐµÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑ Ð´Ñоби Ñ ÑвоÑÑ Ð¾Ð±ÑиÑленнÑÑ . Ðам не поÑÑÑбно ÑÑ Ð¾ÐºÑÑглÑваÑи, коли вÑÑановлÑÑмо знаÑеннÑstyle.left/top. - ÐооÑдинаÑи можÑÑÑ Ð±ÑÑи вÑдâÑмними. ÐапÑиклад, ÑкÑо ÑÑоÑÑнка пÑокÑÑÑена Ñаким Ñином, Ñо
elemÐ·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð½Ð°Ð´ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ñ ÑаÑÑÐ¸Ð½Ð¾Ñ Ð²Ñкна, Ñоelem.getBoundingClientRect().topбÑде вÑдâÑмними.
top/left, ÑкÑо Ñ x/y?ÐаÑемаÑиÑно пÑÑмокÑÑник однознаÑно визнаÑаÑÑÑÑÑ Ð¹Ð¾Ð³Ð¾ поÑаÑÐºÐ¾Ð²Ð¾Ñ ÑоÑÐºÐ¾Ñ (x,y) Ñ Ð²ÐµÐºÑоÑом напÑÑÐ¼ÐºÑ (width,height). Ð¢Ð¾Ð¼Ñ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ñ Ð¿Ð¾Ñ
ÑÐ´Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð¿ÑизнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð·ÑÑÑноÑÑÑ.
ТеÑ
нÑÑно можливо, Ñоб width/height бÑли вÑдâÑмними, Ñе дозволÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи «ÑпÑÑмований» пÑÑмокÑÑник, напÑиклад Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ð´ÑÐ»ÐµÐ½Ð½Ñ Ð¼Ð¸ÑÐµÑ Ð· пÑавилÑно познаÑеними поÑаÑком Ñ ÐºÑнÑем.
ÐÑдâÑÐ¼Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ width/height ознаÑаÑÑÑ, Ñо пÑÑмокÑÑник поÑинаÑÑÑÑÑ Ð· нижнÑого пÑавого кÑÑа, а поÑÑм âзÑоÑÑаÑâ лÑвоÑÑÑ Ð²Ð³Ð¾ÑÑ.
ÐÑÑ Ð¿ÑÑмокÑÑник Ñз вÑдâÑмними знаÑеннÑми width Ñ height (напÑиклад, width=-200, height=-100):
Як баÑиÑе, Ñ ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ, left/top не доÑÑвнÑÑ x/y.
Ðднак на пÑакÑиÑÑ elem.getBoundingClientRect() завжди повеÑÑÐ°Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ð²Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ ÑиÑини/виÑоÑи, ÑÑÑ Ð¼Ð¸ згадÑÑмо пÑо негаÑÐ¸Ð²Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ width/height лиÑе Ð´Ð»Ñ Ñого, Ñоб ви зÑозÑмÑли, ÑÐ¾Ð¼Ñ ÑÑ, здавалоÑÑ Ð±, повÑоÑÑÐ²Ð°Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð½Ð°ÑпÑÐ°Ð²Ð´Ñ Ð½Ðµ Ñ Ð¿Ð¾Ð²ÑоÑÑваними.
x/yInternet Explorer не пÑдÑÑимÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ x/y з ÑÑÑоÑиÑниÑ
пÑиÑин.
Тож ми можемо або ÑÑвоÑиÑи полÑÑÑл (додаÑи геÑеÑи в DomRect.prototype), або пÑоÑÑо викоÑиÑÑовÑваÑи top/left, оÑкÑлÑки вони завжди доÑÑвнÑÑÑÑ x/y Ð´Ð»Ñ Ð´Ð¾Ð´Ð°ÑнÑÑ
width/height, зокÑема в ÑезÑлÑÑаÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ elem.getBoundingClientRect().
ÐÑнÑÑ Ð¾Ñевидна подÑбнÑÑÑÑ Ð¼Ñж кооÑдинаÑами вÑдноÑними до вÑкна, Ñа CSS position:fixed.
Ðле в CSS влаÑÑивÑÑÑÑ right ознаÑÐ°Ñ Ð²ÑдÑÑÐ°Ð½Ñ Ð²Ñд пÑавого кÑаÑ, а влаÑÑивÑÑÑÑ bottom ознаÑÐ°Ñ Ð²ÑдÑÑÐ°Ð½Ñ Ð²Ñд нижнÑого кÑаÑ.
ЯкÑо подивимоÑÑ Ð½Ð° малÑнок виÑе, Ñо побаÑимо, Ñо в JavaScript Ñе не Ñак. УÑÑ ÐºÐ¾Ð¾ÑдинаÑи вÑкна вÑдÑаÑ
овÑÑÑÑÑÑ Ð²Ñд веÑÑ
нÑого лÑвого кÑÑа, вклÑÑаÑÑи 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);
ÐÑкÑлÑки код викоÑиÑÑовÑÑ ÐºÐ¾Ð¾ÑдинаÑи вÑдноÑно вÑкна, Ñо ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ðµ вÑдÑÑзнÑÑиÑÑ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾ вÑд поÑоÑÐ½Ð¾Ñ Ð¿Ð¾Ð·Ð¸ÑÑÑ Ð¿ÑокÑÑÑÑваннÑ.
elementFromPoint повеÑÑÐ°Ñ nullÐеÑод document.elementFromPoint(x,y) пÑаÑÑÑ, лиÑе ÑкÑо кооÑдинаÑи (x,y) знаÑ
одÑÑÑÑÑ Ñ Ð²Ð¸Ð´Ð¸Ð¼Ñй облаÑÑÑ Ð²Ñкна.
ЯкÑо бÑдÑ-Ñка з кооÑÐ´Ð¸Ð½Ð°Ñ Ð²ÑдâÑмна, або бÑлÑÑа нÑж ÑиÑина/виÑоÑа вÑкна, Ñо повеÑÑаÑÑÑÑÑ null.
ÐÑÑ Ñипова помилка, Ñка може виникнÑÑи, ÑкÑо не додаÑи пеÑевÑÑкÑ:
let elem = document.elementFromPoint(x, y);
// ÑкÑо кооÑдинаÑи виÑ
одÑÑÑ Ð·Ð° Ð¼ÐµÐ¶Ñ Ð²Ñкна, Ñо elem = null
elem.style.background = ''; // Ðомилка!
ÐикоÑиÑÑÐ°Ð½Ð½Ñ Ñазом з âposition:fixedâ
ÐайÑаÑÑÑÑе нам поÑÑÑÐ±Ð½Ñ ÐºÐ¾Ð¾ÑдинаÑи, Ñоб ÑоÑÑ ÑозÑаÑÑваÑи.
Щоб показаÑи ÑоÑÑ Ð¿Ð¾Ð±Ð»Ð¸Ð·Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа, ми можемо викоÑиÑÑаÑи 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 анÑмаÑÑÑ, Ñ Ñак далÑ. Це легко, оÑкÑлÑки Ñ Ð½Ð°Ñ Ñ Ð²ÑÑ ÐºÐ¾Ð¾ÑдинаÑи Ñа ÑозмÑÑи елеменÑа.
Ðле звеÑнÑÑÑ ÑÐ²Ð°Ð³Ñ Ð½Ð° Ð²Ð°Ð¶Ð»Ð¸Ð²Ñ Ð´ÐµÑалÑ: коли ÑÑоÑÑнка пÑокÑÑÑÑÑÑÑÑÑ, повÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²ÑÐ´Ð¿Ð»Ð¸Ð²Ð°Ñ Ð²Ñд кнопки.
ÐÑиÑина оÑевидна: ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ð¾Ð²ÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð·Ð¸ÑÑонÑÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ 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 ми обиÑаÑмо CSS position мÑж absolute Ñа fixed.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)