【发布时间】:2017-03-10 21:33:27
【问题描述】:
我正在开发一个单页 Javascript 应用程序,它可以在桌面浏览器上运行,也可以通过 Cordova/Phonegap 在移动设备上运行。
我有一个使用 CSS 过渡实现的滑出式菜单。我注意到它在桌面浏览器和 android 上运行良好。但是,在 IOS 上存在严重的性能问题。过渡似乎没有按时开始,但一旦开始渲染和持续时间看起来很好。在 IOS 上,开始转换和 transitionend 事件之间的时间比其他平台要长得多。例如,转换的持续时间是 300 毫秒,但我在 1500 毫秒内没有收到 transitionend 事件。在所有其他平台上,我在 325-350 毫秒内收到了 transitionend 事件。
Transitionend 事件:
- 预计:350 毫秒
- 实际:1500 毫秒
平台:
- 科尔多瓦 6.3.1
- Xcode 8.1 GM 种子
- IOS 10.1
这是菜单 div 的 CSS。为了滑出菜单,我添加了“开放”类。要关闭菜单,我删除了“打开”类。我尝试过在“left”属性和“transform”属性上进行转换,但结果是相同的。
/* Nav Menu */
#navmenu {
position: absolute;
top: 0;
width: 90%;
max-width: 400px;
z-index: 20;
height: auto;
background-color: white;
/*
-webkit-transform: translate3d(-100%,0,0);
-moz-transform: translate3d(-100%,0,0);
-ms-transform: translate3d(-100%,0,0);
transform: translate3d(-100%,0,0);
-webkit-transition: -webkit-transform 300ms ease;
-moz-transition: -moz-transform 300ms ease;
-ms-transition: -ms-transform 300ms ease;
-o-transition: -o-transform 300ms ease;
transition: transform 300ms ease;
*/
left: -100%;
-webkit-transition: left 300ms ease;
-moz-transition: left 300ms ease;
-ms-transition: left 300ms ease;
-o-transition: left 300ms ease;
transition: left 300ms ease;
}
#navmenu.open {
/*
-webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
-webkit-transition: -webkit-transform 300ms ease;
-moz-transition: -moz-transform 300ms ease;
-ms-transition: -ms-transform 300ms ease;
-o-transition: -o-transform 300ms ease;
transition: transform 300ms ease;
*/
left: 0;
-webkit-transition: left 300ms ease;
-moz-transition: left 300ms ease;
-ms-transition: left 300ms ease;
-o-transition: left 300ms ease;
transition: left 300ms ease;
}
问题:仅在 IOS 平台上,可能是什么导致了开始转换的延迟?是否有任何已知的解决方案来规避问题或加快速度?我在应用程序中有其他过渡需要 5 秒才能启动,导致应用程序无法使用。我希望菜单解决方案将适用于整个应用程序。感谢您提供的任何帮助或想法。
这是我用来打开/关闭菜单的检测 Javascript 代码...
utilities.addEventListeners(navMenuButtonDiv, function () {
var start = Date.now();
var menuDiv = navMenu.getDiv();
if (menuDiv.classList.contains('open')) {
menuDiv.classList.remove('open');
} else {
menuDiv.classList.add('open');
}
var handler = function (event) {
console.log('Transition: ' + (Date.now() - start));
menuDiv.removeEventListener('webkitTransitionEnd', handler, true);
};
menuDiv.addEventListener('webkitTransitionEnd', handler, true);
};
【问题讨论】:
-
更新:IOS (10.1.1) 的最新更新似乎大大加剧了这个问题。即使在将 top/left 移植到转换转换之后,它仍然是一个问题。 iPhone5 上的任何过渡都开始得很晚,有时在按钮单击/触摸后超过 5 秒。 iPhone6 的性能要好一些,这让我相信这是内存问题,也许是为了让人们摆脱旧 iPhone 的计划过时。在sizzlescene.comsizzlescene.com 上试用旧 iPhone 上的应用进行演示。
标签: javascript css animation css-transitions