Как узнать, отображается ли элемент?

Мой элемент имеет transition: transform .5s

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

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

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

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

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

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


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

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

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

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

Ответ 1

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

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

jsfiddle

Ответ 2

Вы должны использовать DOM Content Loaded событие javascript

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

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

Ответ 3

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

Добавьте это в javascript AJAXed in - обязательно оберните 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