【问题标题】:Transfoming jQuery eye pupil tracker with mousemove event使用 mousemove 事件转换 jQuery 眼瞳跟踪器
【发布时间】:2019-06-29 17:50:53
【问题描述】:

我的代码的目的是使眼睛瞳孔跟随用户的光标方向。这是我关注的代码:https://codepen.io/J-Roel/pen/wWGNQN,但它是用 jQuery 编写的,所以我将它转换为 vanilla js:

eyeHandler(event) {
  let eye = this.$refs.eye
  let x = (eye.getBoundingClientRect().left) + (eye.clientWidth / 2)
  let y = (eye.getBoundingClientRect().top) + (eye.clientHeight / 2)
  let rad = Math.atan2(event.pageX - x, event.pageY - y)
  let rot = (rad * (180 / Math.PI) * -1) + 180
  eye.style.webkitTransform = 'rotate(' + rot + 'deg)'
  eye.style.mozTransform = 'rotate(' + rot + 'deg)'
  eye.style.msTransform = 'rotate(' + rot + 'deg)'
  eye.style.transform = 'rotate(' + rot + 'deg)'
}

这是我添加事件监听器的地方:

created() {
  window.addEventListener('mousemove', this.eyeHandler)
}

但它没有按预期工作:

  1. 当我将光标向右移动时,瞳孔会非常缓慢地下降。
  2. 当我向左移动时,它会上升。

猜猜,我把代码转换错了。

【问题讨论】:

    标签: javascript jquery vue.js


    【解决方案1】:

    我的建议是:

    document.querySelectorAll('.move-area').forEach(function(ele) {
        ele.addEventListener('mousemove', function(event) {
            var eye = document.querySelectorAll(".eye");
            var x = (eye[0].offsetLeft) + (eye[0].offsetWidth / 2);
            var y = (eye[0].offsetTop) + (eye[0].offsetHeight / 2);
            var rad = Math.atan2(event.pageX - x, event.pageY - y);
            var rot = (rad * (180 / Math.PI) * -1) + 180;
            eye.forEach(function(ele) {
                ele.style['-webkit-transform'] = 'rotate(' + rot + 'deg)';
                ele.style['-moz-transform'] = 'rotate(' + rot + 'deg)';
                ele.style['-ms-transform'] = 'rotate(' + rot + 'deg)';
                ele.style['transform'] = 'rotate(' + rot + 'deg)';
            });
        });
    })
    .move-area{/*normally use body*/
        width: 100vw;
        height: 100vh;
        padding: 10% 45%;
    }
    .container {
        width: 100%;
    }
    .eye {
        position: relative;
        display: inline-block;
        border-radius: 50%;
        height: 30px;
        width: 30px;
        background: #CCC;
    }
    .eye:after { /*pupil*/
        position: absolute;
        bottom: 17px;
        right: 10px;
        width: 10px;
        height: 10px;
        background: #000;
        border-radius: 50%;
        content: " ";
    }
    <section class="move-area">
        <div class='container'>
            <div class='eye'></div>
            <div class='eye'></div>
        </div>
    </section>

    【讨论】:

    • 我已经向窗口对象添加了事件监听器,这可能是个问题吗?因为即使使用您的代码,我也会得到相同的结果:
    • 在纯js中你需要给相关元素添加事件监听器:eyes...
    • 如果您使用的是 vue.js,则必须使用 vuejs 添加事件处理程序
    • 为什么我必须将事件监听器附加到eyes?它不应该监听整个窗口吗,因为光标正在整个窗口中移动。
    • 啊,没有检查codepen。我会复制同样的东西:)
    猜你喜欢
    • 2017-01-03
    • 2011-12-30
    • 2017-04-15
    • 2017-06-05
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多