28172 sujets

CSS et mise en forme, CSS3

Bonjour,

J'ai un vieux site dont la mise en page est faite avec des tableaux. Elle fonctionne à merveille mais je souhaite la modifier pour une structure CSS avec des <div>. J'ai bien avancé, je bute seulement sur quelques pièges de débutant. Vous pouvez sûrement m'aider.

Voici de quoi devrait avoir l'air la structucture du site :
upload/22633-structures.png

Et voici l'essentiel du code :

index.html :


<body>
  <div id="global">
    <div id="header"></div>
    <div id="titre"><p class="titre_section">Ceci est le titre</p></div>
    <div id="arche"></div>
    <div id="contenuEtMenus">
      <div id="menuGauche">Menu gauche</div>
      <div id="menuDroite">Menu droite</div>
      <div id="contenu">
        <div id="textes">Ici il y aura les textes.</div>
        <div id="footer">Pied de page</div>
      </div>
    </div>
</body>
</html>


fichier CSS :


html { background: #9A9A95 }

html, body {
  height: 100%;
  margin: 0;
}

div#global {
  background-color: #FF0000;
  min-height: 100%;
  width: 760px;
  padding: 0 0px;
  margin: 0 auto;
  position: relative;
}

div#header {
  background-color:#0000FF;
  color: #000000;
  height: 90px;
}

div#titre {
  background-color:#000000;
  color: #FFFFFF;
  height: 26px;
}

div#arche {
  background-color:#3333CC;
  height: 22px;
}

div#contenuEtMenus {
  background-color: #0000FF;
  width: 760px;
  padding: 0 0px;
  margin: 0 auto;
  position: relative;
}

div#menuGauche {
  height: 100%;
  background: url(images/fond.gif) repeat-x repeat-y;
  background-color:#D6D6CB;
  float: left;
  width: 107px;
}

div#menuDroite {
  height: 100%;
  background: url(images/fond.gif) repeat-x repeat-y;
  background-color:#D6D6CB;
  float: right;
  width: 107px;
}

div#contenu {
  width: 546px;
  padding: 0 0px;
  margin: 0 auto;
  position: relative;
}

div#textes {
  background-color:#FFFFFF;
  padding-bottom: 0px;
  overflow: auto;
}

div#footer {
  position: absolute;
  width: 546px;
  height: 20px
  bottom: 0;
  background: #00FF00;
}


Les couleurs de fond sont là juste pour débuguer.

Mon problème c'est que je ne trouve pas comment indiquer aux divisions d'occuper tout l'espace disponible en hauteur lorsque leur hauteur n'est pas définie de manière fixe. J'ai beau mettre height: 100%; ça ne donne rien.

Vous avez quelques suggestions pour m'aider ? Smiley biggrin
Modifié par leDeveloppeurWeb (02 Jul 2009 - 16:12)
Bonjour et bienvenue parmi nous Smiley smile

En tant que modérateur, je me dois de te faire remarquer que tu n'as malheureusement pas respecté l'une des Règles de base du forum qui est d'afficher les codes et exemples proprement à l'aide des boutons [ code]... ici ton code HTML, CSS, PHP, etc.[ /code] (sans espace).

upload/1-code.gif

Je te remercie par avance de bien vouloir éditer ton message afin de le rendre conforme à cette règle. Smiley cligne

D'ailleurs, je rappelle que le lien "Aide" qui apparaît tout en haut du forum est important. Il contient des pistes de recherche, des indications sur les règles de vie de la communauté, etc.
Il serait courtois de ta part de bien vouloir en prendre connaissance.


Concernant ton problème, je te conseille de jeter un œil aux gabarits de Florent (et plus particulièrement aux n. 10 et 11 qui correspondent à ce que tu souhaite faire).

Je me permet également une petite remarque concernant ton code HTML actuel. Une div id titre est une abération, les balises hn sont là pour définir les titre et doivent être utilisé pour structurer la hiérarchie d'une page.

