30 votes

Bogue de positionnement relatif / absolu IE7 avec un contenu de page modifié dynamiquement

Je me demandais si il y a quelqu'un d'avoir une idée de comment aborder avec le problème suivant dans IE7:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>IE7 absolute positioning bug</title>
    <style type="text/css">
      #panel { position: relative; border: solid 1px black; } 
      #spacer { height: 100px; } 
      #footer { position: absolute; bottom: 0px; }
    </style>
    <script type="text/javascript"> 
      function toggle() { 
        var spacer = document.getElementById("spacer"); 
        var style = "block"; 
        if (spacer.style.display == "block" || spacer.style.display == "") { 
          style = "none"; 
        }
        spacer.style.display = style;
      }
    </script>
  </head>
  <body>
    <div id="panel">
      <button onclick="toggle();">Click me</button>
      <br /><br /><br />
      <div id="spacer"></div>
      <div id="footer">This is some footer</div>
    </div>
  </body>
</html>

Lorsque vous exécutez cette dans IE7, vous verrez que le "pied de page" élément qui reste après la modification de la CSS pour le "panneau de configuration". Le même exemple testé avec IE8, FF et Chrome se comporte exactement comme prévu.

J'ai déjà essayé la mise à jour de l'élément de la classe, mais cela ne fonctionne pas si la fenêtre du navigateur a été ouvert au maximum et pas plus loin la taille de modifications ont été apportées à la fenêtre (qui est d'environ 90% des cas d'utilisation que nous avons pour nos produits.... :( ) Je suis coincé avec un CSS à base de solution mais je pense que je peux faire une exception, dans ce cas, si elle peut être facilement fait en IE7 spécifiques (ce qui signifie que les autres navigateurs vont se comporter d'une manière standard avec cette).

S'il vous plaît aider!

68voto

BalusC Points 498232

Ceci est lié à la "hasLayout bug" de l'ei. La position relative #panel parent n'a pas de mise en page et donc IE oublie de redessiner ses enfants quand il redimensionnée/repositionné.

Le problème va aller si vous ajoutez overflow: hidden; de la position relative #panel parent.

#panel { position: relative; overflow: hidden; border: solid 1px black; } 

Dans la profondeur des informations générales sur ce IE bug peut être trouvé dans l'excellent ouvrage de référence "Sur le devoir de mise en page" et ensuite pour votre problème particulier spécifiquement le chapitre "les éléments en position relative":

Notez que position: relative ne déclenche pas hasLayout, ce qui mène à des erreurs de rendu, pour la plupart en train de disparaître ou d'égarement de contenu. Des incohérences peuvent être rencontrés par rechargement de la page, la fenêtre de dimensionnement et de défilement, la sélection. Avec cette propriété, c'est à dire des décalages de l'élément, mais semble oublier d'envoyer un "redessiner" à sa disposition des éléments d'enfant (comme un élément de mise en page aurait été correctement envoyé dans la chaîne de signal de redessiner les événements).

L' overflow propriété déclenche l'élément pour avoir de mise en page, voir également le chapitre "Où la Mise en page Vient De":

Comme d'IE7, overflow est devenu un modèle de déclencheur.

2voto

Sebastian Thomas Points 119

Cette solution n'a pas nécessairement quelque chose à voir avec le contenu dynamique, mais cela a fonctionné pour moi (au moins, la page a été bouchée à un degré gérable): spécifiez les dimensions . J'ai seulement remarqué qu'IE7 pensait qu'un div n'avait pas de largeur lors de l'utilisation de l'outil merdique «Sélectionner l'élément par clic» (ctrl + B) dans les outils IE.

0voto

MaciejLisCK Points 390

J'ai créé ma fonction pour déclencher le redessin. Ce n'est peut-être pas une bonne solution, mais cela fonctionne.

 // Script to fix js positon bug on IE7

// Use that function, recomended delay: 700
function ie7fixElementDelayed(elements, delay) {
    window.setTimeout(
        function () {
            if(navigator.appVersion.indexOf("MSIE 7.") != -1) {
                ie7fixElement(elements);
            }
        },
        delay
    );
}

function ie7fixElement(elements) {
    elements.each(function(i) {
        var element = $(this);
        var orginalDisplayValue = element.css("display");

        element.css("display", "none");
        element.css("display", orginalDisplayValue);
    });
}
 

Exemple d'utilisation:

 ie7fixElementDelayed($('#HandPickedWidget .widget'), 700);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X