jquery - Jquery用鼠标位置改变setInterval速度
问题描述
当鼠标靠近时,我想让眼睛眨得越来越快,就像这个带有心脏的例子:
用这只眼睛(没有圆圈):
我设法让它闪烁,但我仍在尝试在光标移动时更改间隔速度。这是我的代码:
var mX, mY, distance, intervalSpeed = 500, interval,
intervalSpeedMax = 500;
intervalSpeedMin = 100;
max_distance = 213,
$distance = $('#distance'),
$element = $('.icone');
function calculateDistance(elem, mouseX, mouseY) {
return Math.floor(Math.sqrt(Math.pow(mouseX - (elem.offset().left+(elem.width()/2)), 2) + Math.pow(mouseY - (elem.offset().top+(elem.height()/2)), 2)));
}
$(".wrapper").on('mouseenter', function(){
interval = setInterval(function(){
$(".first").toggle();
$(".second").toggle();
}, intervalSpeed);
$(document).mousemove(function(e) {
mX = e.pageX;
mY = e.pageY;
distance = calculateDistance($element, mX, mY);
$distance.text("distance : " + distance);
// Calcul de l'interval
intervalSpeed = ((intervalSpeedMax - intervalSpeedMin) * distance / max_distance ) + intervalSpeedMin;
});
});
$(".wrapper").on('mouseleave', function(){
clearInterval(interval);
$(".first").show();
$(".second").hide();
});
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
<style type="text/css">
html{
height: 100%;
}
body{
display: flex;
justify-content: center;
align-items: center;
min-height: 100%;
}
.wrapper{
width: 300px;
height: 300px;
background-color: salmon;
display: flex;
justify-content: center;
align-items: center;
position: relative;
}
#distance{
position: absolute;
top: 5px;
left: 5px;
}
.icone{
width: 50px;
height: 50px;
position: relative;
}
img{
width: 100%;
height: 100%;
position: absolute;
}
img:first-of-type{
}
img:nth-of-type(2){
display: none;
top: 20px;
}
</style>
</head>
<body>
<div class="wrapper">
<span id="distance"></span>
<div class="icone">
<img class="first" src="https://i.ibb.co/ysX2Hm0/Fichier-4.png">
<img class="second" src="https://i.ibb.co/mBFRn0V/Fichier-3.png">
</div>
</div>
</body>
</html>
我承认眼睛并不完美,但这不是重点。我无法使间隔速度平滑变化。
解决方案
我设法使用 setTimeOut 函数找到了解决方案。我创建了一个函数“animDisplay”,当鼠标进入鲑鱼广场时调用。延迟是根据鼠标的位置在此函数中计算的,如下所示:
var mX, mY, distance, intervalSpeed = 500, interval,
intervalSpeedMax = 500;
intervalSpeedMin = 100;
max_distance = 213,
$distance = $('#distance'),
$element = $('.icone');
function calculateDistance(elem, mouseX, mouseY) {
return Math.floor(Math.sqrt(Math.pow(mouseX - (elem.offset().left+(elem.width()/2)), 2) + Math.pow(mouseY - (elem.offset().top+(elem.height()/2)), 2)));
}
function animDisplay(){
$(".first").toggle();
$(".second").toggle();
window.addEventListener('mousemove', function(e){
mX = e.x;
mY = e.y;
});
distance = calculateDistance($element, mX, mY);
intervalSpeed = ((intervalSpeedMax - intervalSpeedMin) * distance / max_distance ) + intervalSpeedMin;
interval = setTimeout(animDisplay, intervalSpeed);
}
$(".wrapper").on('mouseenter', function(){
animDisplay();
});
$(".wrapper").on('mouseleave', function(){
clearInterval(interval);
$(".first").show();
$(".second").hide();
});
推荐阅读
- spring - 为什么我不能将 POST 登录信息发送到 Spritg 身份验证服务器?
- c++ - 我在 C++ 中的类多线程有问题
- c# - Xceed 属性网格无法完全查看或单击选择空值
- python - 通过 Python 运行 Excel 宏(使用 Mac)?
- javascript - 倒计时完成后如何移动窗口?
- amazon-web-services - Creating Cognito users from frontend application
- python - 读取 .h264 文件
- telegram - 到私人电报频道的 HTTP 发布消息不起作用
- excel - 如何有条件地检查excel中两个日期之间的小时差
- telegram - 如何收集电报消息流