Bonne continuation Smiley smile
Modifié par Laurie-Anne (02 Jul 2009 - 12:03)
Parfait, c'est corrigé.

En tout cas sachez que j'ai fouillé le web pendant des heures (dans les 2 chiffres!) pour réussir à faire la structure de site CSS que je vous présente (et qui est tout près du but). Y compris votre site, qui est super conu.

Les gabarits de Florent ? Ah bon, j'avais pas trouvé ça. Je vais regarder ça tout de suite. Smiley smile

[EDIT]
J'ai appliqué l'astuce des colonnes factices et ça fonctionne très bien. Mais franchement, c'est vraiment de la bidouille ! Autant rester en mise en page par tableaux ! Le CSS est encore loin de me permettre ce que je peux faire avec la mise en page par tableaux.

Il me reste un dernier problème à régler : celui du pied de page, qui est interne à la zone blanche de texte mais qui doit rester tout en bas de la page si le texte ne l'occupe pas entièrement. Comme sur le site d'origine. Vraiment pas évident à faire !
Modifié par leDeveloppeurWeb (02 Jul 2009 - 18:44)
leDeveloppeurWeb a écrit :
J'ai appliqué l'astuce des colonnes factices et ça fonctionne très bien. Mais franchement, c'est vraiment de la bidouille ! Autant rester en mise en page par tableaux ! Le CSS est encore loin de me permettre ce que je peux faire avec la mise en page par tableaux.


Bidouille ? Pas vraiment ! Utiliser un tableau pour mettre quelque chose en page, ça c'est de la bidouille.

Pour une solution moins "bidouillée" il existe display:table et display:table-cell mais ils ne sont pas pris en compte par IE6.
hi hi hi Je sens que je ne serai jamais d'accord avec ceux qui prônent la mise en page CSS, même si j'essaie de m'y plier, par principe de déontologie. En fait, le jour où CSS sera assez souple pour permettre de gérer correctement des height:100% et des vertical-align:center pour les blocs, je serai convaincu.

J'ai vu sur bon nombre de sites qu'il était question de cette fameuse solution (du display:table et display:table-cell) mais je n'ai pas bien compris comment l'appliquer. Alors j'ai laissé tomber. Je vais sûrement m'y remettre. Est-ce que vous avez un bon exemple quelque part ? En tout cas, tant pis pour IE6, je m'en fous. IE8 est sorti alors je me permets de croire que tout le monde est au moins sous IE7 (même si je sais que ce n'est pas vrai).

Normalement, lorsqu'on met height:100%, la div devrait occuper tout l'espace disponible dans la div parente. Mais ça ne fonctionne pas encore aujourd'hui, c'est pour ça que je m'énerve contre la mise en page en CSS.

Il faudrait que le Grand Florent ajoute un modèle qui ressemble au mien car aucun de ses modèles n'est récursif. Et je n'arrive pas à appliquer l'astuce de la colonne factice (avec l'image en background qui prend toute la place en repeat-y) dans une sous-div. Ça ne fonctionne que pour la div de premier niveau.

J'aimerais bien trouver un modèle quelque part qui ait un style un peu récursif :


<div avec en-tête, contenu et pied de page>
  Contenu de la div.
  <sous-div avec son propre en-tête, contenu et pied de page>
    Contenu de la sous-div.
    <sous-sous-div avec son propre en-tête, contenu et pied de page>
      Contenu de la sous-sous-div.
    </div>
    <sous-sous-div avec son propre en-tête, contenu et pied de page>
      Contenu de la sous-sous-div.
    </div>
  </div>
</div>


Une telle structure serait un très bon exemple de la gestion des sous-divisions avec tout l'espace que leur offre la division parente.
Modifié par leDeveloppeurWeb (02 Jul 2009 - 19:38)
Sur ton problème du footer : pourquoi ne le positionnes-tu pas en tant que fils direct de "global", sous les autres div, dans le flux HTML ?



