28172 sujets

CSS et mise en forme, CSS3

Bonjour à tous,

J'ai un problème qui me semble tout bête à résoudre mais dont je ne trouve pas de solution.
Le problème est le suivant : je cherche à positionner une image à droite ou à gauche d'un bloc, le texte contenu dans ce bloc étant alors placé respectivement à gauche ou à droite de l'image. Pour information, le début du texte est aligné avec le bord supérieur de l'image.

Ce que j'ai fait pour l'instant est la chose suivante (le bloc en question correspond au bloc "bloc_cadre" dans mon code) :
HTML :

<body>
   <div id="corps">
      Blablabla
      <div class="bloc_cadre">
         <img src="image.jpg" alt="imagee" class="right" />
         Le texte ici.<br />
         Suite du texte...
      </div>
      Blablabla bis
   </div>
</body>


CSS :

html, body
{
   height:100%;
   width: 100%;
}

body
{
   margin: 20px 0;								/* Marges haute et basse à 20px pour éviter de coller avec le haut et le bas de la fenêtre du navigateur, marges droite et gauche à 0 */
   padding: 0;									/* Padding à 0 pour le navigateur Opera qui définit des padding par défaut pour le body */
   font: 100% "Comic Sans MS", "Trebuchet MS", sans-serif, serif;
   color: #fff;
   background: #5E5E5E url("images/fond.png");
}

#corps
{
   width: 95%;								/* Largeur du bloc qui contient l'ensemble de la page (height est définie plus loin) */
   max-width: 1200px;							/* Taille maximale du bloc, adaptée aux résolutions 1280x960 (ne fonctionne pas sous IE6 et versions inférieures, à placer dans le <head> de la page HTML). La taille doit également être supérieure à la longueur de la bannière */
   min-width: 760px;							/* Taille minimale du bloc, adaptée aux résolutions 800x600 (cf. max-width). */
   margin: 0 auto;								/* Pour centrer la page */
   margin-bottom: 20px;
   padding: 5px;
   padding-bottom: 20px;
   border: 2px solid black;						/* Bordure pour marquer les limites du corps de la page */
   background: #626262 url("images/motif.png");
   color: #B3B3B3;
}
/* On définit une hauteur minimale, fonctionnant également sous IE (qui ne sait pas traiter l'attribut min-height et interprète l'attribut heigth comme il devrait normalement interpréter l'attribut min-height) */
#corps
{
   height: 70%;								/* Fonctionne sur tous les navigateurs */
}
html>body  #corps							/* hack ne fonctionne pas sur IE */
{
   height: auto;								/* Surcharge l'instruction précédente */
   min-height: 70%;
}

#corps p {
   margin: 0;
   margin-left: 20px;
   margin-right: 20px;
   text-align: justify;							/* Alignement justifié */
   line-height: 1.7em;							/* Hauteur de ligne supérieure à l'état normal pour aérer le tout */
}

.bloc_cadre
{
   float: left;
   padding: 5px;
   border: 0;
   margin: 0 auto;								/* Pour centrer la page */
   margin-left: 20px;
   margin-right: 20px;
   text-align: justify;							/* Alignement justifié */
   line-height: 1.7em;							/* Hauteur de ligne supérieure à l'état normal pour aérer le tout */
}

img.right
{
   float: right;
   border: none;
   margin-left: 20px;
}

img.left
{
   float: left;
   border: none;
   margin-right: 20px;
}


Plusieurs tests, avec un texte relativement long, m'ont fait initialement pensé que tout allait bien. Mais lorsque j'ai voulu utilisé ce bloc avec un texte assez court, l'image finit par être centré dans mon bloc, le texte continuant lui à être placé à droite dans le cas d'un placement de l'image à droite. Dans le cas d'un placement à gauche, l'image est bien placée à gauche du cadre mais le texte stoppe au milieu de l'espace restant entre l'image et le bord droit du cadre au lieu d'aller complètement jusqu'au bord droit (moins les marges bien sûr).
L'effet est encore plus curieux avec un texte très court du style a<br />x, où a est placé en haut à droite de l'image (classe "right") et x est placé également à droite mais sous l'image au lieu d'être sous la lettre a.

J'ai l'impression d'oublier quelque chose dans l'histoire mais je ne vois pas quoi, et un peu d'aide ne serait pas de refus.

Merci d'avance!


Edit : Pour information, le positionnement semble correct en utilisant une balise <p> au lieu de <div class="bloc_cadre"> dans le cas où il n'y a rien d'autre à mettre sous l'image. En contrepartie bien sûr, l'image peut chevaucher la bordure basse du bloc "corps".
Modifié par SkyCorp (13 May 2009 - 00:35)
SkyCorp a écrit :
J'ai l'impression d'oublier quelque chose dans l'histoire mais je ne vois pas quoi

Une page de test en ligne pour visualiser le problème (idéal), une capture d'écran (limité mais ça serait déjà ça), etc.
Florent V. a écrit :

Une page de test en ligne pour visualiser le problème (idéal), une capture d'écran (limité mais ça serait déjà ça), etc.


Voici la première page que j'ai créée et qui avait l'air de fonctionner : page test 1
Et voici la page qui me pose problème, avec la même structure : page test 2. Dans ce cas, la première photo (avec l'effet désiré) utilise la balise <p> et la 2ème photo utilise la balise <div class="bloc_cadre"> ("bloc_cadre2" en réalité si vous étudiez le code source de la page).
Je précise que le problème se produit également sur la première page si je réduis la taille du texte dans le bloc "bloc_cadre".
Bonjour,

Le problème vient à priori du float: left sur le deuxième conteneur (<div class="bloc_cadre2">). Cette propriété est apparemment utilisée pour éviter le dépassements des flottants, mais c'est un peu casse-gueule ici. Faire se succéder plein de flottants, c'est rarement une bonne idée, surtout si on ne connait pas sur le bout des doigts les caractéristiques du positionnement flottant.

Pour empêcher le dépassement des flottants, un simple overflow:hidden;zoom:1; devrait suffire, en lieu et place du float:left.
(Note: le zoom:1 est là uniquement pour IE6. Je ne détaille pas, c'est une histoire de HasLayout assez compliquée. Le overflow:hidden, lui, créée un contexte de formatage qui empêche le dépassement des flottants.)

Pour finir, une autre solution assez simple aurait été d'utiliser des titres pour chaque partie du contenu, et d'utiliser un h2 {clear: both;} par exemple.
Modifié par Florent V. (01 Jun 2009 - 23:38)
Ca fonctionne très bien à présent, merci beaucoup Smiley smile
J'ai finalement opté par la seconde solution, bien plus simple à mettre en place et allégeant mon code html et ma feuille de style.

Mais je n'étais pas au courant qu'il était préférable d'éviter les imbrications des flottants. Comme quoi, il me reste encore beaucoup à apprendre. Mais je suis surpris que les tutoriels que j'ai suivis n'ont pas mentionner cela.
Aurais-tu un site web détaillant davantage float à me conseiller ?