Avatar billede mik789 Nybegynder
23. juli 2002 - 11:28 Der er 15 kommentarer og
1 løsning

Z-index mysterier

Jeg har nogle problemer med z-index (hvis det ER det der er problemet) på en side jeg arbejder med. Her har jeg forenklet siden så strukturen er den samme:

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

<html>

<head>

<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<style type="text/css">
div#lag1 {
  position:absolute; z-index:1; top:100px; left:150px; width:300px; height:100px;
  background-color:#ff0000; border:1px; visibility:hidden;
  }
div#lag2 {
  position:absolute; z-index:1; top:250px; left:-50px; width:300px; height:100px;
  background-color:#00ff00; border:1px; visibility:hidden;
  }
div#lag3 {
  position:absolute; z-index:1; top:380px; left:-130px; width:300px; height:100px;
  background-color:#0000ff; border:1px; visibility:hidden;
  }
iframe {
  position:absolute: top:100px; left:0px; width:100%; height:400px;
</style>

<script type="text/javascript">

// Lidt frit efter "pelkjaer" på www.eksperten.dk. - Tak -

function findContent(theObj, theDoc) {
  var p, i, foundObj;
 
  if(!theDoc) theDoc = document;
  if(!foundObj && document.getElementById && self!=parent) foundObj = parent.document.getElementById(theObj);
  if(!foundObj && document.getElementById && self==parent) foundObj = document.getElementById(theObj);

  return foundObj;
}

function showHideContent() {
  var i, visStr, obj, args = showHideContent.arguments;
  for (i=0; i<(args.length-1); i+=2) {
    if ((obj = findContent(args[i])) != null) {
      visStr = args[i+1];
      if (obj.style) {
        obj = obj.style;
        if(visStr == 'show') visStr = 'visible';
        else if(visStr == 'hide') visStr = 'hidden';
      }
      obj.visibility = visStr;
    }
  }
}

</script>

</head>

<body style="margin:0px">

<table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tr>
    <td align="center" valign="middle" style="width:100%; height:550px">

    <table border="1" cellpadding="0" cellspacing="0" width="800" height="500">
      <tr>

        <td align="left" valign="top" style="width:200px">

          <div style="position:relative; top:0px; left:0px">
          <p><a href="java script:showHideContent('lag1','show');">Vis lag 1</a></p>
          <p><a href="java script:showHideContent('lag1','hide');">Skjul lag 1</a></p>
            <div id="lag1"></div>
          </div></td>

        <td align="left" valign="top" style="width:400px">

          <div style="position:relative; top:0px; left:0px">
          <p><a href="java script:showHideContent('lag2','show');">Vis lag 2</a></p>
          <p><a href="java script:showHideContent('lag2','hide');">Skjul lag 2</a></p>
            <div id="lag2"></div>
            <iframe src="tom.html" scrolling="yes"></iframe>
          </div></td>

        <td align="left" valign="top" style="width:200px">

          <div style="position:relative; top:0px; left:0px">
          <p><a href="java script:showHideContent('lag3','show');">Vis lag 3</a></p>
          <p><a href="java script:showHideContent('lag3','hide');">Skjul lag 3</a></p>
            <div id="lag3"></div>
          </div></td>

      </tr>

    </table></td>

  </tr>
</table>


</body>

</html>

Siden kan ses på: www.dahr.dk/Z-index

Problemet er: Alle de tre lag (div 1-3) har samme bredde. Men som I kan se, forsvinder laget i venstre celle halvt under iframen i den midterste celle, hvorimod laget fra den højre celle ikke forsvinder under iframen. Heller ikke laget i samme celle som iframen. Det er da mystisk! Jeg ved godt at dette kun er relevant for IE, da NS opfatter iframen som "windowed" og altså under ingen omstændigheder kan vise nogle af lagene over iframen, men jeg kører med en løsning for hver af de to browsere, og i IE vil jeg godt have alle lagene over iframen. Kan nogen se en løsning? Prøv at eksperimetere med det. Tak.
Avatar billede mik789 Nybegynder
23. juli 2002 - 11:48 #1
ups, der mangler en } i stylesheetet under iframe, men det gør nu ingen forskel
Avatar billede nikolajdu Nybegynder
23. juli 2002 - 11:48 #2
MEner ikke der kan sættes z-index på en iframe med mindre den er "Absolute" positioneret.
Avatar billede mik789 Nybegynder
23. juli 2002 - 11:55 #3
nikolaj> jeg har heller ikke sat z-index på iframen, kun på div'erne. og iframen ER absolut positioneret. Så er dens z-index vel 0 som er default værdi.
Avatar billede pelkjaer Nybegynder
23. juli 2002 - 11:57 #4
Og så er den ikke alligevel - den ligger jo inden i et lag som er positioneret relativt.

