2014-09-25 5 views
2

Я хотел бы сделать DIV появляется с эффектом постепенного изменения:Непрозрачность выцветанию работает только тогда, когда defered

<div id="toto" style="background:red;width:200px;height:200px"></div> 

Самый простой способ я знаю, с свойствами CSS «переход» и «непрозрачности». На мой взгляд, этот код должен работает (но это не делает):

document.getElementById("toto").style.opacity = 0; 
document.getElementById("toto").style.transition = "all 5s ease"; 
document.getElementById("toto").style.opacity = 1; 

(см по адресу: http://jsfiddle.net/87q44ysg/1/#share)

Кто-нибудь знает, почему ?? Я нашел этот хак, но я не могу объяснить, почему это работает только в этом случае ...:

document.getElementById("toto").style.opacity = 0; 
window.setTimeout(function(){ 
    document.getElementById("toto").style.transition = "all 5s ease"; 
    document.getElementById("toto").style.opacity = 1; 
}, 1); 

(см по адресу: http://jsfiddle.net/36009t1x/#share)

Спасибо!

+2

Почему бы не установить непрозрачность на div, чтобы начать или установить ее в css? – Huangism

+0

Почему вы не используете fadeIn() из jQuery lib? – Loenix

+0

@Loenix: потому что я не могу добавить jQuery в свое приложение – Klitzounet

ответ

2

Первый случай

document.getElementById("toto").style.opacity = 0; 
document.getElementById("toto").style.transition = "all 5s ease"; 
document.getElementById("toto").style.opacity = 1; 

Это происходит потому, что каждая строка выше JavaScript вызывается сразу, и это похоже на установку этих правил CSS:

#toto { 
    opacity: 0; 
    transition: all 5s ease; 
    opacity: 1; 
} 

, как вы можете увидеть второй вхождение непрозрачности будет переопределять значение 0, поэтому в результате это будет 1.

#toto { 
    transition: all 5s ease; 
    opacity: 1; 
} 

В этом случае анимации нет, только статическая непрозрачность, которая не изменится.

Второго случай

document.getElementById("toto").style.opacity = 0; 
window.setTimeout(function(){ 
    document.getElementById("toto").style.transition = "all 5s ease"; 
    document.getElementById("toto").style.opacity = 1; 
}, 1); 

В этом случае сначала установите непрозрачность до 0. А после 1мса изменить правила CSS, так что изменение непрозрачности от 0 до 1. Поэтому анимация была запущена.

С уважением.

0

Вам следует избегать установки стилей в простой Javascript и переместить это в CSS. Что касается вашего вопроса, он не стандартизирован, и каждый браузер может делать все, что думает разработчик, правильно. Вероятно, свойство transition на самом деле не применяется до тех пор, пока не перепланируется или что-то в этом роде. См. Этот вопрос для более детального тестирования: Clean way to programmatically use CSS transitions from JS?

-1

Это прекрасно работает, это помогает?

setTimeout(function() {document.getElementById("toto").style.opacity = "1";},500);
#toto { 
 
    transition: opacity 5s; 
 
    opacity: 0; 
 
}
<div id="toto" style="background:red;height:200px"></div>

+0

Мне пришлось добавить тайм-аут для фрагмента здесь, но вам это не нужно. – Mandera

+0

Да, интересный комментарий, но я предпочитаю либо полное JS (без CSS), либо полное CSS (просто переключение класса css). Thx в любом случае! – Klitzounet

0

Вы должны играть с тайм-аутов в этом.

Попробуйте это: DEMO

Play со значениями, если вы хотите, чтобы достичь желаемого эффекта.

Вы можете добиться того же результата с помощью setInterval, но я предпочитаю setTimeout в этом.

/*Fades in an element. Params: A DOM Element*/ 
    var fade = function (node) { 
    var level = 0; 
    var step = function () { 
     node.style.opacity = level; 
     if (level < 1) { 
     level += 0.1; 
     setTimeout(step, 50); //increase the value by 0.1 every 50ms 
     } 
    }; 
    setTimeout(step, 0); //calls immidiatelly (4ms after) 
    }; 
    fade(document.body); 

Cheers!

+0

Мне не нравится это решение, переход CSS3 здесь, чтобы выполнить эту работу! – Klitzounet

+0

Хорошо, я согласен с тем, что с помощью CSS эта единица работы - легкая задача. Но вопрос в том, как решить эту проблему. Также для старых браузеров переходы/анимации CSS3 бесполезны. Один хороший способ - использовать CSS3 для анимации для современных браузеров и jQuery в качестве резервного механизма (или чистого JS, если вы не хотите добавлять jQuery, но это будет больно, jQuery уже проверен кросс-браузером) – gdyrrahitis

Смежные вопросы