views:

35

answers:

1

I'm trying to animate a dynamically created html element with CSS3 transitions.

I want the animation to start just before the element is created.
For these i create a class that set the original position of the element and then I set the target position by the jquery css() method

But the new element it just apears in the target position without any transition.

If I use a setTimeout of 0ms to set the new css value it work.

There is something I'm doing wrong? or is a limitation? I don't think I should need to use the setTimeout workaround.

Thanks!

UPDATE: Here is a link with the code running on jsfiddle.net for you to experiment. http://jsfiddle.net/blackjid/s9zSH/

Here is a fully working example code

<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.4.3.min.js"&gt;&lt;/script&gt;
        <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>
+1  A: 

Why don't you use the jQuery .animate function instead? http://api.jquery.com/animate/

The .css won't work for animation as it simply sets the CSS there and then.

laurencek
I know that .css won't animate, but if I set the -webkit-transition: all 1s ease-in property in the css, it should animate the change on the left position. I want to give CSS3 support whenever posible.
blackjid
That's fair enough, but you're simply specifying a webkit specific CSS3 rule. So it is even less general than: -moz-transition, -webkit-transition, -o-transition.
laurencek
Yes I know. I made that code snippet exclusively to post it in the question so I only specify the webkit specific CSS3 property to keep it simple.
blackjid