2009-04-17 6 views
4

J'ai une mise en page avec un menu DIV sur la gauche. Ceci est flotté à gauche avec une largeur EM fixe. J'ai alors un contenu DIV qui a une marge gauche de plus que la largeur du menu. Donc, il se trouve bien à la droite du menu et remplit l'espace restant avec le menu et le contenu alignés parfaitement.CSS Floats - contenu tombant dans IE6

Cependant, dans Internet Explorer 6, si le contenu devient trop large, il tombe en dessous du menu. ce qui signifie que vous avez plein d'espaces et que vous ne pouvez pas voir le contenu du tout sans défilement.

Malheureusement, je ne suis pas en mesure d'apporter des modifications au contenu - il s'agit d'une refonte d'un site hébergeant du contenu tiers, et la modification de ce contenu est hors de portée de ce que je peux faire.

De plus, il existe une barre de bas de page qui doit se trouver sous le menu et le contenu. J'ai réussi à le faire fonctionner en fournissant IE6 avec une disposition différente en utilisant le positionnement absolu - malheureusement le pied de page ressemble à des ordures et comme IE6 est le deuxième navigateur le plus utilisé sur notre site, je ne peux pas vraiment aller avec ça.

J'ai également essayé de déconner avec des débordements mais j'ai fini par causer des problèmes avec des barres de défilement aléatoires apparaissant partout, ce qui n'était pas bon non plus.

Est-ce que quelqu'un sait s'il existe une façon simple de faire cela dans Javascript et dans les navigateurs "appropriés"? Je pense actuellement que ce sera une mise en page basée sur une table.

Voici un exemple du problème:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
    <head> 
     <style type="text/css"> 
      .menu { 
       width: 14em; 
       float: left; 
      } 

      .content { 
       margin-left: 15em; 
       zoom: 1; 
      } 

      .footer { 
       clear: both; 
      } 

      /* styling to make the demo more obvious */ 
      .menu { 
       background-color: #f99; 
      } 
      .content { 
       background-color: #9f9; 
      } 
      .footer { 
       background-color: #99f; 
      } 
      td { 
       border: 1px solid #000; 
      } 
     </style> 
    </head> 

    <body> 

    <div class="container"> 
     <div class="menu"> 
      <ul> 
       <li><a href="#">menu item</a></li> 
       <li><a href="#">menu item</a></li> 
       <li><a href="#">menu item</a></li> 
       <li><a href="#">menu item</a></li> 
      </ul> 
     </div> 

     <div class="content"> 
      <h1>Main Content</h1> 
       <table> 
        <tr> 
         <td>this is a really</td> 
         <td>wide table which</td> 
         <td>I am using to push</td> 
         <td>the content down</td> 
         <td>need to keep going</td> 
         <td>so that it breaks</td> 
         <td>in ie6</td> 
         <td>but naturally</td> 
         <td>nothing else</td> 
         <td>sghskdhksdhfsdhffs</td> 
         <td>sghskdhksdhfsdhffs</td> 
         <td>sghskdhksdhfsdhffs</td> 
         <td>sghskdhksdhfsdhffs</td> 
        </tr> 
       </table> 
      </div> 
     </div> 

     <div class="footer"> 
      <p>Copyright blah blah blah</p> 
     </div> 
    </body> 
</html> 
+0

Je ne pouvais pas comprendre comment ajouter 2 commentaires à la même réponse ... mais de toute façon ... Bien que j'ai réussi à résoudre ce problème avec des débordements, cela a créé un problème beaucoup plus grave par lequel je finirais avec 2 jeux de barres de défilement.Naviguer sur une très grande table devint incroyablement difficile. Vous deviez utiliser une barre de défilement pour en trouver une autre. Ensuite, utilisez le premier pour faire défiler à nouveau, etc. Il a juste créé une charge de problèmes d'utilisabilité. (Cela ne veut pas dire que ça ne peut pas être fait pour travailler ..) –

Répondre

2

Pourquoi ne pas utiliser une mise en page établie pour exemple http://layouts.ironmyers.com/

ou vous pourriez vouloir enquêter sur cette css overflow

Avoir un look at this, est-il utile ?

EDIT:

Essayez l'un de ces correctifs: (vous pouvez utiliser un code conditionnel comme @Blake suggéré) débordement

  • : faire défiler - ce qui assure que votre contenu peut être vu au prix de la conception (barres de défilement sont moche)
  • débordement: masqué - coupe juste tout débordement. Cela signifie que les gens ne peuvent pas lire le contenu.

    .content { 
         margin-left: 15em; 
         zoom: 1; 
         overflow:scroll 
         /* overflow:hidden */ /* probably second best */ 
    } 
    

Essayez de regarder celui-How to prevent long words from breaking my div? est-ce votre problème?

+0

Bon Dieu c'était rapide! :) Merci pour la réponse. J'ai essayé un certain nombre de mises en page établies mais, malheureusement, elles ont toutes le même problème - le contenu tombe sous le menu, ou vice versa, s'il y a beaucoup de contenu non dépliable. Je n'avais pas encore rencontré le site ironmyers avant, mais j'ai essayé et le menu tombe sous le contenu. –

