2016-10-08 3 views
0

У меня есть меню для наведения, которое должно иметь display:none, пока оно не используется, поэтому вы можете щелкнуть предметы под ним.Блок отображения Vs. Непрозрачность

Когда придет время открыть его, я поворачиваю дисплей на встроенный блок; а затем исчезают в непрозрачности с помощью перехода CSS - с помощью этого кода:

elm.onmouseover = function(){ 
    menu.style.display = "inline-block"; 
    menu.style.opacity = 1; 
}; 

Когда этот код мчит, элемент выскочит прямо без замирания.

Моя теория о том, что Javascript работает так быстро, что элемент не изменился тип дисплея по времени изменения непрозрачности пинает в, так что я сделал это:

elm.onmouseover = function(){ 
    menu.style.display = "inline-block"; 
    for (var i=1000...; i--;); 
    menu.style.opacity = 1; 
}; 

Теперь явно ждет; однако, по-прежнему появляется без выцветания.

Я вошел в мою консоль и побежал:

menu.style.display = "inline-block"; 
menu.style.opacity = 1; // run 
> return message 

и не работал; Однако, когда я разделил заявления на два, как этот

menu.style.display = "inline-block"; // run 
> return message 

menu.style.opacity = 1; // run 
> return message 

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

В чем корень этого поведения? Я озадачен.

+0

Ну, если вы не на самом деле написал функцию, которая делает анимацию, и они может быть несколько сложнее с таймерами и всем, или вы используете анимацию CSS, просто устанавливая непрозрачность для чего-то другого, совсем не исчезнет, ​​просто ... подождите ... изменяет непрозрачность. – adeneo

+0

У меня obviusly есть переходы на месте ... –

+2

Это не очевидно, так как мы не можем их видеть. – adeneo

ответ

0

DOM только обновляется, как только весь ваш код заканчивается, потому что он синхронизируется с основной нитью.

Если вы просто подождать 1мс с SetTimeout, что вы ожидаете, будет работать:

elm.onmouseover = function() { 
    menu.style.display = 'inline-block'; 
    setTimeout(function() { 
     menu.style.opacity = 1; 
    }, 1); 
} 

https://jsfiddle.net/vtd3y5ug/

+0

Спасибо за фактический ответ, теперь это смысл. Однако я использовал вместо этого «видимость», как получилось, что это работает? Он используется точно так же, как и обновления. –

+0

См. Http://stackoverflow.com/questions/133051/what-is-the-difference-between-visibilityhidden-and-displaynone Дисплей: none, означает, что элемент отсутствует на странице. Видимость: скрытая, означает, что элемент находится на странице, но не отображается. –

-1

Вы не можете использовать display: none с opacity для эффекта затухания.

Вместо display: none и display: inline-block использовать visibility: hidden и visibility: visible.

+0

Я не оживляю дисплей, а непрозрачность. –

+0

Я думаю, что вам не хватает точки вопроса –