Для эргономики меню мыши требуется небольшая задержка при переходе от главного меню к подменю, поэтому подменю не закрывается до того, как мышь попадет туда. (Как гласит вопрос.)
Но вам также потребуется задержка перед открытием меню - и во избежание раздражающей активации "эстакады", и для уменьшения общего количества случайного переключения с sub1 на sub2 во время выход из главного меню.
Итак, коду вопроса нужно:
hover
над подменю ul
элементов.
stop
для остановки анимации при изменении выбора мыши.
- Сбрасываемый таймер, управляющий как открытием, так и закрытием.
См. Демонстрацию на jsFiddle .
Собираем все вместе:
$("#buttons li.one, #buttons li.two").hover ( function () { MenuOpenCloseErgoTimer (
100,
function (node) {
var subnav = 'ul.snav-' + $(node).attr ('class');
$("#snav ul").hide ();
$("#snav").stop (true, true).slideDown ('fast').addClass ("open").find (subnav).show ();
},
this
); },
function () { MenuOpenCloseErgoTimer (
200,
function () {
$("#snav").stop (true, true).slideUp ('fast').removeClass ("open").find ('ul').hide ();
}
); }
);
$("div#snav ul").hover ( function () { MenuOpenCloseErgoTimer (
0,
function () {
$("#snav").stop (true, true).slideDown ('fast').addClass ("open");
$(this).show ();
}
); },
function () { MenuOpenCloseErgoTimer (
200,
function () {
$("#snav").stop (true, true).slideUp ('fast').removeClass ("open");
$("#snav ul").hide ();
}
); }
);
function MenuOpenCloseErgoTimer (dDelay, fActionFunction, node) {
if (typeof this.delayTimer == "number") {
clearTimeout (this.delayTimer);
this.delayTimer = '';
}
if (node)
this.delayTimer = setTimeout (function() { fActionFunction (node); }, dDelay);
else
this.delayTimer = setTimeout (function() { fActionFunction (); }, dDelay);
}
Обратите внимание на дополнительные операции, необходимые для #snav ul
, для очистки после прерванных перестановок между подменю.