Je ne peux avoir z-index
travail sur un iframe
contenant un fichier pdf avec IE8. Cela fonctionne avec Google Chrome.
Exemple ( 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>
[~ # ~] 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;
}
Mise à jour: Matthew Wise a une solution alternative vraiment intelligente que vous devriez considérer, surtout si vous rencontrez problème avec mon approche ou déteste les hacks laids !
Il existe un moyen de couvrir les éléments fenêtrés dans IE avec d'autres éléments, mais vous n'allez pas l'aimer.
Legacy IE classe les éléments en deux types: avec fenêtre et sans fenêtre.
Les éléments réguliers comme div
et input
sont sans fenêtre . Ils sont rendus par le navigateur lui-même dans un seul plan MSHTML et respectent l'ordre z de l'autre.
Les éléments rendus en dehors de MSHTML sont fenêtrés ; par exemple, select
(rendu par le système d'exploitation) et les contrôles ActiveX. Ils respectent l'ordre z de l'autre, mais occupent un plan MSHTML distinct qui est peint au-dessus de tous les éléments sans fenêtre.
La seule exception est iframe
. Dans IE 5, iframe
était un élément fenêtré. C'était changé en IE 5.5 ; il est maintenant un élément sans fenêtre, mais pour des raisons de compatibilité ascendante, il restera sur les éléments fenêtrés avec un indice z inférieur
En d'autres termes: iframe
respecte le z-index pour les éléments fenêtrés et sans fenêtre . Si vous positionnez un iframe
sur un élément fenêtré, tous les éléments sans fenêtre positionnés sur le iframe
seront visibles!
Les éléments PDF seront toujours peints au-dessus du contenu normal de la page — comme select
les éléments étaient jusqu'à IE 7 =. Le correctif consiste à positionner un autre iframe
entre votre contenu et le 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>
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;
}
Cela a été testé et devrait fonctionner dans IE 7–9. Si vous vous sentez persistant à ce qu'il apparaisse dans le DOM pour d'autres navigateurs, vous pouvez l'ajouter avec JavaScript ou l'envelopper dans un IE- seul commentaire conditionnel:
<!--[if IE]><iframe class="cover" src="about:blank"></iframe><![endif]-->
La solution de contournement avec l'IFRAME supplémentaire fonctionne dans des cas simples, mais j'ai passé une matinée à essayer d'obtenir la superposition pour respecter la transparence. Fondamentalement, notre application possède des fenêtres contextuelles modales par lesquelles une superposition pleine fenêtre derrière les fenêtres contextuelles est rendue "grisée" (couleur d'arrière-plan noire, opacité 0,25) pour indiquer à l'utilisateur que les fenêtres contextuelles sont modales. Avec cette solution de contournement, la vue intégrée PDF n'est jamais grisée avec le reste de la fenêtre, elle semble donc toujours "active" et, en effet, vous pouvez toujours interagir avec le PDF = spectateur.
Notre solution consiste à utiliser la bibliothèque pdf.js de Mozilla: https://github.com/mozilla/pdf.js/ - incorporant un IFRAME pointant vers le URL de test http://mozilla.github.com/pdf.js/web/viewer.html?file=compressed.tracemonkey-pldi-09.pdf fonctionne tout droit sorti de la boîte en respectant le z-index, la transparence, le lot, aucun hacks requis! Semble qu'ils utilisent leur propre moteur de rendu qui génère du HTML standard représentant le contenu du PDF.
J'avais essayé de résoudre le même problème et mon scénario était similaire. J'essayais de rendre une vidéo YouTube sur ma page et au-dessus de la vidéo, je voulais placer un div
avec quelques informations.
Mais la vidéo YouTube contenue dans un iframe
ne me permettait pas de le faire. Quel que soit lez-index
que j'ai donné aux éléments.
Ensuite, ce message a aidé - https://stackoverflow.com/a/9074366/1484384
Fondamentalement, il s'agit du wmode
. Consultez le post ci-dessus pour voir comment l'utiliser.
Voici un code de ce post:
<iframe title="YouTube video player" width="480" height="390 src="http://www.youtube.com/embed/lzQgAR_J1PI?wmode=transparent">
Ou
// Correction de l'intégration de la vidéo YouTube sur z-index
$(document).ready(function (){
$('iframe').each(function(){
var url = $(this).attr("src");
$(this).attr("src",url+"?wmode=transparent");
});
});
Pour ceux qui utilisent jQueryUI, j'ai trouvé la solution suivante.
Ajoutez la fonction suivante et appelez-la à partir de l'événement ouvert de vos boîtes de dialogue. Si votre navigateur est IE il va insérer un iFrame dans la superposition Modal ou bien l'ajouter à l'arrière-plan de la boîte de dialogue.
// Simple IE Detection.
var isIE = Object.hasOwnProperty.call(window, "ActiveXObject");
// Fix IE bug where an iFrame from below will cover a dialogs contents.
function dialogIFrameFix(event /* object */) {
setTimeout(function () {
if (event && event.target && isIE) {
var $dialog = $(event.target.parentElement);
// Get the modal overlay if found.
var $fixTarget = $dialog.next('.ui-widget-overlay');
// Use the dialog body if there is no overlay.
if (!$fixTarget || !$fixTarget.length)
$fixTarget = $dialog;
// Add as first child so it is covered by all of the other elements
$fixTarget.prepend('<iframe class="iFrameFix" src="about:blank" style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>');
}
}, 10);
}
Vous l'appelleriez alors comme suit ..
.dialog({
open: function (event, ui) {
dialogIFrameFix(event);
}
});