z-index在iframe中使用pdf的Internet Explorer中不起作用

Cor*_*ler 57 css pdf iframe internet-explorer z-index

我无法z-index使用iframe包含IE8的pdf文件.它适用于谷歌浏览器.

示例(JSFiddle):

HTML

<div id="div-text">
      <div id="shouldBeOnTop">my text that should be on top</div>
</div>
<div id="div-frame">
    <iframe src="http://legallo1.free.fr/french/CV_JLG.pdf" width="200" height="200"/>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

#div-text{
    position:relative;
    left:210px;
    top:20px
}

#shouldBeOnTop{
    position:relative;
    right:60px;
    background-color:red;
    width:100px;
    z-index:2;
}

#div-frame{
    position:relative;
     z-index:1;
}
Run Code Online (Sandbox Code Playgroud)

Jor*_*ray 88

更新: Matthew Wise有一个非常聪明的替代解决方案,您应该考虑 - 特别是如果您遇到我的方法有问题或者不喜欢丑陋的黑客攻击!


有一种方法可以用IE中的其他元素覆盖IE中的窗口元素,但是你不会喜欢它.

背景:窗口和无窗口元素

Legacy IE将元素分为两种类型:windowed和windowless.

像普通的元素div,并input窗户.它们由浏览器本身在单个MSHTML平面中呈现,并且尊重彼此的z顺序.

在MSHTML之外呈现的元素是窗口化的 ; 例如,select(由OS呈现)和ActiveX控件.他们尊重彼此的z顺序,但占据一个单独的MSHTML平面,该平面绘制在所有无窗元素之上.

唯一的例外是iframe.在IE 5中,iframe是一个窗口元素.这在IE 5.5有所改变 ; 它现在是一个无窗口元素,但出于向后兼容的原因,它仍然会绘制具有较低z-index的窗口元素

换句话说:iframe尊重窗口和无窗口元素的z-index.如果您将iframe一个窗口元素放置在窗口上,那么任何位于窗口上方的无窗元素iframe都将可见!

这意味着什么

PDF将始终绘制在常规页面内容之上 - 类似select元素直到IE 7.解决方法是iframe在您的内容和PDF之间定位另一个.

演示

jsFiddle:http://jsfiddle.net/Jordan/gDuCE/

HTML:

<div id="outer">
    <div id="inner">my text that should be on top</div>
    <iframe class="cover" src="about:blank"></iframe>
</div>

<iframe id="pdf" src="http://legallo1.free.fr/french/CV_JLG.pdf" width="200" height="200"></iframe>
Run Code Online (Sandbox Code Playgroud)

CSS:

#outer {
    position: relative;
    left: 150px;
    top: 20px;
    width: 100px;
    z-index: 2;
}

    #inner {
        background: red;
    }

    .cover {
        border: none;
        position: absolute;
        top: 0;
        left: 0;
        height: 100%;
        width: 100%;
        z-index: -1;
    }

#pdf {
    position: relative;
    z-index: 1;
}
Run Code Online (Sandbox Code Playgroud)

支持

这已经过测试,应该可以在IE 7-9中使用.如果你觉得它在DOM中出现在其他浏览器中是不安全的,你可以用JavaScript添加它或将它包装在仅IE的条件注释中:

<!--[if IE]><iframe class="cover" src="about:blank"></iframe><![endif]-->
Run Code Online (Sandbox Code Playgroud)

  • 我可能会补充一点,在测试之后,这在IE11中同样适用,因为我们有一段时间获得一个jQuery UI模式来显示iframe中的pdf.如上所述,唯一可能的问题是页面滚动时的模态闪烁,但至少它是有效的. (2认同)
  • 也许我做错了,但是使用此解决方案,我可以在PDF上看到div,但是由于iFrame妨碍了它,因此我无法与其进行交互(例如,点击事件)。 (2认同)
  • @JordanGray原来我的“内部” div被我的“ cover” iframe覆盖了,我提高了它的z-index并得到了理想的结果。谢谢。 (2认同)
  • 窗口和无窗口,我今天学到了一些关于IE的可怕的东西.冰雹铬. (2认同)

Mat*_*ise 5

使用额外的IFRAME的变通办法确实可以在简单的情况下使用,但是我花了一个上午的时间来尝试使覆盖图更加透明。基本上,我们的应用程序具有模式弹出窗口,由此弹出窗口后面的全窗口叠加层将显示为“灰色”(背景色为黑色,不透明度0.25),以向用户指示弹出窗口为模式弹出窗口。通过这种解决方法,嵌入式PDF视图永远不会在窗口的其余部分变灰,因此看起来仍然“处于活动状态”,实际上您仍然可以与PDF查看器进行交互。

我们的解决方案是使用Mozilla的pdf.js库:https : //github.com/mozilla/pdf.js/-嵌入指向测试URL的IFRAME http://mozilla.github.com/pdf.js/web/ viewer.html?file = compressed.tracemonkey-pldi-09.pdf就 z-index,透明度,很多方面而言,都是开箱即用的,不需要黑客!似乎他们使用自己的呈现引擎,该引擎生成代表PDF内容的标准HTML。