CSS-переход не выполняется

В настоящее время я пытаюсь анимировать два элемента div в контейнере карусельного типа. Вот разметка в том виде, в каком она отображается в DOM:

<div id="transitioner" style="width: 2880px; height: 775px; left: -1440px; ">
    <div id="view1" class="view active" style="width: 1440px; height: 775px; ">
        <header>
            <h1>This is page 1</h1>
        </header>
        <article style="height: 699px; ">
            <p>Tap me anywhere to go to the next view</p>
        </article>
        <footer>
            <p>This is my footer</p>
        </footer>    
    </div>
    <div id="view2" class="view" style="width: 1440px; height: 775px; ">
        <header style="">
            <h1>This is page 2</h1>
        </header>
    </div>
</div>

А вот CSS для элемента #transitioner:

#transitioner {
    position: absolute;
    top: 0;
    -webkit-transition: all 0.2s ease-in-out;
}

Наконец, JS:

function GotoView(view)
{
    var roller = $('<div id="transitioner" />');
    roller.width((viewport.width * 2)).height(viewport.height);
    var current = $('.view.active').clone(true, true);
    $('.view.active').remove();
    current.prependTo(roller);

    var new_view = view.clone(true, true);
    view.remove();
    new_view.appendTo(roller);

    roller.appendTo($('body'));
    $('body').addClass('transitioning');
    //window.setTimeout(function() { roller.css({ left: 0 - viewport.width }) }, 2000);
    roller.css({ left: 0 - viewport.width });
}

Я обновляю левую позицию содержащего div (т. е. #transitioner), но пока я не вставлю setTimeout, переход CSS не выполняется, а содержащий div просто «перескакивает» к желаемому новому смещению left.

Я собрал jsFiddle, чтобы вы могли увидеть симптомы > http://jsfiddle.net/XPUPQ/

Мой вопрос: что это происходит, и если не использовать JS setTimeout(), есть ли способ обойти это?


person BenM    schedule 19.07.2012    source источник


Ответы (1)


Вам нужно вызвать перекомпоновку браузера

http://jsfiddle.net/XPUPQ/1/

Вы можете сделать это, например, с $("body")[0].offsetWidth;.

На самом деле это законная техника, которую использует бутстрап Twitter например

person Esailija    schedule 19.07.2012
comment
Почему я говорю, например, слишком много - person Esailija; 20.07.2012
comment
Звучит лучше, чем "перкеле". - person Jezen Thomas; 20.07.2012
comment
Хе-хе, спасибо за помощь, никогда раньше не сталкивался с этой ошибкой и не знал, что это вызывает переполнение браузера. Есть идеи, зачем нам это нужно? - person BenM; 20.07.2012
comment
@BenM Потому что браузеры слишком сильно оптимизируют: P Может быть, это поможет, хотя stackoverflow.com/a/6496557/995876 - person Esailija; 20.07.2012