ЧÑÐ¾Ð±Ñ Ð¿ÐµÑедвигаÑÑ ÑлеменÑÑ Ð¿Ð¾ ÑкÑанÑ, нам ÑледÑÐµÑ Ð¿Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸ÑÑÑÑ Ñ ÑиÑÑемами кооÑдинаÑ.
ÐолÑÑинÑÑво ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¼ÐµÑодов 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).
Так ÑÑо дополниÑелÑнÑе завиÑимÑе ÑвойÑÑва ÑÑÑеÑÑвÑÑÑ Ð»Ð¸ÑÑ Ð´Ð»Ñ ÑдобÑÑва.
ЧÑо же каÑаеÑÑÑ top/left, Ñо они на Ñамом деле не вÑегда ÑÐ°Ð²Ð½Ñ x/y. ТеÑ
ниÑеÑки, знаÑÐµÐ½Ð¸Ñ width/height могÑÑ Ð±ÑÑÑ Ð¾ÑÑиÑаÑелÑнÑми. ÐÑо позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Â«Ð½Ð°Ð¿ÑавленнÑй» пÑÑмоÑголÑник, напÑимеÑ, Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÑÑÑÑ Ñ Ð¾ÑмеÑеннÑм наÑалом и конÑом.
То еÑÑÑ, оÑÑиÑаÑелÑнÑе знаÑÐµÐ½Ð¸Ñ width/height ознаÑаÑÑ, ÑÑо пÑÑмоÑголÑник «ÑаÑÑеÑ» влево-ввеÑÑ
из пÑавого Ñгла.
ÐÐ¾Ñ Ð¿ÑÑмоÑголÑник Ñ Ð¾ÑÑиÑаÑелÑнÑми width и height (напÑимеÑ, width=-200, height=-100):
Ðак Ð²Ñ Ð²Ð¸Ð´Ð¸Ñе, ÑвойÑÑва left/top пÑи ÑÑом не ÑÐ°Ð²Ð½Ñ x/y.
ÐпÑоÑем, на пÑакÑике ÑезÑлÑÑÐ°Ñ Ð²Ñзова elem.getBoundingClientRect() вÑегда возвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸ÑелÑнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑиÑинÑ/вÑÑоÑÑ. ÐдеÑÑ Ð¼Ñ ÑпомÑнÑли оÑÑиÑаÑелÑнÑе width/height лиÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð²Ñ Ð¿Ð¾Ð½Ñли, заÑем ÑÑÑеÑÑвÑÑÑ ÑÑи Ñ Ð²Ð¸Ð´Ñ Ð´ÑблиÑÑÑÑие ÑвойÑÑва.
x/yInternet Explorer и Edge не поддеÑживаÑÑ ÑвойÑÑва x/y по иÑÑоÑиÑеÑким пÑиÑинам.
Таким обÑазом, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ либо ÑделаÑÑ Ð¿Ð¾Ð»Ð¸Ñил (добавив ÑооÑвеÑÑÑвÑÑÑие геÑÑеÑÑ Ð² DomRect.prototype), либо иÑполÑзоваÑÑ top/left, Ñак как ÑÑо вÑегда одно и Ñо же пÑи положиÑелÑнÑÑ
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 = ''; // ÐÑибка!
ÐÑименение Ð´Ð»Ñ 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, 'Hello, world!');
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, где Ð¼Ñ Ð²ÑбиÑаем Ð¼ÐµÐ¶Ð´Ñ absolute и fixed.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)