Prøv at placere iframen i sit helt eget layer (ikke nested i et andet) som er positioneret absolute, og så smid et z-index på der er lavere end lag 1,2 og 3.

Btw, så manger du /> i enden af dit meta :)
Avatar billede bamzen Nybegynder
23. juli 2002 - 11:58 #5
Mener at nikolajdu har ret, eller at det ihvertfald ikke virker optimalt....

Samtidig,, hvad laver dine # tegn i dit stylesheet?
Troede ikke man måtte bruge dem.....

Og hvis det er tilladt, hvorn virker det?
Avatar billede pelkjaer Nybegynder
23. juli 2002 - 12:02 #6
bamzen

Hvis man fx. laver en

#navn {
  position: absolute;
  width: 200px;
}

Så hedder det

<div id="navn"></div>

Så hans div#navn er lidt overflødigt.
Avatar billede nikolajdu Nybegynder
23. juli 2002 - 12:05 #7
The z-index of the IFRAME is set to a constant value of 5. When you enter a value that is higher than the rest of the elements, the DIV element always draws at the bottom because it is windowless, and the other elements draw on top of the DIV element. When you change the z-index of the SELECT element to a value that is greater than 5, the SELECT elements draws on top of the IFRAME. When you change the z-index of the SELECT element to a value that is less than 5, it draws on the bottom of the IFRAME.
Avatar billede mik789 Nybegynder
23. juli 2002 - 12:07 #8
pelkjaer> tak for tippet. prøver lige.

bamzen> det er rigtigt at man kan nøjes med #lag1, men jeg synes det bliver mere overskueligt når man kan genkende de elementer det går på, så derfor div#lag1. Det fungerer ok og validerer også.
Avatar billede pelkjaer Nybegynder
23. juli 2002 - 12:09 #9
Hvis du ændrer til position:fixed; virker det:

<td align="left" valign="top" style="width:400px">
<div style="position:fixed; top:0px; left:0px">
<p><a href="java script:showHideContent('lag2','show');">Vis lag 2</a></p>
<p><a href="java script:showHideContent('lag2','hide');">Skjul lag 2</a></p>
<div id="lag2"></div>
<iframe src="tom.html" scrolling="yes"></iframe>
</div></td>
Avatar billede pelkjaer Nybegynder
23. juli 2002 - 12:11 #10
Hele siden (validerer også tror jeg)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
#lag1 {
  position:absolute; z-index:1000; top:100px; left:150px; width:300px; height:100px;
  background-color:#CCCCCC; border:1px; visibility:hidden;
  }
#lag2 {
  position:absolute; z-index:1001; top:250px; left:-50px; width:300px; height:100px;
  background-color:#00ff00; border:1px; visibility:hidden;
  }
#lag3 {
  position:absolute; z-index:1002; top:380px; left:-130px; width:300px; height:100px;
  background-color:#0000ff; border:1px; visibility:hidden;
  }
iframe {
  top:100px; left:0px; width:100%; height:400px; z-index:1;
    }
