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

Переход CSS без стрельбы

Я создаю элемент DOM (div), добавляя его в DOM, а затем меняя его ширину одним быстрым ударом в javascript. Это теоретически должно приводить к переходу CSS3, но результат прямой от A до B, без перехода между ними.

Если я сделаю изменение ширины через отдельный тестовый клик, все будет работать так, как ожидалось.

Здесь мои JS и CSS:

JS (jQuery):

var div = $('<div />').addClass('trans').css('width', '20px');
$('#container').append(div);
div.css('width', '200px');

CSS (только mozilla за минуту):

.trans {
    -moz-transition-property: all;
    -moz-transition-duration: 5s;
    height: 20px;
    background-color: cyan;
}

Я здесь испортил или "все в одном быстром ударе" не так, как нужно делать?

Вся помощь действительно оценена.

4b9b3361

Ответ 1

Более чистый подход, который не полагается на setTimeout, заключается в том, чтобы прочитать соответствующее свойство css перед его настройкой:

var div = $('<div />').addClass('trans');
$('#container').append(div);
div.css('width');//add this line
div.css('width', '200px');

Работа здесь:

http://jsfiddle.net/FYPpt/144/

Как объясняется в комментариях ниже Лусеро, делать это таким образом необходимо, чтобы заставить браузер вычислять фактическое значение, а не "авто", "наследовать" или подобное. Без фактического значения браузер не будет знать новое значение как изменение предыдущего.

Ответ 2

вот два способа сделать это.

1 - переходы CSS

с помощью setTimeout метод addClass будет запускаться после, а не вместе с предыдущим script, чтобы событие transition срабатывало

пример jsfiddle

JQuery

var div = $('<div class="trans" />');
$('#container').append(div);
// set the class change to run 1ms after adding the div
setTimeout(function() {div.addClass('wide')}, 1); 

CSS

.trans {
    width: 20px;
    height: 20px;
    background-color: cyan;
    -webkit-transition: all 5s ease;
       -moz-transition: all 5s ease;
        -ie-transition: all 5s ease;
         -o-transition: all 5s ease;
            transition: all 5s ease;
}
.wide {
    width: 200px;
}

2 - функция jQuery .animate()

пример jsfiddle

JQuery

var div = $('<div class="trans" />');
$('#container').append(div);
div.animate({'width': '200px'}, 5000); // 5 sec animation

CSS

.trans {
    width: 20px;
    height: 20px;
    background-color: cyan;
}

Ответ 4

В ответ на щедрость:

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

Причина, по которой setTimeout работает в первую очередь, связана с тем фактом, что вы заново завершаете оплату документа, даже если продолжительность установлена ​​на 0. Это не единственный способ вызвать оплату.


Ссылка на скрипку

JavaScript

for (x = Math.ceil(Math.random() * 10), i=0;i<x;i++){
    $('<div />').appendTo($('#container')).addClass('trans');
}

var divs = $('#container div');
var x = divs.eq(Math.ceil(Math.random() * divs.length));
x[0].offsetHeight;
x.addClass('wide');

С помощью этого JavaScript мы произвольно добавляем между 1 и 10 элементами div, а затем выбираем одно из них случайным образом и добавляем класс wide.

Вы заметите нечетную строку JavaScript, а именно x[0].offsetHeight. Это лингвин для всей операции. Вызов offsetHeight инициирует возврат документа без использования setTimeout или запроса значения CSS.

Что такое reflow относительно DOM:

Планировка вычисляет макет страницы. Переплавка элемента пересчитывает размеры и положение элемента, а также триггеры дальнейшего перерасчета на эти элементы детей, предков и элементы, которые появляются после него в DOM. Затем он называет окончательный перекрашивать. Reflowing очень дорого, но, к сожалению, это может быть легко срабатывает.

Поэтому, пожалуйста, будьте осторожны в том, как вы используете эти функции. Не слишком большая проблема с большинством современных браузеров (поскольку jQuery известен тем, что уволил несколько перекопов), но все же что-то нужно рассмотреть, прежде чем добавлять что-то вроде этого решения на всем своем веб-сайте.


Важное примечание: Это не более или менее эффективно, чем вызов setTimeout. Это не волшебное решение пули, и оно делает то же самое под капотом.


Здесь соответствующий CSS для ссылки:

.trans {
    width: 20px;
    height: 20px;
    background-color: cyan;
    -webkit-transition: all 5s ease;
       -moz-transition: all 5s ease;
         -o-transition: all 5s ease;
            transition: all 5s ease;
}

.trans.wide {
    width: 200px;
}

Ответ 5

как спрашивал @onetrickpony, что, если все правила находятся в файле CSS и не должны добавляться в JS-функцию.

Основываясь на ответе Торина Финнемана, только с небольшим изменением:

Добавьте дополнительный класс, где определены правила: new-rules

var div = $('<div class="trans" />');
$('#container').append(div);

var div = $('<div />').addClass('trans');
$('#container').append(div);
div.height();
div.addClass('new-rules');

в вашем CSS есть предопределенный класс:

.trans.new-rules {
    width: 200px;
    background: yellow;
}

теперь при изменении CSS не нужно покалывать с JS. Измените его в CSS файле на new-rules:)

http://jsfiddle.net/FYPpt/201/

Ответ 6

var div = $('<div />');

$('#container').append(div);

div.css('width', '20px').addClass('trans', function() {
   div.css('width', '200px') 
});

Создает новый элемент DIV и добавляет класс 'trans' к этому элементу, чтобы запустить переход CSS