css overflow:scroll改为overflow:hidden时IOS闪烁bug

Posted

技术标签:

【中文标题】css overflow:scroll改为overflow:hidden时IOS闪烁bug【英文标题】:IOS flicker bug when the css overflow:scroll is changed to overflow:hidden 【发布时间】:2013-07-18 19:22:07 【问题描述】:

我正在通过 phonegap 构建一个应用程序,当我从屏幕底部向上滑动菜单时,我想在后台禁用 div 的滚动;

通过将溢出从滚动更改为隐藏,为什么菜单滑动有效,但它会导致屏幕闪烁。

有人知道在溢出属性更改时阻止 div 闪烁的任何技巧吗?

【问题讨论】:

不设置溢出隐藏,也许您可​​以从 DOM 中完全删除隐藏的内容?听起来设备正在挣扎,因为页面上的内容太多,所以我的第一个方法是缩小页面。 我也有同样的问题,将溢出属性从滚动更改为隐藏 ipad 上的整个 div“闪烁”。你找到解决办法了吗? 【参考方案1】:

闪烁问题与智能手机的 GPU 内存有关。内存是有限的(VRAM),如果元素太复杂或大于内存,就会耗尽。在带有 CyanogenMod rom 的 android 中,您可以在屏幕上查看带有颜色的 gpu 处理。从绿色(低使用率)到红色(高使用 gpu)。 Demo image。但是不知道有没有类似的ios工具。

这在应用的所有转换或使用 GPU 时都可见。

无论如何,您都可以尝试删除/降低元素的复杂性,或者来自here:

选项 1

<meta name="viewport" content="width=device-width, user-scalable=no" />

选项2this:

.ui-page 
    -webkit-backface-visibility: hidden;

选项 3 this:

.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'

【讨论】:

您可以在 iOS 模拟器中调试 GPU 问题,但不能在设备本身上调试。它位于“Xcode -> 打开开发者工具 -> 更多开发者工具...”下并搜索“图形”(该网站现在已关闭,所以我不确定名称到底是什么)。您也可以在 Instruments 工具中运行它,它会告诉您在应用程序生命周期的每一微秒内您使用了多少字节的 VRAM。不过,我不确定如何让电话间隙应用程序在 Instruments 中运行。【参考方案2】:

更改溢出的值似乎会使 -webkit-overflow-scrolling 的值从 touch 更改为 auto,从而导致闪烁。

您可以在这篇文章中找到一些信息:http://slytrunk.tumblr.com/post/33861403641/ios6-web-app-flickering-with。问题仍然存在于 iOS7 中,但仅就我所见,当您从触摸切换到自动时(不再从自动切换到触摸)。

-webkit-backface-visibility: hidden、-webkit-transform: translate3d(0,0,0) 等都不适用于我的情况。

正如前面提到的文章中所建议的,一种解决方法可能是坚持使用 -webkit-overflow-scrolling: auto,但代价是它提供了良好的用户体验。

如果您的网站负担得起,另一种方法是使用 javascript 锁定滚动:

function disableScroll () 
  $(element).on('touchmove', function(event) 
    event.preventDefault(); 
  );
,

function enableScroll () 
  $(element).off('touchmove');

【讨论】:

【参考方案3】:

使用-webkit-backface-visibility: hidden; 的解决方案可行,如果页面上有多个滚动条,似乎会导致性能问题。旧 ipad 上的 Safari 达到 CPU 限制并导致浏览器崩溃。

通过在页面显示和隐藏事件中添加和删除具有违规样式的类,我找到了适用于我的 SPA(列表中最多可以有 100 个滑块)的解决方案。

.touchslide 
    -webkit-overflow-scrolling:touch;

(使用jQuery风格的伪代码)离开页面时,移除类

selector.removeClass("touchslide");

然后在页面加载时:

   selector.addClass("touchslide");
   selector.scrollLeft(0);

iOS需要触发滚动事件,所以定位html对象并添加到scrollLeft,因为第一次滚动不会有惯性效果。

【讨论】:

以上是关于css overflow:scroll改为overflow:hidden时IOS闪烁bug的主要内容,如果未能解决你的问题,请参考以下文章

溢出:滚动;在 <td>

css 设置overflow:scroll 滚动条的样式

overflow-y:auto/hidden/scroll和overflow-x:visible组合渲染异常

关于overflow:scroll失效的原因!

css隐藏滚动条

overflow: scroll在iOS上滑动卡顿的问题