Доброго времени суток!
У меня есть подсветка курсора, выполненная следующим образом:
(function() {
"use strict";
let cp,
elems = [],
whp,
dsp,
pos,
getProps = th => {
pos = th.getBoundingClientRect();
return {
w: pos.width,
h: pos.height,
p: {
top: pos.top,
left: pos.left
},
e: th
};
},
all = (...args) => {
let tmp;
if (args.length > 2)
for (let i = 0, len = args[0].length; i < len; i++) {
tmp = args[1](args[0][i], i);
if (tmp === args[2])
break;
if (tmp === args[3])
continue;
}
else
for (let i = 0, len = args[0].length; i < len; i++)
args[1](args[0][i], i);
},
tpto = (e, filter, tmp /*tmp переменная пуста, просто объявил так*/) => {
cp = {
t: event.clientY,
l: event.clientX
},
all(elems, (th, i) => { /*итерируем массив с элментами*/
if (filter && (tmp = th[0]))/*проверка на родителя, в случае, если он указан в filter, это можно убрать для оптимизации в большенстве случаев, однако это же понадобится в паре с прокруткой, для обновления подсветки только в прокручиваемом блоке*/
while (!0) {
if (tmp === filter)
break;
tmp = tmp.parentNode;/*если такого родителя нет, делаем continue*/
if (!tmp)
return ">";
}
whp = getProps(th[0]),
whp.b = getProps(th[1]),
dsp = {
l: whp.e.getAttribute("b-left-despos"),
t: whp.e.getAttribute("b-top-despos")
},/*атрибуты для поправок в положении подсветки, всяких фокусов с изменением размеров и т.д.*/
dsp.t ? (
dsp.t = Function("it,cursor,temp", "return " + dsp.t)(whp, cp)) : (
dsp.t = cp.t - whp.b.h / 2 - whp.p.top),
dsp.l ? (
dsp.l = Function("it,cursor,temp", "return " + dsp.l)(whp, cp)) : (
dsp.l = cp.l - whp.b.w / 2 - whp.p.left),
whp.b.e.style.left = dsp.l + "px",/*ставим подсветке полученные координаты*/
whp.b.e.style.top = dsp.t + "px";
}, "!", ">");
};
document.addEventListener("mousemove", tpto);
const Main = th => {
let back = document.createElement("div");
back.setAttribute("b", ""),
back.style.top = "200%",/*чтоб подсветка не выползала после загрузки страницы*/
back.style.left = "200%",
th.appendChild(back),
elems.push([th, back]);
};
class el extends HTMLElement {
connectedCallback() {
let th = this;
Main(th),
th.activate = () => Main(th);
}
disconnectedCallback() {
let elem,
th = this;
all(elems, (el, i) => {
if (el[0] === th) {
elem = i;
return "t";
}
}, "t");
elems.splice(elem, 1);
}
}
customElements.define("f-dplane", el);
})();
body {
background: black;
}
f-dplane:not([sensor]) {
cursor: default;
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
}
f-dplane:not([sensor]) div {
position: absolute;
background: radial-gradient(rgba(255, 255, 255, 0.13), transparent, transparent) no-repeat;
height: 300px;
width: 400px;
}
[r]{
width:200px;
height:100px;
position:relative;
margin-bottom:3px;
border:1px solid rgba(128, 128, 128, 0.14);
}
<div r><f-dplane></f-dplane></div>
<div r><f-dplane></f-dplane></div>
<div r><f-dplane></f-dplane></div>
<div r><f-dplane></f-dplane></div>
<div r><f-dplane></f-dplane></div>
Проблема в том, что все блоки подсветки постоянно двигаются за курсором.. И я не знаю, как более оптимально решить эту проблему. Сначала хотел шаманить с расчётом расстояния от курсора до блока и от блока до блока, но подумал, что это очень нехорошо кончится
Просто оставлю это здесь
container.addEventListener('mousemove',e=>{
darkness.style.top = e.pageY - darkness.offsetHeight/2 + "px";
darkness.style.left = e.pageX -darkness.offsetWidth/4 - document.body.offsetWidth/2 + "px";
})
.wrapper {
position: relative;
background:url(https://www.kino-teatr.ru/art/2104/17910.jpg) 50% 50% no-repeat;
background-size:100% 100%;
margin: 0 auto;
width: 500px;
height: 500px;
overflow: hidden;
}
.darkness {
position: absolute;
left: -50%;
top: -50%;
background: radial-gradient(transparent,rgba(0,0,0,0.7),black,black, black,black, black,black,black,black);
width: 1000px;
height: 1000px;
}
<div class="wrapper" id="container">
<div class="darkness" id="darkness"></div>
</div>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как можно вставить картинку (календарик) перед выбранным месяцем в select?
Как сделать attended transfer с помощью JsSIP? Пробовала делать currentSessionrefer(oldSession), однако ничего не вышло
Нужно чтобы обработчик события onclick, повешенный наgallery, не вызывался при клике на дочерние блоки