2014-07-15 5 views
1

Я создал меню с < divs> и использую мышь для мыши, чтобы добавить и удалить язык (например, описание каждого значка меню). Проблема, с которой я сталкиваюсь, - это когда я нависаю над языком, он выполняет (правильно) функцию mouseout для кнопки и удаляет язык.jQuery menu slide hover glitch

Как я могу предотвратить это? Спасибо!

http://jsfiddle.net/QZ75D/

$('#wrapper').on('mouseover', '.1, .2, .3, .4, .5', function(){ 
    var tongue = '<div class = "tongue">'+$(this).attr('value')+'</div>'; 
    $(tongue).appendTo($(this)).animate({width:"toggle"}); 
}); 
$('#wrapper').on('mouseout', '.1, .2, .3, .4, .5', function(){ 
    var that = $(this); 
    $('.tongue').animate({width:"toggle"},function(){ 
     that.children('.tongue').remove(); 
    }); 
}); 

Bonus: Текст также зависит от ширины анимации. Любой способ исправить это?

+0

попробуйте добавить условное заявление. если наведите курсор мыши, не удаляйте ... что-то вроде этого –

+0

или возьмите другой подход. На mouseover, show() .tongue, а затем скройте(), когда вы наведите указатель мыши на тестовую панель. –

+0

Я пробовал это условие и создал некоторые причудливые эффекты. – user3822370

ответ

1

DEMO

Вы можете сделать следующее, чтобы сделать ваш код работать, как ожидалось.

  • Используйте mouseleave событие вместо mouseout этого будет убедиться, что дочерние элементы определяются как часть родительского элемента, и это событие только срабатывает, когда отпуск мыши элемент и его дочерний элемент.

  • Аналогично смена mouseover событий с mouseenter событие будет активироваться только в том случае, если курсор вводит элемент или его дочерний элемент.

  • Чтобы избежать разворачивания текста, используйте white-space: nowrap; на .tongue классе.

JS:

$('#wrapper').on('mouseenter', '.1, .2, .3, .4, .5', function() { 
    var tongue = '<div class = "tongue">' + $(this).attr('value') + '</div>';   
    $(tongue).appendTo($(this)).animate({ 
     width: "toggle" 
    }); 
}); 
$('#wrapper').on('mouseleave', '.1, .2, .3, .4, .5', function() { 
    var that = $(this); 
    $('.tongue').animate({ 
     width: "toggle" 
    }, function() { 
     that.children('.tongue').remove(); 
    }); 
}); 


P.S: Старайтесь избегать имен классов как .1, .2, .3 они могли бы работать в Java-сценарии, но они не будут работать в CSS.

CSS не позволяет имена классов, которые начинаются с цифр, вместо этого вы можете попробовать .n_1, .n_2, .n_3 ....

+0

Я знаю, извините. Я просто написал это для скрипки. – user3822370

+0

Также спасибо. Любая идея, как сделать так, чтобы во время воспроизведения анимации ее нельзя было прервать? EG, в то время как язык скользит, вы можете навести на него курсор, и он волнуется. – user3822370

+0

Мы можем добавить условия и определить, выполняется ли анимация, чтобы избежать языкового волнения, и я дам ему попробовать, как только я получу некоторое время. –

1

Вам не нужно JavaScript для этого, в зависимости от уровня необходимой поддержки.
Я сделал пример, в котором я немного изменил структуру HTML, чтобы сделать его немного более семантическим IMO.
Анимация не будет работать в старом IE, но функциональность будет (IE8).

HTML:

<ul class='wrapper'> 
    <li class="button">Test</li> 
    <li class="button">Test</li> 
    <li class="button">Test</li> 
    <li class="button">Test</li> 
    <li class="button">Test</li> 
</ul> 

CSS:

.wrapper { 
    width:50px; 
    margin-left:40%; 
    list-style: none; 
    counter-reset: button-number 
} 

.button { 
    counter-increment: button-number; 
    width:50px; 
    height:50px; 
    background-color:#ccc; 
    float: left; 
    cursor:pointer; 
    position: relative; 
} 

.button:before, .button:after { 
    content:"Button number " counter(button-number); 
    width:300px; 
    height:50px; 
    position:absolute; 
    right: 50px; 
    visibility: hidden; 
} 

.button:before { 
    -webkit-transform: scaleX(0); 
    -webkit-transform-origin: left; 
    transform: scaleX(0); 
    transform-origin: left; 
    background-color:#000; 
    color:#fff; 
    -webkit-transition: -webkit-transform .4s, visibility 1s; 
    transition: transform .4s, visibility 1s; 
} 

.button:hover:before { 
    visibility: visible; 
    -webkit-transform: scaleX(1); 
} 

.button:hover:after { 
    width: 300px; 
} 

jsfiddle

Примечания:

  • The: после того, как элемент есть, чтобы предотвратить "язык" от исчезновения, если мышь оставляет им Слева направо.
  • Анимация transform вместо width лучше для производительности (элемент не перерисовывается) и исключает странную обертку текста во время анимации.
+0

Отличный ответ. В конечном счете, есть достаточно вещей, которые не работают на IE9 и ниже, что мне придется переписать весь мой сайт. – user3822370

+0

Это зависит от вас и от того, на кого вы нацелились. Я думаю, что пользователи IE9 составляют около 8%, а IE8 - 5%, на момент написания этого. Даже они получат функциональность, а не анимацию, из-за «видимости». – climbinghobo