0

Je suis tombé sur ça tellement de fois que j'essaie de rester à l'écart des flotteurs. Cela dit, il y a certaines choses que vous pouvez faire pour les faire fonctionner, mais vous devrez peut-être vous contenter d'une mise en page fixe et/ou some IE6 specific fixes.Voici quelques choses que vous pouvez essayer:

  1. Cela peut paraître comme une hérésie, mais tables ne sont pas mauvais pour la mise en page, ils sont tout simplement pas cool.
  2. Essayez de définir la div 'container' avec une largeur fixe et des marges automatiques.
  3. Si cela ne fonctionne pas, essayez une div divisée 'content' largeur avec votre div fixe 'container' largeur .
+0

Merci beaucoup pour les suggestions. Je pense qu'une mise en page basée sur une table est probablement la réponse mais ce n'est pas celle que j'aime car cela rend le site moins flexible (donc les petits écrans etc seraient plus difficiles à coiffer) La définition d'une largeur fixe sur le conteneur ne semble pas aider malheureusement, à moins que je ne le fasse plus large que le contenu mais comme je ne sais pas quelle est la largeur nécessaire, je ne suis pas sûr que ce soit pratique de toute façon. –

1

Utilisez des commentaires conditionnels pour IE6 à lire et à placer dans le CSS nécessaire pour fixer la largeur des problématiques divs comme ceci:

<!--[if IE 6]> 
IE 6 specific stuff goes here. You can load a specific stylesheet here, or just have inline css 
<![endif]--> 

You can read more on the conditional comments here.

+0

Merci, mais le problème n'est pas comment cacher les choses de IE6, plus de savoir quelles sont les choses spécifiques dont j'ai besoin de se cacher. :) –

+0

Il ne suggère pas que vous cachez votre contenu de IE, il suggère d'utiliser des hacks spécifiques css pour résoudre le problème IE6. – inspite

1

Retrait de la zoom: 1; cela fonctionne très bien pour moi dans IE6.

+0

Ça ne change rien pour moi, tu es sûr? Essayez de rendre votre navigateur plus étroit. J'ai ajouté le zoom: 1 pour forcer haslayout qui a résolu les problèmes dans IE7 je pense. –

+0

Oui - il continue de fonctionner correctement pour moi, IE 6.0.2900.2180 etc. (xp sp2). Hmmm. – Traingamer

3

Comme vous l'avez mentionné, vous avez déjà essayé la position absolue. Mais je vais essayer ce qui suit et ça pourrait marcher pour vous. Voici le CSS:

.container { 
    position:relative; 
} 
.menu { 
    width: 14em; 
    position:absolute; 
    top: 0; 
    left: 0 !important; 
    left: -15em; 
} 

.content { 
    margin-left: 15em; 
} 
.footer { 
} 

Explication: Le menu est positionné de manière absolue, indépendamment de l'autre contenu. Cependant, IE place le menu par rapport à la div "content", et le cache derrière le div "content". Le travail autour est de le positionner négativement, autant d'em à gauche que le contenu div a "margin-left". Mais cela ne devrait être fait que pour IE, donc le "left 0! Important" est ajouté (mais avant la gauche négative), ce qui fonctionne car IE ignore "! Important" alors que les autres utilisateurs le reconnaissent et utiliseront "left 0" .

Mise à jour:

Comme Alohci note une meilleure façon serait d'utiliser le hack "* html", dans ce cas, le CSS pour "menu" devient:

.menu { 
    width: 14em; 
    position:absolute; 
    top: 0; 
    left: 0; 
} 

* html .menu { 
    left: -15em; 
} 
+0

Bonne idée. Ça semble fonctionner. Personnellement, je préfère utiliser le hack * html ou les commentaires conditionnels pour cibler IE6 plutôt que! Important car l'utilisation de! Important a des implications sur l'accessibilité, mais tout de même cool. – Alohci

0

THanks pour la position: idée absolue. C'est similaire à une solution que j'ai presque suivie.

Le problème ici est que le menu recouvrira le pied de page si le menu est plus long que le contenu (et c'est souvent le cas). Je pourrais essayer d'ajouter une hauteur arbitraire au contenu pour essayer de forcer une hauteur minimale, mais je ne saurai pas vraiment quelle sera la taille du menu. Il y a beaucoup de possibilités d'aller dans le panneau de côté dans ce domaine.

Je présume qu'il n'y a aucun moyen de forcer le conteneur positionné relatif de croître en réponse au contenu positionné absolu, n'est-ce pas? Même si c'est un hack IE6, car je peux utiliser la méthode float pour les autres navigateurs.

(Encore une fois, désolé pour ne pas poster ce commentaire comme mais je ne suis pas en option)

1

Trop tard, mais le plus souvent je reçois fixes en ajoutant flots ou une largeur absolue (un nombre en pixels , les points ou n'importe quel système de mesure dur à la place sur em,% et so) ou parfois pour mettre une propriété min-width le résout, aussi, méfiez-vous du padding et des bordures à cause de la somme boxmodel.

+0

http://www.positioniseverything.net/explorer/expandingboxbug.html – IsaacDM