28172 sujets

CSS et mise en forme, CSS3

Bonjour,

je souhaite donc réaliser une mise en page sur 2 colonnes dont la largeur sera fixée en % (e.g: 20% pour la colonne de gauche et 80% pour celle de droite). Le contenu de chaque colonne
sera fixe (e.g: 200px pour le contenu de la col gauche et 790px pour le contenu de la col droite).

Comme vous le voyez la largeur additionnée des 2 contenus (990px) permettra un affichage sans scrollbar horizontale pour les résolutions de largeur 1024 et supérieures.

Mon problème était d'éviter le chevauchement des 2 colonnes pour les résolutions inférieures à 1024.

Ci-dessous, un exemple qui fonctionne comme je le souhaite sous FF (les colonnes restent adjacentes en 800x600) mais pas sous IE8 (la colonne de droite passe sous celle de gauche).
Finalement, c'est le comportement adopté par IE qui me semble le plus logique.

Mais comme cela fonctionne avec FF, je voudrais savoir s'il est possible d'obtenir le même résultat avec IE.

Merci d'avance.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title></title>
  <link rel="stylesheet" media="screen" href="main.css" />
</head>
    <body>
        <div id="leftCol">col gauche
            <div id="leftContent">contenu col gauche</div>
        </div>
        <div id="rightCol">col droite
            <div id="rightContent">contenu col droite</div>
        </div>
    </body>
</html>



body {
    margin: 0;
}
#leftCol{
    float:left;
    width:20%;
    height:200px;
    min-width: 200px;
    background-color: #ddd;
}
#rightCol{
    width:80%;
    /* ff ne se pose pas de questions ici. Pourtant il me semble 'normal' que
    lorsque les 20% sont inférieurs au min-width de 200px de #leftCol, #rightCol
    passe en dessous avec ie*/
    margin-left:20%;
    min-width: 790px;
    height:200px;
    overflow:auto;
    background-color: orange;
}
#leftContent {
    width:200px;
    margin: 0 auto;
    padding:1px 0;
    background-color: #999;
}
#rightContent {
    width:790px;
    margin:20px auto 0 auto;
    background-color: red;
    color: #fff;
}

Modifié par pyd (21 Apr 2010 - 20:20)
Déjà, il faudrait doubler le margin:0; par un padding:0; pour l'élément body. Suivant le navigateur, le retrait interne du body va être soit un margin, soit un padding, donc il faut prévoir les deux.

Ensuite, si la fenêtre fait moins de 990px de large, alors le margin-left:20% de #rightCol va correspondre à une largeur inférieure à 200px (le min-width de #leftCol). Donc #rightCol va se retrouver en partie derrière #leftCol (comportement obtenu dans Firefox). J'aurais d'ailleurs attendu le même comportement dans IE8. Que #rightCol passe à la ligne dans IE7, ça me semble logique (conséquence du hasLayout), mais dans IE8 ça m'étonne.

Solution éventuelle: supprimer le margin-left de #rightCol, le faire flotter à droite ou bien utiliser un contexte de formatage pour qu'il soit repoussé par #leftCol, et ajouter un min-width:990px à body.
Modifié par Florent V. (21 Apr 2010 - 18:47)
Merci pour cette réponse.

édit: j'ai essayé #rightCol sans margin-left et en float right mais ca ne m'avait pas satisfait (je ne sais même plus pourquoi). Alors je continue Smiley smile Merci encore.

a écrit :

Donc #rightCol va se retrouver en partie derrière #leftCol (comportement obtenu dans Firefox). J'aurais d'ailleurs attendu le même comportement dans IE8.


En poursuivant mes expérimentations, je me suis aperçu que l'attribut overflow de #rightCol était à l'origine de cette différence de comportement lorsque la résolution est inférieure à 990px.

Lorsque l'attribut oveflow n'est pas défini:
- avec FF, #rightContent chevauche #leftCol;
- avec IE8, les colonnes restent adjacentes;
A l'inverse ( #rightCol {overflow:auto; } ):
- avec FF, les colonnes restent adjacentes;
- avec IE8, #rightCol passe sous #leftCol;

Finalement, j'obtiens (presque) ce que je souhaite avec un tableau. Mais javascript pourra sans doute me tirer d'affaire.
Modifié par pyd (21 Apr 2010 - 19:43)
Chapeau bas Monsieur V.

a écrit :

utiliser un contexte de formatage pour qu'il soit repoussé par #leftCol, et ajouter un min-width:990px à body


Le min-width sur le body... Je m'en souviendrai Smiley smile

Il ne me reste plus qu'à tester cela avec du contenu mais je suis déjà satisfait.

Mon problème est résolu.
Merci et bonne soirée.