Подсветка курсора

170
27 июля 2018, 13:00

Доброго времени суток!

У меня есть подсветка курсора, выполненная следующим образом:

(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>

Проблема в том, что все блоки подсветки постоянно двигаются за курсором.. И я не знаю, как более оптимально решить эту проблему. Сначала хотел шаманить с расчётом расстояния от курсора до блока и от блока до блока, но подумал, что это очень нехорошо кончится

Answer 1

Просто оставлю это здесь

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>

READ ALSO
Картинка перед выбранным текстом в select

Картинка перед выбранным текстом в select

Как можно вставить картинку (календарик) перед выбранным месяцем в select?

177
Attended transfer с помощью JsSIP

Attended transfer с помощью JsSIP

Как сделать attended transfer с помощью JsSIP? Пробовала делать currentSessionrefer(oldSession), однако ничего не вышло

317
Блокировка клика для внутренних блоков

Блокировка клика для внутренних блоков

Нужно чтобы обработчик события onclick, повешенный наgallery, не вызывался при клике на дочерние блоки

217