2017-01-13 3 views
0

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

Пример:

<style> 
.box { 
    width: 100px; 
    height: 100px; 
    transition: width 0.5s, height 6s; 
} 

.animate { 
    width: 400px; 
    height: 400px; 
} 
</style> 

<div class="box"></div> 

<script> 

    // I want to run some code after both the width and height transitions 
    // are complete 

    // Listening for transitionend events will fire on every transition 
    // that ends. So in this case, both width and height. Assume I don't 
    // know how many properties are being transitioned. 
    $('.box').on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function(ev) { 
     // ... 
    }); 
    $('.box').addClass('animate'); 

</script> 
+0

Создать список, добавляя переходы при прослушивании для 'transitionstart', а затем удалить их, когда' transitionend' пожары ... –

+0

можно считать как уродливый, но для того, что мне нужно (не придирчивое к времени реакции), было идеально, потому что я мог бы его обобщить: встроенная функция плагина JS, относительно медленная (250 мс), которую можно вызвать для просмотра одного или нескольких свойств CSS, чтобы увидеть, все еще меняются (сохраняют значения) и бросают множественные обратные вызовы – Kaddath

+0

@MikeMcCaughan выглядит как переходный старт еще не в спецификации, а поддержка x-браузера не такая уж горячая. Мне нравится шаблон, который вы представили, но только если бы я мог последовательно выполнять x-браузер. –

ответ

0

Вы можете узнать количество переходов, а затем сосчитать их вниз.

var box = document.getElementsByClassName('box')[0]; 
numTransitions = getComputedStyle(box).transition.split(',').length; 

Вид хрупким, если ваш CSS не является чистым, но, может быть, у вас есть контроль над этим

+0

Ваш пример не будет работать в случае, если некоторые из изменяемых свойств не изменяются. Например, переход: цвет 1s, ширина 2s, высота 3s. Затем добавляется класс, который меняет ширину и высоту. Ваше решение становится все ближе. –

+0

Вы можете посмотреть, какие свойства будут переходить, просмотрев определение класса (при условии, что вы используете класс) через CSSOM. –

+0

Я думаю, вопрос в том, как сильно вам нужно точно знать, когда заканчивается переход. В отличие от, скажем, просто установки тайм-аута 1 с? –

0

Да, это возможно, но немного сложнее. Вы извлекаете продолжительность (и задержку) из свойств перехода и находите ту, которая имеет наибольшее значение. Поскольку transitionEnd имеет значение свойства value (transition), теперь вам нужно сравнить это только с извлеченным свойством. Example is here. (помните, что вы должны ждать в течение 6 секунд, пока что-то не происходит)

function getMaxTransitionDuration(el) { 
    // small helper to extract the values 
    function extract(str) { 
     return str 
      .replace(/[A-Z]/gi, "") 
      .split(", ") 
      .map(parseFloat); 
    }; 
    // get the current style 
    var style = getComputedStyle(el); 
    // get all transition properties 
    var props = style.transitionProperty.split(", "); 
    // we need delay and duration 
    var delays = extract(style.transitionDelay); 
    var durations = extract(style.transitionDuration); 

    // combinate delay and duration 
    var totals = durations.map(function(v, i) { 
    return v + delays[i]; 
    }); 

    // find the property with longest value 
    var max = totals[0]; 
    var maxIndex = 0; 
    for (var i = 1; i < totals.length; i++) { 
    if (totals[i] > max) { 
     maxIndex = i; 
     max = totals[i]; 
    } 
    } 
    // and return this property 
    return props[maxIndex]; 
} 

$('.box').on('transitionend', function(ev) { 
    var lastProp = getMaxTransitionDuration(this); 
    if (ev.originalEvent.propertyName == lastProp) { 
     // here we are..... 
    } 
}); 

$('.box').addClass('animate'); 
+0

Бонусные баллы за учитывая задержку перехода! Тестирование кода сейчас. –

+0

Ваш пример не работает в случае, если некоторые из изменяемых свойств не изменяются. Например, переход: ширина 1s, высота 2s, цвет 3s. Затем добавляется класс, который меняет только ширину и высоту. В комментариях к другим ответам мы рассмотрели возможность поиска свойств, которые изменил класс. Это оказывается довольно сложным! Внимательно оценивайте детали в своем ответе. Если вы хотите добавить примечание о прецеденте, я отметил выше, где он не будет работать, я могу его принять. Или, если вы хотите принять удар по решению этой части, пойдите для этого! –

+0

@LokeshDhakar Я понял, я играл с кодом, придумал это: https://jsfiddle.net/mzrc3tm8/4/. Кажется, что это работает до тех пор, пока вы добавляете класс, но не сработаете, если вы его удалите, а его станет больше. Более простой подход может заключаться в использовании некоторых атрибутов данных, содержащих информацию, с которыми будут обрабатываться свойства. Не полностью общий, но, возможно, более удобный, чем сканирование сложной таблицы стилей, которая возможна, но дорогостоящая и должна выполняться вне этого обработчика событий. –

Смежные вопросы