冲突 javascript 或鼠标悬停事件过多?
Conflicting javascript or too many mouseover events?
目前,我在一张背景图片上叠加了 4 张图片。当您的鼠标悬停在每个图像上时,它会消失,直到用户刷新。我想创建一个图像的 26 个克隆。理想情况下,我可以定位每个图像副本,并且 jquery 会自动生成 id 名称,例如 (#myid(n)) a.k.a #myid1, #myid2。由于到目前为止我无法取消此图像克隆,因此我不得不一遍又一遍地复制和粘贴每个代码块。然而,一旦我添加了第六张图片,我就遇到了性能问题,我的代码停止工作。
我已经包含了两个代码笔。此代码笔适用于 4 个图像副本:https://codepen.io/narutofan389/collab/NWGpQWo
此代码笔不适用于 6 个副本:https://codepen.io/narutofan389/collab/MWapQyO
我听说过多的鼠标悬停事件会导致性能问题。我不确定这是否是我问题的根源。我也在尝试使用单独的 codepen 来测试具有单独 ID 的图像克隆。这是到目前为止从另一个堆栈溢出答案中获取的代码:
html
<body>
<div id="sand"></div>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
javascript
$(document).ready(function(){
for (var i = 0; i < 2; i++) {
var img = "<img src ='https://s3-us-west-2.amazonaws.com/s.cdpn.io/4405662/sandsmaller.png'
id='myid"+i+"'/>";
$("body #sand").append(img);
}
})
我再次尝试生成不同的 ID,我可以单独定位?
由于您的克隆片段在 jQuery 中,我希望使用它的解决方案是可以接受的。
首先,我必须添加您的标记中缺少的 #sand
容器,因为它是代码附加图像的地方。还为每个图像添加了一个 div
包装器以镜像您的代码笔(尽管您可能不需要它),并向图像添加了一个 sand
class。
然后,我没有为每个元素添加一个事件,而是使用 Event delegation so I can attach just one handler to the wrapping element. I'm targeting all images inside the #sand
container that are not already hidden。
然后稍微简化了 css,删除了冗余规则并将通用属性移至新的 classes。
for (let i = 1; i <= 6; i++) {
// Create the wrapping div
var $container = $("<div class='sand" + i + "'>");
// Create the img
var $img = $("<img src ='https://s3-us-west-2.amazonaws.com/s.cdpn.io/4405662/sandsmaller.png' class='sand' id='sand" + i + "'/>");
// Add image to container
$container.append($img);
// Add container to the document
$("body #sand").append($container);
}
// Listen when the mouse hovers an image
$('#sand').on('mouseenter', 'img.sand:not(.hide)', function() {
$(this).addClass('hide');
});
$('#sand').on('animationend', 'img.sand.hide', function() {
$(this).hide();
});
html {
background: url(https://i.postimg.cc/HWJvtDGx/lockcorrect.jpg) no-repeat center center fixed;
background-size: cover;
height: 100%;
overflow: hidden;
}
#bg {
position: fixed;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
}
#bg img {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
min-width: 50%;
min-height: 50%;
}
@-webkit-keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@-moz-keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@-o-keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.sand {
position: absolute;
height: 90vh;
}
#sand6 {
top: 0px;
right: 200px;
}
#sand5 {
top: 300px;
left: 500px;
}
#sand4 {
top: 300px;
right: 200px;
}
.hide {
animation: fade 3s;
animation-fill-mode: forwards;
}
#sand3 {
height: 100vh;
top: 0px;
left: 700px;
}
#sand2 {
height: 100vh;
top: 0px;
left: 300px;
}
#sand1 {
position: relative;
height: 100vh;
right: 30px;
}
<div id="bg">
<img src="https://i.postimg.cc/HWJvtDGx/lockcorrect.jpg
" alt="lock">
</div>
<div id="sand">
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
目前,我在一张背景图片上叠加了 4 张图片。当您的鼠标悬停在每个图像上时,它会消失,直到用户刷新。我想创建一个图像的 26 个克隆。理想情况下,我可以定位每个图像副本,并且 jquery 会自动生成 id 名称,例如 (#myid(n)) a.k.a #myid1, #myid2。由于到目前为止我无法取消此图像克隆,因此我不得不一遍又一遍地复制和粘贴每个代码块。然而,一旦我添加了第六张图片,我就遇到了性能问题,我的代码停止工作。
我已经包含了两个代码笔。此代码笔适用于 4 个图像副本:https://codepen.io/narutofan389/collab/NWGpQWo
此代码笔不适用于 6 个副本:https://codepen.io/narutofan389/collab/MWapQyO
我听说过多的鼠标悬停事件会导致性能问题。我不确定这是否是我问题的根源。我也在尝试使用单独的 codepen 来测试具有单独 ID 的图像克隆。这是到目前为止从另一个堆栈溢出答案中获取的代码:
html
<body>
<div id="sand"></div>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
javascript
$(document).ready(function(){
for (var i = 0; i < 2; i++) {
var img = "<img src ='https://s3-us-west-2.amazonaws.com/s.cdpn.io/4405662/sandsmaller.png'
id='myid"+i+"'/>";
$("body #sand").append(img);
}
})
我再次尝试生成不同的 ID,我可以单独定位?
由于您的克隆片段在 jQuery 中,我希望使用它的解决方案是可以接受的。
首先,我必须添加您的标记中缺少的 #sand
容器,因为它是代码附加图像的地方。还为每个图像添加了一个 div
包装器以镜像您的代码笔(尽管您可能不需要它),并向图像添加了一个 sand
class。
然后,我没有为每个元素添加一个事件,而是使用 Event delegation so I can attach just one handler to the wrapping element. I'm targeting all images inside the #sand
container that are not already hidden。
然后稍微简化了 css,删除了冗余规则并将通用属性移至新的 classes。
for (let i = 1; i <= 6; i++) {
// Create the wrapping div
var $container = $("<div class='sand" + i + "'>");
// Create the img
var $img = $("<img src ='https://s3-us-west-2.amazonaws.com/s.cdpn.io/4405662/sandsmaller.png' class='sand' id='sand" + i + "'/>");
// Add image to container
$container.append($img);
// Add container to the document
$("body #sand").append($container);
}
// Listen when the mouse hovers an image
$('#sand').on('mouseenter', 'img.sand:not(.hide)', function() {
$(this).addClass('hide');
});
$('#sand').on('animationend', 'img.sand.hide', function() {
$(this).hide();
});
html {
background: url(https://i.postimg.cc/HWJvtDGx/lockcorrect.jpg) no-repeat center center fixed;
background-size: cover;
height: 100%;
overflow: hidden;
}
#bg {
position: fixed;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
}
#bg img {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
min-width: 50%;
min-height: 50%;
}
@-webkit-keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@-moz-keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@-o-keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes fade {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.sand {
position: absolute;
height: 90vh;
}
#sand6 {
top: 0px;
right: 200px;
}
#sand5 {
top: 300px;
left: 500px;
}
#sand4 {
top: 300px;
right: 200px;
}
.hide {
animation: fade 3s;
animation-fill-mode: forwards;
}
#sand3 {
height: 100vh;
top: 0px;
left: 700px;
}
#sand2 {
height: 100vh;
top: 0px;
left: 300px;
}
#sand1 {
position: relative;
height: 100vh;
right: 30px;
}
<div id="bg">
<img src="https://i.postimg.cc/HWJvtDGx/lockcorrect.jpg
" alt="lock">
</div>
<div id="sand">
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>