<div id="global">
    <div id="header"></div>
    <div id="titre"><p class="titre_section">Ceci est le titre</p></div>
    <div id="arche"></div>
    <div id="contenuEtMenus">
        <div id="menuGauche">Menu gauche</div>
        <div id="menuDroite">Menu droite</div>
        <div id="contenu"></div>
    </div>
    <div id="footer">Pied de page</div>
</div>


Modifié par Nigel (03 Jul 2009 - 18:05)
J'ai finalement réglé le problème en adoptant l'astuce des colonnes factices. Pas eu le choix. Vous pouvez voir le résultat ici.

Là je travaille sur un autre site et je bute encore une fois sur un problème plus ou moins semblable. Comment faire pour qu'une <div> soit auto-extensible en hauteur en fonction de la hauteur des sous-div qu'elle contient ?

Exemple :


  <body>
    <div id="cadrePrincipal">
      <div id="titre">Ceci est le titre</div>
      <div id="textes">
        <p>paragraphe 1</p>
        <p>paragraphe 2</p>
        <p>paragraphe 3</p>
        <p>paragraphe 4</p>
        <p>paragraphe 5</p>
        <p>paragraphe 6</p>
        <p>paragraphe 7</p>
        <p>paragraphe 8</p>
        <p>paragraphe 9</p>
        <p>paragraphe 10</p>
      </div>
    </div>
  </body>




div#cadrePrincipal
{
  top :                5px;
  width:               1000px;
  margin:              auto auto;
  text-align:          left;
  color:               black;
  background-color:    white;
  position:            relative;
  background-image:    url(/img/banniere.jpg);
  background-repeat:   no-repeat;
  background-position: top center;
  overflow:            visible;
  -moz-border-radius:  15px;
}

div#titre
{
  position:         relative;
  width:            100%;
  height:           25px;
  top:              100px;
  background-color: #000000;
  color:            #FFFFFF;
  text-align:       center;
}

div#textes
{
  position:         relative;
  width:            96%;
  margin:           auto;
  top:              125px;
  color:            black;
  background-color: white;
}


Dans cet exemple, le cadre de texte sort du cadre principal, voilà ce que ça donne :

[EDIT Laurie-Anne : Image trop grande]http://i86.servimg.com/u/f86/11/26/74/38/bug_so10.gif

Le but c'est que le div conteneur s'agrandisse verticalement en fonction de la taille de ce qu'il contient. Ça n'existe pas en CSS ?

Il y a une solution pour les cas où le contenu est statique, il suffit de changer le height du bloc conteneur. Mais quand le nombre de lignes à afficher est inconnu (il viendra d'une requête MySQL en fait), comment faire ? Je bloque complètement.
Modifié par Laurie-Anne (30 Jul 2009 - 09:05)
Normal, ce n'est pas comme cela que ça marche.

Il y a deux solutions : soit tu rajoute un élément (span généralement) après tes éléments flottants avec la propriété clear:both soit tu donne au contenu une propriété d'overflow (valeur auto ou hidden).
La solution de l'overflow ça ne donne pas ce que je souhaite. Le hidden ça fait apparaître une scroll bar dans le bloc conteneur afin d'afficher ce qui est caché alors que moi, je veux que le bloc conteneur s'agrandisse. Et le auto, ça ne marche pas non plus, il y a toujours le "dépassement". Smiley fache

Pouvez-vous me donner davantage de détails ?
Au fait, petit détail : le site n'est pas encore en ligne, ce n'est qu'un prototype en développement sur mon ordi. C'est pour ça que je vous ai mis le code. Smiley cligne
leDeveloppeurWeb a écrit :
Pouvez-vous me donner davantage de détails ?


Je pense que relire l'article serait un plus, tout y est clairement expliqué avec des exemples concrets.