jme*_*vin 5 javascript css animation css-transitions
我正在开发一个单页Javascript应用程序,该应用程序可以在桌面浏览器上运行,也可以通过Cordova / Phonegap在移动设备上运行。
我有一个使用CSS过渡实现的滑出菜单。我注意到它在桌面浏览器和android上都能很好地工作。但是,在IOS上存在严重的性能问题。过渡似乎并未按时开始,但是过渡一旦开始,呈现效果和持续时间就很好了。在IOS上,开始过渡到Transitionend事件之间的时间比其他平台长得多。例如,过渡持续时间为300毫秒,但我没有在1500毫秒内获得transitionend事件。在所有其他平台上,我在325-350毫秒内收到了transitionend事件。
过渡事件:
平台:
这是菜单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;
}
Run Code Online (Sandbox Code Playgroud)
问:仅在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);
};
Run Code Online (Sandbox Code Playgroud)
在屏幕上移动元素时,您希望最大限度地提高性能。与其转换left属性,不如使用翻译。通过翻译,设备将使用其 GPU 在 DOM 上方的层上呈现屏幕上的变化。这将导致更平滑、更高效的过渡。
看看这个例子。除了使用 atransform而不是更改left属性之外,请注意我删除了一些冗余。您不需要重新声明活动状态的转换。
var open = document.getElementById("open"),
close = document.getElementById("close"),
nav = document.getElementById("navmenu");
open.addEventListener("click", function() {
nav.classList.add("open");
});
close.addEventListener("click", function() {
nav.classList.remove("open");
});Run Code Online (Sandbox Code Playgroud)
#navmenu {
position: absolute;
top: 0;
left: 0;
width: 90%;
max-width: 400px;
z-index: 20;
height: auto;
background-color: white;
transform: translate3d(-100%, 0, 0);
-webkit-transition: transform 300ms ease-in-out;
-moz-transition: transform 300ms ease-in-out;
-ms-transition: transform 300ms ease-in-out;
-o-transition: transform 300ms ease-in-out;
transition: transform 300ms ease-in-out;
}
#navmenu.open {
transform: translate3d(0, 0, 0);
}
button {
margin-top: 100px;
}Run Code Online (Sandbox Code Playgroud)
<div id="navmenu">stuff in here</div>
<button id="open">Open Menu</button>
<button id="close">Close Menu</button>Run Code Online (Sandbox Code Playgroud)