2015-04-25 4 views
10

Мой элемент имеет transition: transform .5sКак узнать, отображается ли элемент?

тогда имеет отдельный класс: transform: translatex(-100%)

Так что я хотел бы добиться того, что на начальном этапе, элемент позиционируется в левую сторону. В окне onload, Когда элемент визуализируется, я удаляю класс преобразования, и браузер будет анимировать элемент обратно в правильное положение.

Но на самом деле происходит то, что когда страница становится видимой/визуализированной, элемент уже находится в правильном положении. и нет анимации.

Я пробовал setTimeout(function() {}, 0); не работает. Если I setTimeout в течение 1 секунды, он работает, но иногда рендеринг занимает много времени, и я должен установить Timeout на 2 секунды. Но потом иногда он становится быстрым, а 2 секунды - долго ждать.

В целом, я считаю, что это ненадежный или правильный способ сделать это.

Как я могу достичь того, чего хочу, правильный путь?


Edit: Извините, ребята, после попытки собрать демо, я понял, что я не удалял класс у окна OnLoad. Это связано с тем, что мой элемент и его javascript и css загружены с помощью AJAX. Это может произойти до загрузки окна или после загрузки окна.

В любом случае, теперь мой вопрос: что, если окно занимает много времени, чтобы загрузить? Возможно ли, что мой элемент будет отображаться до завершения загрузки окна? Или браузеры отображаются только тогда, когда все окно заканчивает загрузку?

Потому что я хочу как можно скорее анимировать элемент. Таким образом, безопасно ли ждать окна onload, в случае, когда окно занимает много времени для загрузки (изображения и медленное соединение и прочее)?

И если я загружу элемент с помощью AJAX после загрузки окна, могу ли я сразу запустить анимацию, удалив преобразование? Или я должен определить, когда элемент визуализируется?

+7

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

+0

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

+0

Можете ли вы дать нам простую демонстрацию, я думал, что ваш код был выполнен до того, как документ правильно загрузился, но я пропустил часть, которую вы упомянули «В окне onload ». Я отправил ответ (теперь удаленный), говорящий о событиях onload, потому что вы говорите, что «рендер когда-то занимает много времени, а иногда и быстро», и я жестко говорю вам, что вы ссылаетесь на весь контент dom. Если элемент является изображением, вы должны проверить это сообщение http://stackoverflow.com/questions/1977871/check-if-an-image-is-loaded-no-errors-in-javascript – ecarrizo

ответ

4

Вы можете попробовать использовать комбинацию DOMContentLoaded события и requestAnimationFrame. DOMContentLoaded срабатывает после того, как документ был полностью загружен и проанализирован, но до того, как все изображения и другие объекты на странице завершили загрузку. requestAnimationFrame задержит удаление класса до тех пор, пока страница не будет окрашена, поэтому элемент будет правильно переходить.

var box = document.getElementById('box'), 
    showBox = function(){ 
     box.classList.remove('offscreen'); 
    }; 
document.addEventListener("DOMContentLoaded", function(event) { 
    window.requestAnimationFrame(showBox); 
}); 

jsfiddle

+0

Да, ваш метод имеет смысл. Однако, когда я просматриваю jsfiddle в Chrome и Firefox, окно просто появляется, и переход отсутствует. Edit: После перехода из класса «offscreen» в «#box» он теперь работает. Благодаря! – BigName

+0

Хмм отлично работает для меня в Firefox, возможно, я сделал это изменение, но забыл его сохранить. Теперь скрипка обновлена. –

+0

не работает для меня –

0

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

Добавьте к этому JavaScript AJAXed в - обязательно обернуть JavaScript в document.ready:

$(function(){ 
    var giveup = 0; //in case something goes wrong 
    var amirendered = 0; 
    while (amirendered==0){ 
     setTimeout(function(){ 
      if (element.length){ 
       amirendered = 1; 
       $('#myElement').addClass(doTransition); 
      } 
     },200); 
     giveup++; 
     if (giveup>200) amirendered++; //prevent endless loop 
    } 

}); //END document.ready 
+0

Ударяет ли document.ready каждый раз, когда добавляется новый элемент DOM через AJAX, или он запускается только для исходного документа? – BigName

1

Вы должны использовать DOM содержимое, загруженное событие JavaScript

document.addEventListener("DOMContentLoaded", function(event) { 
    console.log("DOM fully loaded and parsed"); 
    }); 

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

+0

Да, мой вызов AJAX был выполнен в «DOMContentLoaded», и поскольку я тестировал на своей локальной машине, AJAX загружался мгновенно и дал мне результат, который я описал в вопросе. Я переместил вызов AJAX на событие «загрузка» окна. – BigName

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