Подтвердить что ты не робот

Переход CSS3 к динамически созданным элементам

Я пытаюсь оживить динамически созданный элемент html с переходами CSS3.

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

Но новый элемент он просто появляется в целевой позиции без какого-либо перехода.

Если я использую setTimeout 0ms для установки нового значения css, он работает.

Есть что-то, что я делаю неправильно? или это ограничение? Я не думаю, что мне нужно будет использовать обходное решение setTimeout.

Спасибо!

UPDATE. Вот ссылка на код, запущенный на jsfiddle.net, для экспериментов. http://jsfiddle.net/blackjid/s9zSH/

UPDATE Я обновил пример с помощью решения в ответе.
http://jsfiddle.net/s9zSH/52/

Вот полностью рабочий пример кода

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
        <script type="text/javascript">

        //Bind click event to the button to duplicate the element
        $(".duplicate").live("click", function (e){
            var $to = $("#original .square").clone()
            $("body").append($to);
            if($(e.target).hasClass("timeout"))
                //With setTimeout it work
                setTimeout(function() {
                    $to.css("left", 200 + "px");
                },0);
            else if($(e.target).hasClass("notimeout"))
                // These way it doesn't work
                $to.css("left", 200 + "px");
        });

        </script>
        <style type="text/css">
        .animate{
            -webkit-transition: all 1s ease-in;
        }
        .square{
            width:50px;
            height:50px;
            background:red;
            position:relative;
            left:5px;
        }
        </style>
    </head>
    <body>
        <div id="original">
            <div class="square animate"></div>
        </div>

        <button class="duplicate timeout">duplicate with setTimeout</button>
        <button class="duplicate notimeout">duplicate without setTimeout</button>
    </body>
</html>
4b9b3361

Ответ 1

Вам не нужно использовать таймаут. Таймаут работает, потому что страница переплавляется между стилями настройки. Reflowing пересчитывает стили. Если вы не пересчитываете стили, второй стиль просто перезаписывает первый. Это реальная проблема.

Скорее всего, вы можете просто:

obj.className = style1;
window.getComputedStyle(obj).getPropertyValue("top");
obj.className = style2;

Если вы анимации нескольких объектов, вам нужно только "накачать" калькулятор стиля один раз:

obj.className = style1;
obj2.className = style1;
obj3.className = style1;
window.getComputedStyle(obj).getPropertyValue("top");

obj.className = style2;
obj2.className = style2;
obj3.className = style2;

Протестировано в chrome12 на mac