Всем привет. Столкнулся с проблемой вызова CSS3 свойства transition скриптом. Код (Text): .modal{ position:fixed; width:100vw; height:100vh; top:0; left:0; z-index:1000; background:rgba(0,0,0,0.0); overflow-Y:scroll; pointer-events:none; opacity:0; transition:background 200ms linear; } .modal_open{ pointer-events:auto; opacity:1; background:rgba(0,0,0,0.3); } Когда я делаю так: Код (Text): var modal_ID = Math.random(); var modal_EL = document.createElement("div"); modal_EL.id = "modal"+modal_ID; modal_EL.className = "modal"; modal_EL.innerHTML = '<div class="modal_window" id="modal_window'+modal_ID+'"><div class="modal_close" id="modal_close'+modal_ID+'">закрыть</div><div class="modal_content" id="modal_content'+modal_ID+'"></div></div>'; document.body.appendChild(modal_EL); modal_EL.className = "modal modal_open"; создается и встраивается в DOM новый DIV, но, как положено в CSS не происходит плавного изменения цвета. Однако, если заменить последнюю строку скрипта на Код (Text): setTimeout(function(){ $("modal"+modal_ID).className = "modal modal_open"; },1); или даже на это Код (Text): setTimeout(function(){ $("modal"+modal_ID).className = "modal modal_open"; },0); то transition срабатывает как положено! Почему так происходит? Ведь я присваиваю новый класс диву уже после его создания и размещения на странице. А разница в вызове инструкции в 0мс дает нужный эффект....
Почему так происходит? Потому что коллбэк сет-таймаут выполняется после построения страницы. А сет-таймаут с нулевым временем гарантированно выполняется в конце работы скрипта. Специфика JS. После создания и размещения? Уверены что DOM уже сформировался к этому моменту? Я вот нет. Вы используете JQuery? Ну так и оберните весь ваш код в Код (Text): $( document ).ready(function() { //Ваш код, который гарантированно выполнится только после построения DOM. });