Я хочу изменить источник изображения, используя jQuery, но с анимацией.
У меня прямолинейное изображение по умолчанию. У меня есть 5 разных изображений с головой, смотрящей в разные стороны. при наведении курсора на определенный раздел я хочу изменить изображение на это конкретное изображение src значение.
src
Если div не отображается, должно появиться прямолинейное изображение по умолчанию.
Я достиг этого, но изображения должны меняться с анимацией. Мои анимации мерцают.
Может ли кто-нибудь указать мне правильное направление?
$('#thumbs img').hover(function(event) { $(this).fadeOut(100, function() { var thisSRC = $(this).attr('src'); $('#main').attr('src', thisSRC); }).fadeIn(100); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="thumbs"> <img src="https://i.ibb.co/rxX8VMq/left.png" width="50" height="50"> <img src="https://i.ibb.co/r77CrCC/topleft.png" width="50" height="50"> <img src="https://i.ibb.co/CzRdRtp/top.png" width="50" height="50"> <img src="https://i.ibb.co/L8cSs3p/topright.png" width="50" height="50"> <img src="https://i.ibb.co/D1cjqfD/right.png" width="50" height="50"> </div> <img id="main" src="https://i.ibb.co/3dMWhqV/default-head.png">
jsfiddle
Учитывая тот факт, что вы используете полноразмерные изображения уже , можно использовать решение только для CSS, поскольку для загрузки больших изображений не требуется дополнительная полоса пропускания:
.thumb{ width: 50px; display: inline-block; } .thumb:hover ~ .big .default{ opacity:0; } .thumb:nth-child(1):hover ~ .big > img:nth-child(1){ z-index:5; opacity:1; } .thumb:nth-child(2):hover ~ .big > img:nth-child(2){ z-index:5; opacity:1; } .thumb:nth-child(3):hover ~ .big > img:nth-child(3){ z-index:5; opacity:1; } .thumb:nth-child(4):hover ~ .big > img:nth-child(4){ z-index:5; opacity:1; } .thumb:nth-child(5):hover ~ .big > img:nth-child(5){ z-index:5; opacity:1; } .big{ position:relative; } .big img{ position:absolute; top: 0; left: 0; opacity: 0; transition: .2s .1s ease-out; } .big .default{ opacity:1; }
<img src="https://i.ibb.co/rxX8VMq/left.png" class='thumb'> <img src="https://i.ibb.co/r77CrCC/topleft.png" class='thumb'> <img src="https://i.ibb.co/CzRdRtp/top.png" class='thumb'> <img src="https://i.ibb.co/L8cSs3p/topright.png" class='thumb'> <img src="https://i.ibb.co/D1cjqfD/right.png" class='thumb'> <div class='big'> <img src="https://i.ibb.co/rxX8VMq/left.png"> <img src="https://i.ibb.co/r77CrCC/topleft.png"> <img src="https://i.ibb.co/CzRdRtp/top.png" class='default'> <img src="https://i.ibb.co/L8cSs3p/topright.png"> <img src="https://i.ibb.co/D1cjqfD/right.png"> </div>
намного проще генерировать вышеуказанный CSS с помощью препроцессоров (например, SCSS)
Хорошо, так что это модифицированная версия, которая оживляет основную, а не любую из миниатюр.
active
var $thumbnails = $('#thumbs img'); var $main = $('#main'); $main.data('originalSrc', $main.attr('src')); $thumbnails.on('mouseenter', function(e){ e.target.classList.add('active'); $main.finish().fadeOut(500, function(){ $main.attr('src', e.target.getAttribute('src')); $main.fadeIn(500); }); }); $thumbnails.on('mouseleave', function(e){ e.target.classList.remove('active'); setTimeout(function(){ if ($thumbnails.filter('.active').length < 1) { $main.prop('src', $main.data('originalSrc')); } }, 200); });
$('#thumbs img').hover(function(event){ $('#thumbs img').finish(); var thisSRC=$(this).attr('src'); $('#main').fadeTo(500, 0.5); $('#main').finish(); $('#main').fadeTo(500, 1).attr('src',thisSRC); });
Сначала вы должны fadeOut, а когда он закончится, измените источник и выполните fadeIn в завершенном обратном вызове.
fadeOut
fadeIn
$('#thumbs img').hover(function(event) { var thisSRC = $(this).attr('src'); $('#main').fadeOut(300, function() { $('#main').attr('src', thisSRC); $('#main').fadeIn(300) }); });