2015-12-28 2 views
1

Я создал скрипт, который перемещает li влево на 40 пикселей на центр мыши и перемещает его обратно на мышь. Он отлично работает в большинстве случаев, однако он часто сбой так, что он перемещается влево и не записывает mouseleave, поэтому он останется на 40 пикселей влево. Затем, когда вы снова нажмете мыши, он переместит еще 40 пикселей. Это заканчивается несогласованным списком.JQuery анимация влево на зависании не работает отлично

перекос список изображений -

misaligned list Image

Вот HTML и JQuery:

$(document).ready(function(){ 
 
    $(".work ul li a").on("mouseenter", function() { 
 
    $(this).animate({ 
 
     left: "-=40px", 
 
    }, 200) 
 
    }); 
 
    $(".work ul li a").on("mouseleave", function() { 
 
    $(this).animate({ 
 
     left: "+=40px", 
 
    }, 200) 
 
    }); 
 
    $("#darl").on({ 
 
    mouseenter: function() { 
 
     $("#bgimg1").fadeIn(200); 
 
    }, 
 
    mouseleave: function() { 
 
     $("#bgimg1").fadeOut(200); 
 
    } 
 
    }); 
 
    $("#chil").on({ 
 
    mouseenter: function() { 
 
     $("#bgimg2").fadeIn(200); 
 
    }, 
 
    mouseleave: function() { 
 
     $("#bgimg2").fadeOut(200); 
 
    } 
 
    }); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="work"> 
 
    <h1 class="heading">Selected Projects</h1> 
 
    <div class="line"></div> 
 
    <ul> 
 
    <li id="darl"> 
 
     <div class="container2"><div class="block"> 
 
     <img class="bg-image" id="bgimg1" src="Images/perspective2final2pfolio2.jpg"> 
 
     </div></div> 
 
     <a href="">1. Darlington Terrace</a> 
 
    </li> 
 

 
    <li><div class="thinline"></div></li> 
 
    <li id="chil"> 
 
     <div class="container2"><div class="block"> 
 
     <img class="bg-image" id="bgimg2" src="Images/DSC_0756.jpg"> 
 
     </div></div> 
 
     <a href="">2. Children's Playground</a> 
 
    </li> 
 

 
    <li><div class="thinline"></div></li> 
 
    <li> 
 
     <div class="container2"><div class="block"> 
 
     <img class="bg-image" id="bgimg3"src="Images/perspective2final2pfolio2.jpg"> 
 
     </div></div> 
 
     <a href="">3. Lawn Bowl Bakery Bridge</a> 
 
    </li> 
 

 
    <li><div class="thinline"></div></li> 
 
    <li> 
 
     <div class="container2"><div class="block"> 
 
     <img class="bg-image" id="bgimg4"src="Images/perspective2final2pfolio2.jpg"> 
 
     </div></div> 
 
     <a href="">4. Aqueduct: Museum of Architecture</a> 
 
    </li> 
 

 
    <li><div class="thinline"></div></li> 
 
    <li> 
 
     <div class="container2"><div class="block"> 
 
     <img class="bg-image" id="bgimg5"src="Images/perspective2final2pfolio2.jpg"> 
 
     </div></div> 
 
     <a href="">5. Velocity Frequent Flyer Website</a> 
 
    </li> 
 

 
    <li><div class="thinline"></div></li> 
 
    </ul> 
 

 
</div>

Вот GitHub репо: https://github.com/mingweichan/CVwebsite

+0

Вы пытались добавить .stop() с анимацией, fadeIn, fadeOut? ..... $ (this) .stop(). Animate() и т. Д .... Я надеюсь, что это решит проблему. – Qazi

+0

.stop() только что усугубил:/ – Ming

+0

'stop()' остановит анимацию на полпути, вместо этого вы должны использовать 'finish()', которая немедленно остановит анимацию, а свойства css будут установлены на целевые значения. – abhishekkannojia

ответ

0

Я столкнулся с этим некоторое время назад, вы захотите добавить .stop() перед вызовом .animate, потому что мне кажется, что jQuery регистрирует каждое событие и помещает их в стек и выполняет итерацию через каждый элемент в стеке.

Другими словами, если вы быстро и быстро перемещаете указатель мыши и выходите из этого элемента, события срабатывают 10 раз.

Однако для вашего случая добавьте .stop(), чтобы исправить одну проблему, но поскольку вы используете значения родственников для анимации свойства left, похоже, что он не завершил анимацию до того, как будет запущено следующее событие. Я предлагаю использовать абсолютные значения:

$(".work ul li a").on("mouseenter", function() { 
    $(this).stop().animate({ 
     left: "-40px", 
    }, 200) 
}); 
$(".work ul li a").on("mouseleave", function() { 
    $(this).stop().animate({ 
     left: "0px", 
    }, 200) 
}); 
+0

Не стек, jQuery использует очереди анимации. – abhishekkannojia

+0

Спасибо за ответ, проблема с использованием абсолютных значений для свойств слева заключается в том, что страница не будет реагировать, а при изменении размера окна на мобильный (около 600 пикселей) это будет работать неправильно. Разве я не понимаю? – Ming

+0

@Ming вы можете использовать '%' значения, если хотите движение в масштабе – jkris

1

Так, основываясь на другие полезные ответы, вот то, что работает для меня:

$(".work ul li a").on("mouseenter", function() { 
    $(this).finish().animate({ 
     marginLeft: "-40px", 
    }, 200) 
}); 
$(".work ul li a").on("mouseleave", function() { 
    $(this).finish().animate({ 
     marginLeft: "0px", 
    }, 200) 
}); 

Вместо «слева» Я использовал MarginLeft так, что она будет по-прежнему работать в отзывчивый макет. И я использовал финиш(), чтобы убедиться, что это остановит анимацию сразу, а не будет очередью анимации несколько раз. Спасибо за всю помощь, ребята!

Смежные вопросы