javascript - 如何获得具有相同类名的不同项目位置?
问题描述
当 mousemove() 时,它只获取第一项的位置。现在它们都是重叠的。我该如何改进呢?
https://codepen.io/penny289/pen/JjJzYbv
$(window).mousemove(function(evt){
$('.img-box').each(function(){
var positionX= $(this).offset().left/100
var positionY= $(this).offset().top/100
$(this).css("left",positionX+evt.pageX/100+"%")
.css("top",positionY+evt.pageY/100+"%")
})
})
<div class="container">
<div class="img-box box-1">
<img src="https://images.unsplash.com/photo-1632012643163-c9c4fbbd9f05?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzEwNg&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-2">
<img src="https://images.unsplash.com/photo-1632778931175-128809d8facc?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzE2MQ&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-3">
<img src="https://images.unsplash.com/photo-1594734044877-2ebba0c14720?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzIwMg&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-4">
<img src="https://images.unsplash.com/photo-1630231211819-a131d7538a41?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzIxNQ&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-5">
<img src="https://images.unsplash.com/photo-1632073591482-0d69552e07df?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzI1NA&ixlib=rb-1.2.1&q=85">
</div>
</div>
解决方案
它不会仅获取第一张图像的坐标。相反,您似乎有几个问题:
- 您正在除以 100,大概是因为您使用的是百分比,但除非您的屏幕是 100 像素宽,否则这显然是错误的。
- .offset() 确实返回相对于文档的偏移量,但是您将项目相对于容器定位
- 您每次都尝试动态获取偏移量,但如果您采用这种方法,您需要知道该偏移量的哪一部分是您上次调用此函数时的偏移量。否则,您开始累积 MouseEvent 的 x 和 y 位置并快速将整个事物移出屏幕。
您没有理由使用百分比,因此只需使用绝对像素并简化您的代码。
然后存储初始偏移量,.data(..)
这样您就不必每次都减去以前的鼠标位置并跟踪它。由于您想要相对于容器的偏移量(因为您的 css 相对于容器呈现它),请从图像偏移量中减去容器偏移量。
现在,您可以通过添加鼠标 pageX/pageY 使图像随鼠标移动。
除此之外,您应该使用去抖动(在堆栈片段中不起作用),window.requestAnimationFrame
因此您的 cpu 不会在尝试为鼠标移动的每个像素绘制一些东西时融化,而是仅在它准备绘制单个帧时。
$(window).mousemove(function(evt){
//_.debounce(() => {
window.requestAnimationFrame(() => {
const containerOffsetX = $('.container').offset().left;
const containerOffsetY = $('.container').offset().top;
$('.img-box').each(function(elem, i){
let imageOffsetX = $(this).data('offsetX');
if (!imageOffsetX) {
imageOffsetX = $(this).offset().left - containerOffsetX;
$(this).data('offsetX', imageOffsetX);
}
let imageOffsetY = $(this).data('offsetY');
if (!imageOffsetY) {
imageOffsetY = $(this).offset().top - containerOffsetY;
$(this).data('offsetY', imageOffsetY);
}
const mouseOffsetX = evt.pageX;
const mouseOffsetY = evt.pageY;
const newPositionX = imageOffsetX + mouseOffsetX;
const newPositionY = imageOffsetY + mouseOffsetY;
$(this).css("left", `${newPositionX}px`)
.css("top", `${newPositionY}px`)
});
});
//}, 10);
});
body{
display:flex;
align-items:center;
justify-content:center;
}
.container{
width:70vw;
height:500px;
position:relative;
}
.img-box{
position:absolute;
}
.img-box img{
width:300px;
height:200px;
/* transform:translate(-50%); */
}
.img-box.box-1{
top:10%;
}
.img-box.box-2{
left:20%;
top:80%;
}
.img-box.box-3{
top:50%;
left:50%;
}
.img-box.box-4{
top:10%;
left:90%
}
.img-box.box-5{
left:90%;
top:70%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<div class="container">
<div class="img-box box-1">
<img src="https://images.unsplash.com/photo-1632012643163-c9c4fbbd9f05?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzEwNg&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-2">
<img src="https://images.unsplash.com/photo-1632778931175-128809d8facc?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzE2MQ&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-3">
<img src="https://images.unsplash.com/photo-1594734044877-2ebba0c14720?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzIwMg&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-4">
<img src="https://images.unsplash.com/photo-1630231211819-a131d7538a41?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzIxNQ&ixlib=rb-1.2.1&q=85">
</div>
<div class="img-box box-5">
<img src="https://images.unsplash.com/photo-1632073591482-0d69552e07df?crop=entropy&cs=srgb&fm=jpg&ixid=MnwxNDU4OXwwfDF8cmFuZG9tfHx8fHx8fHx8MTYzMjk4MzI1NA&ixlib=rb-1.2.1&q=85">
</div>
</div>
推荐阅读
- php - xampp的“缩小”版本?
- javascript - 删除移动设备上的 slick.js 幻灯片
- javascript - .bat 文件以打开 chrome 转到 url 并执行 JavaScript
- php - 为多行插入第二个自动增量 ID
- php - Wordpress 有一个讨厌的重定向,不允许使用 ssl
- polymer - 如何在聚合物制作的自定义组件中测试 ajax 请求
- java - Java中的可外部化数组
- django - 'cx_Oracle.Cursor' 对象在 Django 上没有属性 'numbersAsStrings'
- c - 为什么自动完成中没有显示gets方法?
- apache-kafka - Kafka Streams - 从 KTable 中消失的值