IOS闪烁错误时,CSS溢出:滚动更改为溢出:隐藏
我正在通过phonegap构build一个应用程序,我想在后台从屏幕底部向上滑动菜单禁用div的滚动;
通过改变从滚动到隐藏的溢出为什么该菜单刷卡是有效的,但它导致屏幕闪烁。
任何人都知道任何破解当溢出propery改变时停止div闪烁?
闪烁错误与智能手机的GPU内存有关。 内存是有限的(VRAM),如果元素太复杂或大于内存,它将被耗尽。 在Android CyanogenMod rom中,您可以使用屏幕上的颜色查看GPU处理。 从绿色(低使用)到红色(使用更高的GPU)。 演示图像 。 但是我不知道IOS是否存在类似的工具。
这在应用程序的所有转换中或在使用GPU时都是可见的。
无论如何,你可以尝试删除/减less你的元素的复杂性,或从这里 :
选项1
<meta name="viewport" content="width=device-width, user-scalable=no" />
选项2 这个 :
.ui-page { -webkit-backface-visibility: hidden; }
选项3 这个 :
.ui-mobile, .ui-mobile .ui-page, .ui-mobile [data-role="page"], .ui-mobile [data-role="dialog"], .ui-page, .ui-mobile .ui-page-active { overflow: hidden; -webkit-backface-visibility: hidden; } .ui-header { position:fixed; z-index:10; top:0; width:100%; padding: 13px 0; height: 15px; } .ui-content { padding-top: 57px; padding-bottom: 54px; overflow: auto; position: absolute; top: 0; right: 0; bottom: 0; left: 0; } .ui-footer { position:fixed; z-index:10; bottom:0; width:100%; }
或者只是删除转换(如果问题在转换):
选项4
'-webkit-transition': 'none !important', '-moz-transition': 'none !important', '-o-transition': 'none !important', '-ms-transition': 'none !important', 'transition': 'none !important'
更改溢出的值似乎使-webkit溢出滚动值从触摸更改为自动 ,从而导致闪烁。
你可以在这篇文章中find一些信息: http : //slytrunk.tumblr.com/post/33861403641/ios6-web-app-flickering-with 。 问题仍然存在于iOS7中,但是,只有当我从触摸切换到自动(而不是从自动触摸)时才会看到。
没有一个-webkit-backface-visibility:hidden,-webkit-transform:translate3d(0,0,0)等在我的情况下工作。
正如在前面提到的文章中所build议的,一个解决方法可能是坚持使用-webkit-overflow-scrolling:auto ,代价是提供了良好的用户体验。
另一个将lockingJavaScript的滚动,如果您的网站可以负担得起:
function disableScroll () { $(element).on('touchmove', function(event){ event.preventDefault(); }); }, function enableScroll () { $(element).off('touchmove'); }
解决scheme使用-webkit-backface-visibility: hidden;
如果您在页面上有多个滚动条,它似乎会导致性能问题。 较旧的iPad上的Safari浏览器正在达到CPU限制并导致浏览器崩溃。
我发现一个解决scheme适用于我的SPA(在列表中可以有多达100个滑块),通过在页面显示和隐藏事件中添加和删除具有违规风格的类。
.touchslide { -webkit-overflow-scrolling:touch; }
(使用jQuery风格的伪代码),当你离开页面,删除类
selector.removeClass("touchslide");
然后在页面加载:
selector.addClass("touchslide"); selector.scrollLeft(0);
您需要在iOS上触发滚动事件,因此定位html对象并添加到scrollLeft,因为第一个滚动不会产生惯性效果。