当我在父级中使用 transform translateY(0) 时,可滚动 div 内的内容在 IE11 中闪烁

Posted

技术标签:

【中文标题】当我在父级中使用 transform translateY(0) 时,可滚动 div 内的内容在 IE11 中闪烁【英文标题】:Content inside scrollable div flickers in IE11 when I use transform translateY(0) in parent 【发布时间】:2018-10-03 14:53:52 【问题描述】:

在 IE11 中打开以下链接。向下滚动视口滚动条到页面中间。现在向下滚动可滚动的 div(使用鼠标滚动)。您会发现滚动条内容闪烁并移到可滚动 div 上方。

CodePen Page Link

如果我从 modal-dialog 类中删除 transfrom 属性或禁用平滑滚动,它可以正常工作。

谁能清楚地解释这种闪烁的原因?如果我从对话框中删除转换属性,为什么它可以正常工作? 这是codepen代码链接-

CodePen Code

HTML

<div id="my-id" class="modal">
    <div class="modal-dialog">
        <div style="height: 250px; background-color: coral">Fill space</div>
        <div class="container">
            <div>Test Container</div>
            <ul class="options" id="ddlTest">
            </ul>
        </div>
        <div style="height: 600px; background-color: greenyellow">Fill space</div>
    </div>
</div>

CSS

.modal 
        position: fixed;
        top: 0px;
        right: 0px;
        bottom: 0px;
        left: 0px;
        z-index: 1010;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        background: rgba(0, 0, 0, 0.6);
        opacity: 1;
        -webkit-transition: opacity 0.15s linear;
        transition: opacity 0.15s linear;
        touch-action: double-tap-zoom pinch-zoom cross-slide-y;
        -webkit-transform: translateZ(0);
        transform: translateZ(0px);
    

    .modal-dialog 
        position: relative;
        box-sizing: border-box;
        margin: 50px auto;
        padding: 20px;
        width: 600px;
        max-width: 100%;
        max-width: calc(100% - 20px);
        background: #ffffff;
        opacity: 1;
        -webkit-transform: translateY(0);
        transform: translateY(0px);
        border-radius: 3px;
    
    .container .options 
        position: relative;
        overflow-x: hidden;
        overflow-y: auto;
        margin: 0 4px 4px 0;
        padding: 0 0 0 4px;
        max-height: 200px;
    

【问题讨论】:

【参考方案1】:

外部 div 上的 fixed 位置样式属性,类模式和 id 为“my-id”似乎是问题所在。当我将位置切换回静态时,闪烁停止。

此时您可以尝试将位置设置为相对,因为它不会导致这种闪烁。要模拟固定位置,您可以为“滚动”事件添加一个 eventListener 到主体并更新顶部(偏移量是您选择的任何偏移量):

referenceToModalElement.style.top = (event.currentTarget.scrollTop || document.documentElement.scrollTop) + offset + "px";

不要忘记限制滚动事件,因为它会快速触发。

【讨论】:

以上是关于当我在父级中使用 transform translateY(0) 时,可滚动 div 内的内容在 IE11 中闪烁的主要内容,如果未能解决你的问题,请参考以下文章

PHP在父级中访问子级的私有属性

嵌套 ControlValueAccessor 的角度验证状态未在父级中正确传播,如何实现此验证?

在父级中反应handleClick

仅在父级中运行 Maven 插件

vuejs v-model 值没有在父级中更新?

检测一个 UIView 是不是在父级中的另一个 UIView 后面