</style>
<script type="text/javascript">
// Frit efter "pelkjaer" på www.eksperten.dk. - Tak -

function findContent(theObj, theDoc) {
  var p, i, foundObj;
 
  if(!theDoc) theDoc = document;
  if(!foundObj && document.getElementById && self!=parent) foundObj = parent.document.getElementById(theObj);
  if(!foundObj && document.getElementById && self==parent) foundObj = document.getElementById(theObj);

  return foundObj;
}

function showHideContent() {
  var i, visStr, obj, args = showHideContent.arguments;
  for (i=0; i<(args.length-1); i+=2) {
    if ((obj = findContent(args[i])) != null) {
      visStr = args[i+1];
      if (obj.style) {
        obj = obj.style;
        if(visStr == 'show') visStr = 'visible';
        else if(visStr == 'hide') visStr = 'hidden';
      }
      obj.visibility = visStr;
    }
  }
}

</script>
</head>
<body style="margin:0px">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="center" valign="middle" style="width:100%; height:550px">
<table border="1" cellpadding="0" cellspacing="0" width="800" style="height:500px">
<tr>
<td align="left" valign="top" style="width:200px">
<div style="position:relative; top:0px; left:0px">
<p><a href="java script:showHideContent('lag1','show');">Vis lag 1</a></p>
<p><a href="java script:showHideContent('lag1','hide');">Skjul lag 1</a></p>
<div id="lag1"></div>
</div>
</td>
<td align="left" valign="top" style="width:400px">
<div style="position:fixed; top:0px; left:0px">
<p><a href="java script:showHideContent('lag2','show');">Vis lag 2</a></p>
<p><a href="java script:showHideContent('lag2','hide');">Skjul lag 2</a></p>
<div id="lag2"></div>
<iframe src="tom.html" scrolling="yes"></iframe>
</div>
</td>
<td align="left" valign="top" style="width:200px">
<div style="position:relative; top:0px; left:0px">
<p><a href="java script:showHideContent('lag3','show');">Vis lag 3</a></p>
<p><a href="java script:showHideContent('lag3','hide');">Skjul lag 3</a></p>
<div id="lag3"></div>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
Avatar billede mik789 Nybegynder
23. juli 2002 - 12:19 #11
pelkjaer> din rettede virker i hvert fald. tak! det eneste du har gjort er at ændre div'en i midtercellen til fixed i stedet for relative, ik'? Har du nogen idé om hvorfor det virker? Læg et svar for pointene.
Avatar billede mik789 Nybegynder
23. juli 2002 - 12:23 #12
nikolaj> det med at iframen har z-index:5, og at div'erne bare skal have et z-index der er højere, virker ikke rigtigt. Hvor har du det i øvrigt fra?
Avatar billede pelkjaer Nybegynder
23. juli 2002 - 12:24 #13
Jeg har også ændret din tabels højde til style="height:500px" - så det kan validere. Men ellers intet.

Som nikolaj siger vil en iframe altid positionere sig selv øverst, så derfor bruger man fixed.

Det burde også virke i NS 6, men det er ikke testet.
Avatar billede mik789 Nybegynder
23. juli 2002 - 12:33 #14
'style="height:500px" - så det kan validere'

Nå, ja, men I må da indrømme det er forvirrende. <table> kan have width men ikke height, hvorimod <td> hverken bør have width eller height.
http://www.w3schools.com/xhtml/xhtml_reference.asp
Avatar billede mik789 Nybegynder
23. juli 2002 - 12:40 #15
for øvrigt, der er da ingen grund til at sætte div'ernes z-index til 1000, 1001 og 1003. Selv hvis de alle tre sættes til 1 og iframen til 0 virker det fint.
Avatar billede pelkjaer Nybegynder
23. juli 2002 - 12:41 #16
Det var bare for at sætte dem højt, men i alle tilfælde tror jeg næppe det er en gid idé at give dem samme z-index.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester