【发布时间】:2014-02-06 19:37:05
【问题描述】:
这个问题已经解决了。请参阅下面的 JSFiddle 示例以查看原始错误,并滚动到解决方案以查看工作版本。
JWPlayer v6: Link to preview on tablet devices (JSFiddle) Link to view full code (JSFiddle)
JWPlayer v5: Link to preview on tablet devices (JSFiddle) Link to view full code (JSFiddle)
2/10/14(更新)- 在提供的 JSFiddle 示例中,我将 jwplayer 更新到版本 6(我之前使用的是 v5),现在桌面上也出现动画错误。这些错误是leftVideoPriority() 和rightVideoPriority() 函数中执行的动画的结果。这可以通过在可拖动对象的stop 属性中注释掉对这些函数的调用来确认。另一方面,使用 CSS 动画而不是 jQuery 动画可能是解决此问题的方法,但它可能会消除对 IE9 的支持,而且肯定会消除对 IE8 的支持。这(很遗憾)对于我的目的来说是不可接受的。
我正在尝试开发一个动画双视频“小部件”,如果您愿意的话,它允许台式机和平板设备上的用户与该小部件进行交互。它包含两个视频,并排放置,并由“控制栏”隔开。可以沿 x 轴拖动该控制栏以使左侧或右侧视频成为焦点。此外,可以单击/点击任一视频以将其切换为焦点。请查看示例以了解其具体工作原理。
这个小部件利用 jwplayer、jQuery UI 和 jquery UI touch(一个将触摸事件绑定到我的代码中定义的鼠标事件侦听器的插件)。
该小部件在使用 Chrome 的桌面上正常工作(我还没有进行跨浏览器兼容性测试),但是由于平板设备(特别是 iOS 和 Android)上的事件交互/动画而发生了一些错误)。错误(它们看起来更像是古怪的 css 而不是“错误”本身)在 iOS 和 Android 上是相似的,但在 iOS 上不同的是,当动画停止时错误会消失;在 Android 上,动画完成后错误仍然存在。
问题似乎也源于 jwplayer,因为删除与之相关的代码块可以解决平板电脑上的动画错误。
这是我的 jQuery UI 代码的摘录,它在“可拖动”事件上执行动画:
$("#centerBar").draggable({
axis: "x",
containment: "#centerBarContainer",
scroll: false,
drag: function (event, ui) {
centerOfHandleFromLeft = ui.offset.left + 25; //get distance from left edge of document to the handle's center
centerBarPosDelta = centerOfHandleFromLeft - initialHandleFromLeft; // calculate change in center bar position
// adjust width of video containers according to center bar movement
$("#videoContainerLeft, #videoContentLeft_wrapper").css({
"width": centerBarPosDelta + initialLeftVideoWidth
});
$('#videoContainerRight, #videoContentRight_wrapper').css({
"width": initialRightVideoWidth - centerBarPosDelta
});
},
stop: function (event, ui) {
// check if change in center bar position is more/less than half the width of its draggable area
if (centerBarPosDelta <= (barContainerWidth / 2)) {
rightVideoPriority();
} else {
leftVideoPriority();
}
}
});
这里是动画代码块:
function leftVideoPriority() {
$('#videoContainerLeft, #videoContentLeft_wrapper, #videoContentLeft').stop().animate({
"width": 580
}, 750);
$('#videoContainerRight, #videoContentRight_wrapper, #videoContentLeft').stop().animate({
"width": 220
}, 750);
$('#centerBar').stop().animate({
"left": 360
}, 750);
currentVideo = 'left';
enableVideoSound();
}
function rightVideoPriority() {
$('#videoContainerRight, #videoContentRight_wrapper, #videoContentRight').stop().animate({
"width": 580
}, 750);
$('#videoContainerLeft, #videoContentLeft_wrapper, #videoContentLeft').stop().animate({
"width": 220
}, 750);
$('#centerBar').stop().animate({
"left": 0
}, 750);
currentVideo = 'right';
enableVideoSound();
}
function enableVideoSound() {
if (currentVideo == 'left') {
jwplayer('videoContentLeft').setVolume(60);
jwplayer('videoContentRight').setVolume(0);
} else {
jwplayer('videoContentRight').setVolume(60);
jwplayer('videoContentLeft').setVolume(0);
}
}
总之,我尝试了几种 jQuery UI touch 变体 - jquery ui touch punch, for example - 但动画错误仍然存在。我对平板事件侦听器功能感到满意,只是需要更改动画错误。不幸的是,我不知道是什么导致了它们,因为我不熟悉平板电脑/移动开发,并且可见错误似乎没有密切反映 DOM 中的任何 html 元素(也许它与#centerBarContainer 相关,因为它看起来大小/位置相似,但可见错误似乎以#centerBarContainer 没有的方式移动)。
/edit/ - 请原谅我的代码中的任何混乱/缺乏优化...我不得不将其从更完整的版本中剥离到您在此处看到的版本,并且某些代码行可能没有意义那个上下文。但是,与此问题相关的所有内容都已包含在内。
【问题讨论】:
-
您是否也尝试过测试 JW6 以查看是否会出现此问题?我注意到您使用的是不再积极开发的 JW5。
-
Within the JSfiddle example,我链接到了免费帐户(v6.8.4616)提供的jwplayer代码并删除了之前的jwplayer代码(v5.10.2295)。结果是动画错误现在也出现在桌面上 - 这可能有助于调试错误,但这显然不是预期的结果。此外,动画错误似乎将左侧视频“挤压”到更小的尺寸,而之前显示的错误并未影响左侧视频的尺寸。
-
您是否尝试过仅使用 CSS3 制作动画而不使用任何 jQuery?
-
我很想这样做,但不幸的是我必须提供对 IE8-9 的支持。对于这个特定的项目,CSS3 动画是否与 IE9 兼容,我可能会弄错,因为我今天整天都在跳来跳去。无论哪种方式,IE8 都不在画面中。
-
好的,知道了。此问题发生在哪个 Android 版本和设备上?
标签: android ios jquery-ui tablet jwplayer