iPad上的Webkit溢出滚动触摸CSS错误

Posted

技术标签:

【中文标题】iPad上的Webkit溢出滚动触摸CSS错误【英文标题】:Webkit overflow scrolling touch CSS bug on iPad 【发布时间】:2012-02-23 10:36:50 【问题描述】:

如果您在 iPad 设备上使用最新版本的 ios 访问此页面,则可以跟随。

http://fiddle.jshell.net/will/8VJ58/10/show/light/

我有两个新的 -webkit-overflow-scrolling 元素:应用的属性和价值。左侧灰色区域内容丰富,可以纵向或横向滚动。右侧只会横向滚动。

如果您从横向开始(以横向刷新),您可以使用惯性滚动滚动这两个区域。效果很好。现在将您的 iPad 翻转为纵向,只有左​​侧区域会滚动。这是预期的。但是当你翻回横向时,右侧区域将不再滚动,而左侧区域仍然可以。

很明显如何阻止这种情况发生,但我并不总是有内容来填充该区域。

有什么想法吗?

提前致谢,Will :)

【问题讨论】:

【参考方案1】:

迟到了类似但更简单的解决方案。

var $el = $('.myElementClass');

function setOverflow()
    $el.css(webkitOverflowScrolling: 'touch', overflow: 'auto');


function resizeHandler()
    $el.css(webkitOverflowScrolling: 'auto', overflow: 'hidden');
    setTimeout(setOverflow,10);

[编辑] 注意,经过(大量)实验,我发现 display:none 声明肯定会破坏 webkit-overflow-scrolling: touch 功能。 永远不要在应该支持触摸滚动的元素(或元素的父元素)上使用它。

【讨论】:

绝对简单得多!对此稍作改动(切换单独的 css 类而不是手动修改属性)对于恢复原始溢出属性更好。 我想我也尝试过,但又回到手动设置属性。不知道为什么。 谢谢!!我在 ipad4 上遇到了同样的问题。这解决了它。我和 ProVega 有同样的想法,但这个解决方案似乎更干净。非常感谢!你为我节省了一些时间! 谢谢阿梅尔。像魅力一样工作!【参考方案2】:

我能够使用已知的“修复”来强制 iOS6 重绘以纠正此问题,而无需使用 setTimeout。

$(window).on('orientationchange', function()

    var $elem=$('[selector]');
    var orgDisplay=$elem.css('display');
    $elem.css('display','none');
    $elem.get(0).offsetHeight;
    $elem.css('display',orgDisplay);
);

【讨论】:

我喜欢在方向改变时“切换”显示状态的解决方案。我觉得它比重新计算高度需要更少的资源。 我也喜欢这个解决方案。不幸的是,它并没有直接对我有用。在orientationchange 之后需要额外的setTimeout。仍然比明确设置高度更可取。【参考方案3】:

我在 iPhone、iPod 和 iPad 上遇到了同样的错误。这不仅限于后者。

我尝试了所有建议作为解决方案的方法,但最终甜蜜的组合最终是分离元素,将其附加到其容器并在执行此操作时显式为其分配自己的高度,如下所示:

$(window).on('orientationchange', function()
  var el  = $('.troublemaker').detach(),
      elh = el.height();
  setTimeout( el.css('height':elh+'px').appendTo('.container'), 50 );
);

【讨论】:

【参考方案4】:

我实际上遇到了完全相同的问题。我已将其范围缩小到它会影响 DIV,当方向改变时,其内容不再需要滚动。

在你的例子中。右侧的DIV横向滚动,纵向不需要滚动,但需要再次滚动。当两个 DIV(左和右)无论方向如何都需要滚动时,我已经对此进行了测试,这不是问题。

更新:

我实际上似乎已经解决了这个问题!

问题似乎是时间问题。在调整大小期间,内部内容不足以保证在溢出的外部 DIV 上滚动。在浪费了一天的时间之后,我终于想出了这个技巧:

<div id="header" style="position:fixed; height:100px">Header</div>
<div id="content" style="overflow: auto; -webkit-overflow-scrolling: touch">
   <div id="contentInner">
      content that is not long enough to always scroll during different orientations
   </div>
</div>

当页面调整大小时,这是我的逻辑:

   function handleResize()
    
        var iHeight = $(window).height() - $("#header").height();

        // Height needs to be set, to allow for scrolling - 
        //this is the fixed container that will scroll
        $('#content').height(iHeight - 10);

        // Temporarily blow out the inner content, to FORCE ipad to scroll during resizing
        // This is a timing issue where the inner content is not big enough during resize post orientation to require the outer DIV to scroll
        $('#contentInner').height(1000);

        // Set the heights back to something normal
        // We have to "pause" long enough for the re-orientation resize to finish
        window.setTimeout(delayFix, 10);


function delayFix()

    var iHeight = $(window).height() - $("#header").height();

    // Inner divs force the outer div to always have at least something to scroll.  This makes the inner DIV always "rubber-band" and prevents
    // the page from scrolling all over the place for no reason.
    // The height of the inner guy needs to be AT LEAST as big as the container and actually a nip bigger to cause the
    // scrollable area to 'rubber band' properly
    $('#contentInner').height(iHeight + 20);


【讨论】:

我完全忘记了这个问题,实际上我最终也想通了,解决方案与您完全相同。我应该把代码放在这里,为你节省了一些时间,哎呀!不过谢谢:) 如果有人感兴趣,请找到另一种方式...欢迎任何 cmets。见下文。 这真的很棒。太糟糕了,故障必须首先存在。

以上是关于iPad上的Webkit溢出滚动触摸CSS错误的主要内容,如果未能解决你的问题,请参考以下文章

-webkit-overflow-scrolling的定向错误:触摸

css iOS溢出隐藏滚动触摸

移动 Safari - 输入插入符号不会随着溢出滚动一起滚动:触摸

-webkit-overflow-scrolling:在 chrome 和 ios 上无法识别触摸

即使我不滚动,我也可以在 iPad 上显示滚动条吗?

触摸事件仅在iPad iOS 11.4上的Mobile Safari中滚动时触发“一次”