2013-04-13 19 views
5

Mam element Flash na mojej stronie, a ponieważ Flash jest zwykle dość delikatny, musi być umieszczony na wartościach całkowitoliczbowych (patrz Flash webcam access request prompt unresponsive, jeśli chcesz uzyskać szczegóły).Wykryj ruch elementu HTML spowodowany przejściami CSS

ja to osiągnąć przez owijanie object w div ustawienie position:absolute na object i jQuery ustawić left i top zaokrąglonym offset z zawierającego div. To był łyk, tutaj jest w formie kodu:

<div id="wrapper"> 
    <object id="flash" blah style="position:absolute"> 
     <!-- blah --> 
    </object> 
</div> 
<script> 
    function update(){ 
     var p=$('#wrapper').offset(); 
     $('#flash').css({'left':Math.round(p.left),'top':Math.round(p.top)}); 
    } 
    $(document).ready(function(){ 
     $(window).resize(update); 
     update(); 
    }); 
</script> 

I to wszystko działa świetnie (jeśli powyższy kod ma błąd, to tylko od je ścinać)

że zaktualizuje pozycji, gdy przeglądarka zmienia rozmiar i można ją łatwo zaktualizować, gdy pozycja zostanie zmieniona przez niektóre skrypty JavaScript, ale strona używa również CSS transition-duration do animowania niektórych zmian. Jak mogę to wykryć? Jako minimum chciałbym wykryć, kiedy następuje przejście, które wpływa na obiekt, i wiedzieć, kiedy to się skończy. Idealnie chciałbym wiedzieć, jak złapać dowolny ruch (na przykład spowodowany zmianami rozmiaru czcionki lub ładowaniem obrazów).

+1

jest kilka zdarzeń dotyczących przejść, ale nie wiem, jak przydatne są one –

+1

Możesz wykryć, kiedy przejście zostało zakończone, ale nadal nie wykrywa, kiedy początek przejścia, a przynajmniej nie jest coś, o czym jestem świadomy. Wyszukaj przejściowe wydarzenie –

+0

@ @asty dzięki, to jest początek. To przynajmniej kończy się teraz poprawnie. Nadal chciałbym ustawić go w czasie animacji, jeśli to możliwe. Do przyszłych czytelników: '.on ('transitionend webkitTransitionEnd oTransitionEnd otransitionend', update);' – Dave

Odpowiedz

0

Możesz sprawdzić to skrzypce: http://jsfiddle.net/DpYNm/ Loguje się, gdy ruch zaczyna się i kończy, nie jestem pewien, czy to rozwiązanie twojego problemu, ale może ci to pomóc we właściwym kierunku!

function checkForMove() { 
if ($('#testDiv').prop('user_default_width') === undefined) { 
    $('#testDiv').prop('user_default_width', $('#testDiv').width()); 
    $('#testDiv').prop('user_is_moving', false); 
} 

if ($('#testDiv').width() != $('#testDiv').prop('user_default_width') && !$('#testDiv').prop('user_is_moving')) { 
    $('#log').html($('#log').html() + "Move started<br/>"); 
    $('#testDiv').prop('user_is_moving', true); 
} 
if ($('#testDiv').width() == $('#testDiv').prop('user_default_width') && $('#testDiv').prop('user_is_moving')) { 
    $('#log').html($('#log').html() + "Move ended<br/>"); 
    $('#testDiv').prop('user_is_moving', false); 
} 

setTimeout(checkForMove, 1); 

}

checkForMove(); 

checkForMove nazywa co ms aw pierwszym nazywają go uratuje szerokość div do nieruchomości. Za każdym razem, gdy się zmienia (początek przejścia), loguje się i zapisuje właściwość pomocnika, aby upewnić się, że nie zaloguje się ponownie, dopóki przejście nie powróci do domyślnego rozmiaru. Jestem pewien, że możesz zmienić tę część, aby dopasować ją do swoich potrzeb! :)

+0

Każdy milisekunda ?! Crikey! W każdym razie wiem, że mogę użyć interwału (powinieneś użyć 'setInterval' not'setTimeout' dla takich rzeczy, timeout jest marnotrawstwem), ale szukam rozwiązania sterowanego zdarzeniami. – Dave

+0

Nie sądzę, że istnieje rozwiązanie sterowane zdarzeniami. Możesz jednak zwiększyć limit czasu, chociaż 1ms to dużo czasu dla procesora, nawet w javascript.O różnicy między setTimeout i setInterval: są one zasadniczo takie same, ale setInterval wykona dokładnie co x ms, a sposób w jaki używam setTimeout oznacza, że ​​dopiero po wykonaniu kodu w time-out, timer rozpocznie się od nowa. Afaiki wewnętrznie używają tego samego mechanizmu. – Toverbal