Javascript 检测由CSS转换引起的HTML元素移动

Javascript 检测由CSS转换引起的HTML元素移动,javascript,jquery,dom,css-transitions,Javascript,Jquery,Dom,Css Transitions,我的页面上有一个Flash元素,因为Flash通常非常精细,所以需要将其定位为整数像素值(看看是否需要详细信息) 我通过将对象包装在div中,在对象上设置位置:绝对,并使用jQuery将左和顶设置为包含div的四舍五入的偏移量,来实现这一点。这是一口,这里是代码形式: <div id="wrapper"> <object id="flash" blah style="position:absolute"> <!-- blah -->

我的页面上有一个Flash元素,因为Flash通常非常精细,所以需要将其定位为整数像素值(看看是否需要详细信息)

我通过将
对象
包装在
div
中,在
对象
上设置
位置:绝对
,并使用jQuery将
设置为包含
div的
四舍五入的
偏移量
,来实现这一点。这是一口,这里是代码形式:

<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>

函数更新(){
var p=$(“#包装器”).offset();
$('flash').css({'left':Math.round(p.left),'top':Math.round(p.top)});
}
$(文档).ready(函数(){
$(窗口)。调整大小(更新);
更新();
});
这一切都很好(如果上面的代码有错误,那只是因为减少了错误)


这将在浏览器改变大小时更新位置,当位置被一些JavaScript改变时,更新位置非常容易,但是页面还使用CSS
转换持续时间来设置一些更改的动画。我怎样才能检测到这个?至少,我想检测影响对象的转换何时发生,并知道何时停止。理想情况下,我想知道如何捕捉任何移动(例如字体大小更改或图像加载引起的移动)。

您能检查一下这个小提琴吗: 当运动开始和结束时,它会记录下来,我不确定这是否是你问题的解决方案,但它可能会帮助你朝着正确的方向前进

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每毫秒调用一次,在第一次调用中,它将把div的宽度保存到属性中。每次更改(转换开始)时,它都会记录并保存帮助器属性,以确保在转换恢复到默认大小之前不会再次记录。我相信您可以根据自己的需要更改该部件!:)

有一些关于转换的事件,但我不知道它们有多有用。你可以检测到转换何时完成,但仍然无法检测转换何时开始,至少我不知道。搜索transitionendevent@roasted谢谢,这是一个开始。至少现在它的位置是正确的。如果可能的话,我仍然希望在动画中定位它。给未来读者:
.on('transitionend WebKittTransitionEnd OrtTransitionEnd OrtTransitionEnd',更新)地板(绝对坐标)-绝对坐标进行转换)。每毫秒?!哎呀!无论如何,我知道我可以使用间隔(对于类似的事情,你应该使用
setInterval
而不是
setTimeout
;超时是浪费的),但我正在寻找一个事件驱动的解决方案。我不认为有一个事件驱动的解决方案。但是,您可以增加超时时间,尽管1ms对于cpu来说是很长的时间,即使在javascript中也是如此。关于setTimeout和setInterval之间的区别:它们本质上是相同的,但是setInterval将完全每隔x毫秒执行一次,我使用setTimeout的方式意味着只有在超时中的代码执行完毕后,计时器才会再次启动。他们内部使用相同的机制。
checkForMove();