var top = e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop;
有人能解释一下上述陈述的每一部分在做什么吗?
'e.target'是触发事件的对象,而ripple是包含ripple类的span,因此,如果它是ripple本身。那么它是找到它相对于页面顶部的位置,为什么它同时引用rect和ripple?
以下是该功能的更好背景:
if(!ripple){
ripple=document.createElment('span'); /*empty object, span to hold the ripple class*/
ripple.className='ripple';/*add ripple class to it (span)*/
/*place the ripple on top of the button*/
ripple.style.height=ripple.style.width=
Math.max(rect.width, rect.height)+'px';
/*set the ripple to the buttons child= attach*/
target.appendChild(ripple);
}
/*--------- DONT ANIMATE FOR NOW --------------*/
ripple.classList.remove('show');
/* complex part*/
var top= e.pageY - rect.top - ripple.offsetHeight/2 - document.body.scrollTop; /*DEBUG HERE*/
var left =e.pageX - rect.left - ripple.offsetWidth/2 - document.body.scrollLeft;
ripple.style.top= top + 'px';
ripple.style.left= left + 'px';
答案 0 :(得分:1)
好吧,我想我找出了答案,当我们编程人员不了解一段代码正在做什么时,将它视为理所当然并将其视为理所当然并不好我们希望,我们必须知道每条线的作用。感谢El.oz和一些更多的研究,我认为已经完成了。所以...这就是应该如何运作:
当我们点击页面中的任意位置X / Y给出绝对位置,即与文档相关的位置,但是如果我们想要影响文档中的特定对象,我们必须将这些坐标转换为本地空间,换句话说,相对于我们点击的对象的位置,它由一个矩形区域定义,该区域包围每个对象,最后但并非最不重要的是我们想要在任何地方点击一个跨度,使用它是有意义的将中心作为注册点,而不是使用右上角。
我们需要的数据:
var top= e.pageY - rect.top - ripple.offsetHeight/2 - document.body.scrollTop; /*subtract the container and scroll offset from global then center, this gives the local coordinate*/
var left =e.pageX - rect.left - ripple.offsetWidth/2 - document.body.scrollLeft;
ripple.style.top= top + 'px'; /*place the ripple on this local coords*/
ripple.style.left= left + 'px';
答案 1 :(得分:0)
首先,我不太擅长解释,但我会尽力简化它。
span
标签的显示是内嵌的,因此它不会占用宽度和高度。而是将其设置为display block
,或者将其设为padding
。
第二,让元素从鼠标点开始占据他的位置你应该得到这样的东西:
absolute
位置event.pageX
/ event.pageY
offsetLeft
/ offsetTop
clientWidth
/ clientHeight
并将其除以2以指针为中心
var cont = document.querySelector('.cont');
var ripple = document.createElement('span');
ripple.setAttribute('class', 'ripple');
ripple.style.width = '40px';
ripple.style.height = '30px';
ripple.style.display = 'block';
ripple.style.position = 'absolute';
ripple.style.backgroundColor = '#2ecc71';
cont.addEventListener('click', function(e) {
var posX = e.pageX - cont.offsetLeft - (ripple.clientWidth/2);
var posY = e.pageY - cont.offsetTop - (ripple.clientHeight/2);
ripple.style.left = posX + 'px';
ripple.style.top = posY + 'px';
cont.appendChild(ripple);
});
.cont {
width: 100px;
height: 100px;
background-color: #3498db;
position: relative
}
<div class="cont">
</div>
Jquery示例: http://codepen.io/El-Oz/pen/reQpae