Проблема с выпадающим меню jQuery :)

#jquery #html #css

#jquery #HTML #css

Вопрос:

Я работаю над своим собственным выпадающим меню, вот код, отображающий скрытые подменю:

 jQuery('ul li').hover(function(){
  jQuery(this).children('ul').stop().show().animate({ opacity: 1 });
}, function() {
  jQuery(this).children('ul').stop().animate({ opacity: 0,});
});  
  

Все работает нормально, но подменю отображаются не только при наведении курсора мыши на родительскую ссылку, но и при наведении курсора на область, которую занимают невидимые подменю.

Я считаю, что ul скрыт, но li нет, так что (‘ul li’).наведение вызывает их. Как этого избежать? Это зло, особенно с многоуровневыми подменю.

Пример: http://jsfiddle.net/6t523 / (попробуйте навести курсор на красный квадрат).

[править]

Боже мой, я заметил, что сначала при наведении курсора мыши на красный квадрат ничего не происходит. Я не СКРЫВАЮ элементы, а только увеличиваю непрозрачность до 0 с помощью jQuery. Аааффффф! 🙂

Тогда возникает вопрос — как их элегантно скрыть? Будет ли мой код работать в IE6 / IE7 / IE8?

Комментарии:

1. Не нужно изобретать велосипед. Попробуйте superfish ( users.tpg.com.au/j_birch/plugins/superfish ) Сохраните свои способности ниндзя для более важных дел.

Ответ №1:

Как насчет затухания:

 $('ul li').hover(function() {
    $(this).children('ul').stop().fadeIn();
}, function() {
    $(this).children('ul').stop().fadeOut();
});
  

Живая демонстрация: http://jsfiddle.net/simevidas/6t523/2 /

Ответ №2:

начните с начального стиля «display: none», затем, перед тем как исчезнуть, вы можете .show(), а после исчезновения вы можете .hide() .

в качестве альтернативы вы можете использовать .fadeIn() и .fadeOut (), которые делают именно это за вас.

Ответ №3:

Вы могли бы добавить отображение: блок; при наведении курсора мыши и отображать: нет; еще. вот так:

 jQuery('ul li').hover(function(){
    jQuery(this).children('ul').children('li').css('display','block')
  jQuery(this).children('ul').stop().show().animate({ opacity: 1 });
}, function() {
  jQuery(this).children('ul').stop().animate({ opacity: 0,},jQuery(this).children('ul').children('li').css('display','none'));
});