Событие "mouseleave" не всегда срабатывает, как побороть?
Вложений: 1
Есть много блоков, при наводке на которые срабатывает функция по их увеличению. Естественно если мышку уводить с них то все возвращается обратно.
Вот сама функция:
$(document).ready(function(){
$("#list_wrap").on("mouseenter", ".list_box", function(){
$('.mDem').stop();
var $startWidth = $(this).find('img').width();
var $startHeight = $(this).find('img').height();
var $origWidth = $(this).find('img').attr('width');
var $origHeight = $(this).find('img').attr('orh');
$sdvigLeft = (($origWidth - $startWidth)/2)*(-1);
$sdvigTop = (($origHeight - $startHeight)/2)*(-1);
$dem = $(this).find('img');
setTimeout(function() {
$dem.animate({'marginLeft': $sdvigLeft + 'px', 'marginTop': $sdvigTop + 'px', 'width': $origWidth + 'px', 'position': 'absolute', 'maxWidth': '900px'}, 100);
}, 500);
}).on('mouseleave', '.list_box', function(){
$(this).find('img').css({'marginLeft': '0', 'marginTop': '0', 'width': '310px', 'position': 'absolute', 'maxWidth': '100%'});
});
});
Вот живой пример как все это работает (наброски): http://demotivatory.net/ Все работает как положено, но к сожалению только при условии если водить мышку очень медленно и без резких движений. Если же начать это делать резко и быстро, некоторые блоки не успевают уменьшаться и остаются в увеличенном виде. А еще периодически функция начинает обрабатываться не верно и картинка не сдвигается в нужное положение. Как-то так, как на скриншоте ниже. Однако вот тут: http://jquery-gp-gallery.ionelmc.ro/demo/ Как я не пытался подобной проблемы мне повторить не удалось. Подскажите, как нужно модернизировать данную функцию чтобы такой проблемы больше не появлялось? |
Хотелось бы добиться точно такой же работы как в примере (http://jquery-gp-gallery.ionelmc.ro/demo/)
|
Alex1233,
может без скрипта ?
.list_box img {
-moz-transition: all 1s ease-out;
-o-transition: all 1s ease-out;
-webkit-transition: all 1s ease-out;
transition: all 1s ease-out;
}
.list_box img:hover{
-webkit-transition-delay: 0.5s;
-moz-transition-delay: 0.5s;
-o-transition-delay: 0.5s;
transition-delay: 0.5s;
-webkit-transform: scale(1.5);
-moz-transform: scale(1.5);
-o-transform: scale(1.5);
transform: scale(1.5);
}
|
рони, как вариант, спасибо =)
Сейчас поставил Ваш пример, правда немного ускорил его. Не знал что так можно =) Но я так понимаю в данном случае будут увеличиваться абсолютно все картинки, даже те которые меньше изначальных высоты и ширины. И не до оригинальных размеров картинки, а ровно в 1,5 раза больше тех что были до наводки. А со скриптом все сложно, парой строк там не отделаться? |
Но в целом мне нравится =) Наверное даже так и оставлю, спасибо большое! =)
==== Но в целях самообучения, на будущее, хотелось бы все таки понять как решать подобные проблемы которые изложены в 1 посте. |
Цитата:
|
рони, Вы про эти функции?
setTimeout и clearTimeout Если да, то я смотрю у Вас там как раз сделано как и в примере из моего 1 поста, что я давал (где все работает четко и как положено). Тут. К сожалению я как не пытался вникнуть в тот код так и не понял как это все работает. Слишком как то все заумно. Но Ваш пример вроде как поменьше/попроще - попробую сейчас его разложить по полочкам, что там и к чему. |
рони, все равно тяжеловато это. Вы не могли бы на моем коде добавить эти функции? Я думаю что я за несколько дней его уже на столько изучил что мне Ваши правки в нем будут куда понятнее.
Был бы Вам очень и очень признателен за это. |
$('.mDem').stop();
Вот это там кстати лишнее, это я эксперементировал - забыл убрать. |
Alex1233,
$(document).ready(function () {
var timer;
$("#list_wrap").on("mouseenter", ".list_box", function () {
clearTimeout(timer)
var $dem = $(this).find('img');
$dem.stop();
var $startWidth = $dem.width();
var $startHeight = $dem.height();
var $origWidth = $dem.attr('width');
var $origHeight = $dem.attr('orh');
$origWidth < $startWidth && ($origWidth = $startWidth * 1.2);
$origHeight < $startHeight && ($origHeight = $startHeight * 1.2);
$sdvigLeft = (($origWidth - $startWidth) / 2) * (-1);
$sdvigTop = (($origHeight - $startHeight) / 2) * (-1);
timer = setTimeout(function () {
$dem.animate({
'marginLeft': $sdvigLeft + 'px',
'marginTop': $sdvigTop + 'px',
'width': $origWidth + 'px',
'position': 'absolute',
'maxWidth': '900px'
}, 100);
}, 500);
}).on('mouseleave', '.list_box', function () {
clearTimeout(timer)
$(this).find('img').stop().css({
'marginLeft': '0',
'marginTop': '0',
'width': '310px',
'position': 'absolute',
'maxWidth': '100%'
});
});
});
|
| Часовой пояс GMT +3, время: 18:19. |