2015-06-14 2 views
2

Я действительно новичок в JS/JQuery, я не могу понять, как сохранить этот код D.R.Y, если его вообще возможно вообще не знаю. Я использую JQuery для эффекта наведения с изображением. Box1 - это div, а img_hover_effect - наложение на зависание.Как сконденсировать это в одну функцию?

JS:

$('.box1').hover(function() { 
    $('.img_hover_effect').fadeIn(500); 
}, function() { 
    $('.img_hover_effect').fadeOut(400); 
}); 
$('.box2').hover(function() { 
    $('.img_hover_effect_2').fadeIn(500); 
}, function() { 
    $('.img_hover_effect_2').fadeOut(400); 
}); 
$('.box3').hover(function() { 
    $('.img_hover_effect_3').fadeIn(500); 
}, function() { 
    $('.img_hover_effect_3').fadeOut(400); 
}); 

ответ

1

Вы можете использовать цикл, чтобы сделать это.

анонимной функции внутри цикла используется для предотвращения поломки Jquery события, попробуйте:

for(var i = 1; i <= 3; i++){ 
    (function(num){ 
     $('.box' + num).hover(function() { 
      $('.img_hover_effect' + (num == 1 ? "" : num)).fadeIn(500) 
     }, function(){ 
      $('.img_hover_effect' + (num == 1 ? "" : num)).fadeOut(400) 
     }) 
    })(i) 
} 

Demo

+1

код хорош. Код + объяснение лучше. –

+0

Я должен согласиться с @FelixKling. Я пытаюсь понять, почему это работает, я знаю, что цикл for добавляет к «.box», но «(num == 1?» ": Num))" part i dont Понимаю. – Steven

+0

@Steven - это тройной оператор: https://msdn.microsoft.com/library/be21c7hw(v=vs.94).aspx. Средство: IF num равно 1 или первому элементу, тогда (нет номера добавления), иначе добавить номер –

0

Как насчет:

function hover(div, overlay) { 
    $(div).hover(function() { 
     $(overlay).fadeIn(500); 
    }, function() { 
     $(overlay).fadeOut(400); 
    }); 
} 

Тогда вы можете назвать его каждый div и наложение следующим образом:

hover('.box1', '.img_hover_effect'); 

Таким образом, у вас есть функция, которая может использоваться для fadeIn 500 мс и fadeOut 400 мс. Если вам понадобятся разные fadeIn- и fadeOut-intervalls, вы можете даже настроить функцию с ними в качестве дополнительных параметров.

0

Try объединения селекторов

$(".box1, .box2, .box3").hover(function (e) { 
    $(".img_hover_effect_" + e.target.className.slice(-1)).fadeIn(500); 
}, function (e) { 
    $(".img_hover_effect_" + e.target.className.slice(-1)).fadeOut(400); 
}); 
+0

jsfiddle http://jsfiddle.net/aLxho5er/ – guest271314

2

Используйте data атрибут .box элементов для хранения селектора target элемента.

Также добавьте один и тот же класс ко всем элементам .boxn, чтобы связать event со всеми элементами.

HTML:

<div class="mybox box" data-target=".img_hover_effect"></div> 
<div class="mybox box2" data-target=".img_hover_effect_2"></div> 
<div class="mybox box3" data-target=".img_hover_effect_3"></div> 

Javascript:

$('.mybox').hover(function() { 
    $($(this).data('target')).fadeIn(500); 
}, function() { 
    $($(this).data('target')).fadeOut(400); 
}); 
Смежные вопросы