Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Время окончательного применения свойств CSS

#jquery #css #css3 #анимация #css_animation


Я обнаружил, что некоторые свойства CSS (думаю, в первую очередь те, которые отвечают
за позиционирование и отображение элементов) применяются с небольшой задержкой (часто
способной поломать код).

В моём случае это свойство opacity при создании слайд-шоу. пример я максимально упростил,
убрал классы и всё лишнее, чтобы минимизировать код.

Следующая функция делает чтобы элемент исчез (моментально), а затем появился (плавно).

function fadeIn() {
    var $el=$('div');
    $el.css('transition', '').css('opacity', '0').delay(13)
    .queue(function(next) {
        $(this).css('transition', 'all 2s').css('opacity', '1');
        next(); 
    });
}


Всё работает, но delay(13) выглядит как грязный хак (в хроме достаточно delay(0),
но в Firefox нужно не меньше 13). А на более медленном ПК нужно будет задержку ещё
больше ставить?

Думаю, что происходит следующее: при недостаточно большом delay применение opacity
не успевает произойти - и тут же применяется transition (и на моментальном исчезновении
можно ставить крест).

Существует ли какое-то красивое решение проблемы? чтобы выполнить определённый код
только после того, как свойства CSS "по-настоящему" применятся к элементам?
    


Ответы

Ответ 1



Когда ты пытаешься менять стили, браузер по возможности оптимизирует перерасчёт и высока вероятность, что набор последовательных действий будет применён единовременно. Для того, чтобы заставить браузер форсированно применить изменения, нужно получить значение ширины или высоты элемента. Вот пример: https://jsfiddle.net/whpmhwzz/4/ ~function () { var demo = document.getElementById("demo"); document.getElementById("to-0").addEventListener("click", function() { demo.style.width = 0; }); document.getElementById("to-100").addEventListener("click", function() { demo.style.width = "100%"; }); document.getElementById("try-force-to-0").addEventListener("click", function() { demo.style.transition = "none"; demo.style.width = "0"; demo.style.transition = ""; // IE fails to assign null }); document.getElementById("force-to-0").addEventListener("click", function() { demo.style.transition = "none"; demo.style.width = "0"; getComputedStyle(demo).transition; // No recalculation in FF and IE demo.style.transition = ""; }); document.getElementById("force-to-0-again").addEventListener("click", function() { demo.style.transition = "none"; demo.style.width = "0"; getComputedStyle(demo).width; demo.style.transition = ""; }); document.getElementById("force-to-0-height").addEventListener("click", function() { demo.style.transition = "none"; demo.style.width = "0"; getComputedStyle(demo).height; demo.style.transition = ""; }); document.getElementById("force-to-0-fail").addEventListener("click", function() { demo.style.transition = "none"; demo.style.width = "0"; getComputedStyle(demo); // No recalculation demo.style.transition = ""; }); }(); p { margin-top: 60px; } div { width: 100%; transition: width 3s linear; height: 2em; background: red; }



Ответ 2



Вы немножко не правильно поняли. Задержка отрисовки страницы происходит из-за тега script, то есть из-за javascript. Браузер, дойдя до такого тега, останавливает отрисовку DOM и ждёт полной загрузки js-файла. Именно поэтому правильным тоном является конкатенировать js-файлы в один и размещать тег script в самом конце body. Полная загрузка и отрисовка страницы (картинки, css и т.д.) происходит после события load, а не ready: $(window).load(function() { alert("window is loaded"); });

Комментариев нет:

Отправить комментарий