在iOS上CSS过渡事件非常慢

jme*_*vin 5 javascript css animation css-transitions

我正在开发一个单页Javascript应用程序,该应用程序可以在桌面浏览器上运行,也可以通过Cordova / Phonegap在移动设备上运行。

我有一个使用CSS过渡实现的滑出菜单。我注意到它在桌面浏览器和android上都能很好地工作。但是,在IOS上存在严重的性能问题。过渡似乎并未按时开始,但是过渡一旦开始,呈现效果和持续时间就很好了。在IOS上,开始过渡到Transitionend事件之间的时间比其他平台长得多。例如,过渡持续时间为300毫秒,但我没有在1500毫秒内获得transitionend事件。在所有其他平台上,我在325-350毫秒内收到了transitionend事件。

过渡事件:

  • 预期:350ms
  • 实际:1500ms

平台:

  • 科尔多瓦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;
}
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)

And*_*man 5

在屏幕上移动元素时,您希望最大限度地提高性能。与其转换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)