首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Js mouseClick事件似乎在错误的组件上触发

Js mouseClick事件似乎在错误的组件上触发
EN

Stack Overflow用户
提问于 2018-03-03 20:29:57
回答 1查看 48关注 0票数 2

我有一个简单的div,我在其中添加了一个孩子。我在用evt.clientX和clientY计算孩子的位置。相反,我似乎得到了包含元素的坐标,即使函数在div上。

我如何才能获得div而不是父级的click事件?我对事件继承知之甚少,即使它就是这么叫的。

代码如下:

代码语言:javascript
复制
function initRipple() {

  //qck define
  let rcont;

  rcont = Array.from(document.getElementsByClassName('ripple'));

  rcont.forEach(function(el) {
    el.addEventListener('click', function(evt) {
      ripple(el, evt);
    });
  });

}

function ripple(el, evt) {

  // qck def
  let cir, x, y;

  // assign values
  cir = document.createElement('div');
  x = evt.clientX;
  y = evt.clientY;

  // modify circle attributes / position
  cir.classList.add('ripple-bubble');
  cir.style.left = `${ x - 12 }px`;
  cir.style.top = `${ y - 12 }px`;

  cir.addEventListener('animationend', function() {
    let oldChild = el.removeChild(cir);
  });

  el.appendChild(cir);

}


initRipple();
代码语言:javascript
复制
body {background-color: #555}

#tablinks {
  display: inline-block;
  list-style-type: none;
  position: absolute;
  top: 0;
  height: 100%;
  display: flex;
}

#tablinks #tablinks-line {
  height: 3px;
  position: absolute;
  bottom: 0;
  left: 0;
  min-width: 24px;
  background-color: #6DADFF;
  transition: all 0.3s ease;
  pointer-events: none;
  transform: translateZ(0);
}

#tablinks .tablink {
  height: 56px;
  line-height: 56px;
  color: rgba(255, 255, 255, 0.7);
}

#tablinks .tablink.active {
  color: #fff;
}

#tablinks .tablink a {
  display: inline-block;
  height: 56px;
  line-height: 56px;
  text-decoration: none;
  padding: 0 24px;
  font-size: 13px;
  color: inherit;
  outline: none;
  font-family: robotomedium;
  font-weight: 100;
}

.ripple {
  position: relative;
  overflow: hidden;
}

.ripple .ripple-bubble {
  animation: ripple-effect 1s ease forwards;
  width: 24px;
  height: 24px;
  position: absolute;
  transform: translateZ(0);
  background-color: rgba(255, 255, 255, 0.2);
  border-radius: 50%;
  pointer-events: none;
  opacity: 0.7;
}

@keyframes ripple-effect {
  from {
    transform: scale(1);
    opacity: 0.7;
  }
  to {
    transform: scale(12);
    opacity: 0;
  }
}
代码语言:javascript
复制
<ul id="tablinks">

  <li class="tablink ripple"><a href="#">TAB 1</a></li>
  <!--
     -->
  <li class="tablink ripple"><a href="#">TAB 2</a></li>
  <!--
     -->
  <li class="tablink ripple"><a href="#t">TAB 3</a></li>

</ul>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-03 20:43:14

代码的问题在于clientX是相对于整个页面的,而不是与事件相关的。

一个快速的解决方案是更改x的计算,以暂停元素的x位置。

代码语言:javascript
复制
x = evt.clientX;
y = evt.clientY;
const rect = evt.target.getBoundingClientRect()
x -= rect.x;
y -= rect.y;

这是一支可以正常工作的笔:https://codepen.io/anon/pen/WMWZWd

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49084129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档