views:

984

answers:

2

Hi,

I was wondering if there's anyone having an idea how to tackle with the following problem in IE7:

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

<html xmlns="http://www.w3.org/1999/xhtml"&gt;
  <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>

When you run this in IE7 you'll see that the "footer" element stays after modifying the CSS for "panel". The same example tested in IE8, FF and Chrome behaves exactly as expected.

I've already tried updating the element's class but this does not work if the browser's window has been opened maximized and no further size changes were made to the window (which is about 90% of the use cases we have for our product.... :( ) I'm stuck with a CSS-based solution however I think that I can make an exception in this case if it can easily be made IE7-specific (which means that other browsers will behave in a standard way with this).

Please help!

A: 

Have you tried switching doctypes to html-strict or xhtml-strict? What happens then?

Chris Lively
Indeed I have not. The problem is that I'm not in control over what doctype is sent to the client (for reasons I can't discuss here) so it'd not be the solution even if it had worked...
Matthias Hryniszak
+4  A: 

The problem will go if you add overflow: hidden to the #panel.

Update: this is related to the hasLayout bug. More background information can be found in this article and then specifically here:

Note that position: relative does not trigger hasLayout, which leads to some rendering errors, mostly disappearing or misplaced content. Inconsistencies might be encountered by page reload, window sizing and scrolling, selecting. With this property, IE offsets the element, but seems to forget to send a “redraw” to its layout child elements (as a layout element would have sent correctly in the signal chain of redraw events).

The overflow property triggers the element to have layout, also see here:

As of IE7, overflow became a layout-trigger.

BalusC
Can't confirm that in IE7 in IETester: The whole thing disappears. Are you sure this is it?
Pekka
That is A M A Z I N G !!! Thanks!!!I've been struggling with this for 2 days and have not found an answer. Thank you so much!
Matthias Hryniszak
Oh all right, seems to have done the trick - maybe I got the desired result wrong.
Pekka
@Pekka: I tested it in real IE7 by the way. But you're right, I can confirm it for IETester. Another bug?
BalusC
@Pekka, that's why I still don't trust IETester.
Joel Potter
@Joel: it's a coincidence that I've IE7 at this machine, else I would have grabbed IETester and have trusted it as well.. What IE testing tools would you use if you want to have multiple IEs at the same machine?
BalusC
@Joel @BalusC Wow interesting, good to know. I was trusting IETester blindly in layout things.
Pekka
Is there any logical explanation as to why this is working? Or is it just one of the things one normally does when IE7 is going haywire?
Matthias Hryniszak
This already smelled like one of the `hasLayout` bugs. The `overflow` forces the element to have layout and is one of the most used fixes. More about `hasLayout` related bugs: http://www.satzansatz.de/cssd/onhavinglayout.html and http://haslayout.net/css/
BalusC
@BalusC: Actually IE8 Dev tools' "Render As IE7" get's this one right. However, for absolute confidence I'd use a virtual machine. You can set it up to run almost seamlessly in Win7 (http://www.methodicmadness.com/2009/09/running-ie6-in-windows-7-with-virtual.html).
Joel Potter