Bonjour à tous!
Je n'ai que de modestes connaissances en HTML+CSS (c'est comme vous pouvez le voir mon premier post sur ce forum que je visite en anonyme depuis quelques temps), & j'ai une question à vous proposer. Smiley biggrin
J'ai un code de ce genre:

  [...]
  <style type="text/css">
    div {
      border: 3px dashed;
    }
    div .contenu {
      float: left;
    }
  </style>
</head>
<body>
<div><!-- contenant -->
<div class="contenu">
11111111<br />
11111111<br />
11111111
</div>
<div class="contenu">
22222222<br />
22222222
</div>
</div>
33333333<br />
33333333
[...]

http://img161.imageshack.us/img161/2216/alsacreationyk4.png
Le hic, c'est que j'aimerai bien que le 3ème texte (333333...) se trouve sous le premier texte, un peu comme si le div contenant s'adaptait aux deux div contenus, & renvoyait à la ligne après lui. Mais (& c'est là ma petite requête Smiley ravi ), je ne souhaite pas utiliser d'artifice (genre spécifier une largeur, que ce soit en % ou en px, ni utiliser du javascript). Alors, forcément, si j'utilisais une <table>, ce serait du piece of cake Smiley murf , mais existe-t-il un moyen de le faire sans cet element?
Je voudrai également ne pas à avoir à entourer mon texte 3333. par un div, car ce n'est pas forcément du texte qui va se placer là, & disons que je souhaiterais faire comme si je n'avais pas la main dessus. Ceci dit, plus je réédite ce thread, plus j'ai l'impression que ce que je demande est peut-être contre l'esprit du couple div/CSS?! Smiley rolleyes
En fait, ce qui m'arrangerait, ce serait un comportement du type ceci:
http://img152.imageshack.us/img152/3584/alsacreation2qq2.png
(honteusement simulé avec une hauteur codée en dur dans le div contenant)
PS: j'accepte d'avance toute insulte pour non lecture de l'intégralité des FAQs & liens proposés sur ce site, j'en ai tellement lu, mais probablement pas tous.
Bonne journée à vous! Smiley cligne
Modifié par PacteNovation (07 Jun 2007 - 10:47)
Salut,

Il te suffirait d'ajouter
clear: left;

à la <div> contenant les 3. Du coup elle n'acceptera plus aucun élément à sa gauche, et passera ainsi naturellement en dessous.

Pour ne pas encadrer cette <div> avec une bordure, il vaudrait mieux faire l'inverse de ce que tu fais :

    div {
    }

    div .contenu {
      border: 3px dashed;
      float: left;
    }


Par défaut les <div n'auront donc pas de bordure, ce qui va s'appliquer à toutes, puis tu vas spécifier que les bordures de classe contenu doivent l'avoir, ce qui va donc s'appliquer aux <div> 1... et 2...

Juste pour éviter une mauvaise manière de penser, div/css n'est pas un "couple". Cela donnerait à penser qu'un site au standards ne se ferait qu'en remplaçant des tableaux par des divs, ce qui n'est absolument pas le cas.
Modifié par Mikachu (07 Jun 2007 - 09:43)
Bonjour,

On pourrait dire aussi (genre les chiffres & les lettres Smiley smile )

A priori tu ne veux pas mettre de div autour des "3". C'est étrange puisqu'une div peut contenir ce que tu voudras (textes, images, ...), donc tu n'as pas à avoir "la main dessus" comme tu dis ?

Mais si tu persistes, en fait il te faut spécifier un élément (ici j'ai mis un div.pied) qui viendra "gonfler" la hauteur de ton contenant sur tes contenus et permettra donc d'envoyer tout ce qui suit en dessous de ce contenant.

Après, tu peux me dire que c'est un artifice, mais ce n'est ni des hauteurs ni du javascript Smiley smile



<style type="text/css">
	div {
		border: 3px dashed;
	}
	div .contenu {
		float: left;
	}
	div .pied {
		border: none; clear: both;
	}
</style>
</head><body>
<div>
  <!-- contenant -->
  <div class="contenu">
  	11111111<br />11111111<br />11111111
  </div>
  <div class="contenu">
  	22222222<br />22222222
  </div>
  <div class="pied"> </div>
</div>
33333333<br />
33333333


PS: +1 pour Mikachu sur tes grosses bordures par défaut, j'ai repris ton code mais fais plutôt comme lui Smiley smile
Salut & merci pour vos réponses. Smiley cligne J'ai mis à jour mon post pendant que vous écriviez.
Alors, pour les bordures, c'est uniquement pour bien visualiser le div, rien d'autre. Smiley biggrin
@Mikachu: je n'ai justement pas de div contenant les 3333. Mais si c'était le cas, effectivement ta solution serait parfaite. Quand je parlais du couple div/CSS, je ne voulais pas dire que div ne s'applique qu'avec du CSS, & que du CSS ça ne s'utilise qu'avec du div. Smiley smile Je voulais simplement dire que je n'ai probablement pas saisi à 100% la signification (l'essence) du positionnement CSS (block, inline, etc...).
@GrOlivier: on est d'accord, ta solution marche également, même si c'est effectivement ce que j'appelle un artifice. Smiley cligne (tu avais deviné)
OK, je vais essayer de reformuler ma question alors (je pense que la réponse sera simplement un "non" pur & simple, mais je tente quand même). Est-il possible de faire un code tel que j'obtienne ce résultat (cf mon premier post):
http://img152.imageshack.us/img152/3584/alsacreation2qq2.png
en ne modifiant pas mon code HTML, mais disons uniquement le style? (ou alors en remplaçant l'element contenant (le <div>) par une autre balise plus adaptée (qui ne soit pas <table>, évidemment Smiley biggol ). J'aimerait bien que mon div contenant adapte sa hauteur (je me moque de sa largeur) à son contenant, ce qui est le cas si son contenant est du texte, mais manifestement pas le cas si son contenant est des elements <div>.
Voilà, merci à vous! Smiley biggrin
PS: en tous cas merci messieurs, j'ignorais totalement l'existence de la propriété clear.
Modifié par PacteNovation (07 Jun 2007 - 10:10)
GrOlivier a écrit :
il te faut spécifier un élément (ici j'ai mis un div.pied) qui viendra "gonfler" la hauteur de ton contenant sur tes contenus et permettra donc d'envoyer tout ce qui suit en dessous de ce contenant.

Ça ou tout autre moyen d'éviter le dépassement des flottants afin que le div contenant (qui n'a pas de classe ou d'identifiant ? ça n'est pas bien pratique...) vienne contenir les flottants.

Voir ici pour plus de détails :
http://web.covertprestige.info/test/03-elements-flottants-et-element-parent-1.html

(Un overflow: hidden sur ce fameux conteneur peut faire l'affaire...)
C'est justement mon problème:
"web.covertprestige.info" a écrit :
Les éléments flottants (à l'aide de la propriété CSS float) ne sont plus pris en compte dans le calcul de la hauteur de leur élément parent[...]

Pour la classe de l'élément contenant, on peut bien évidemment en rajouter! Smiley smile
Pour l'overflow: hidden, j'ai tenté, ça ne m'a appliqué aucun changement (manifestement, le hidden ne s'applique qu'au contenu du genre texte, mais pas sur des contenus div si je ne m'abuse).
Bon, disons que mon code ressemble à ceci:
  <style type="text/css">
    div {
      border: 3px dashed; /* pour voir les bordures à des fins de tests uniquement */
    }
    div .contenant {
      /* que mettre ici? */
    }
    div .contenu {
      /* que mettre ici? */
      float: left; /* à remplacer si nécessaire */
    }
  </style>
</head>
<body>
<div class="contenant">
<div class="contenu">
11111111<br />
11111111<br />
11111111
</div>
<div class="contenu">
22222222<br />
22222222
</div>
</div>
33333333<br />
33333333

Est-il possible d'obtenir le comportement demandé? S'il faut se débarrasser de float: left, alors je veux bien le laisser tomber, mais alors que mettre à la place? J'ai bien l'impression que ce que je demande n'est pas faisable en gardant un code tel que je le demande.
Pour vous expliquer ma problématique (très rapidement sans entrer dans les détails), mon contenu HTML est généré par des JSP indépendantes les unes des autres; le seul impréatif & que chaque JSP sait que son contenu se trouve dans un bloc body, en début de ligne. Exemple:
<html>
<head>[...]</head>
<body>
[contenu JSP1]
[contenu JSP2]
...
[contenu JSPn]
</body>
</html>

C'est donc pourquoi je ne peux pas englober ce qui suit pas un div, car je n'ai pas la main dessus. Mais sinon je suis d'accord avec vous, ça semblerait la meilleure idée.
PacteNovation a écrit :
J'aimerait bien que mon div contenant adapte sa hauteur (je me moque de sa largeur) à son contenant, ce qui est le cas si son contenant est du texte, mais manifestement pas le cas si son contenant est des elements <div>

Ça n'a rien à voir avec le fait que le contenu est du texte anonyme (sans élément HTML pour l'englober) ou des div. C'est une des conséquences du positionnement flottant.

Edit : ton test avec overflow: hidden étant probablement faux, vu que ton sélecteur CSS est faux.
Version corrigée :
div {
    border: 3px dashed; /* pour voir les bordures à des fins de tests uniquement */
}
div.contenant {
    overflow: hidden;
}
div.contenu {
    float: left;
    /* il faudra probablement fixer une largeur, par exemple en pourcentages */
}

Attention : l'espace qu sein d'un sélecteur CSS est un caractère spécial qui signifie « enfant ou descendant de... ». Le sélecteur div .contenant vise tout élément portant la classe "contenant" est qui serait enfant ou descendant d'un élément div. Le sélecteur div.contenant vise tout élément div qui aurait la classe "contenant".
Modifié par Florent V. (07 Jun 2007 - 10:39)
C'est ce que j'ai compris entre temps. Smiley biggrin (on a posté en même temps)
edit: oula, mais comment j'ai codé ça moi? Merci pour cette précision (que je connaissais déjà, mais manifestement pas suffisamment pour m'éviter cette erreur). Effectivement l'overflow: hidden rempli parfaitement son rôle.
Par contre, je n'ai pas encore tout-à-fait saisi le pourquoi du comment, mais OK. Smiley cligne
Un grand merci à vous trois.
Bon, le code résultant:
  <style type="text/css">
    div {
      border: 3px dashed; /* pour voir les bordures à des fins de tests uniquement */
    }
    div.contenant {
      overflow: hidden;
    }
    div.contenant div {
      float: left;
    }
  </style>
</head>
<body>
<div class="contenant">
<div>
11111111<br />
11111111<br />
11111111
</div>
<div>
22222222<br />
22222222
</div>
</div>
33333333<br />
33333333

gère parfaitement le resize, ou l'agrandissement par Ctrl +. Smiley biggrin
Précisons que ça marche avec Firefox/Opera/IE7, mais pas IE6.
Modifié par PacteNovation (07 Jun 2007 - 10:53)
PacteNovation a écrit :
Précisons que ça marche avec Firefox/Opera/IE7, mais pas IE6.

Voir le lien déjà donné sur le dépassement des flottants pour savoir comment gérer ça avec IE6. Dans l'idéal, on passera par un commentaire conditionnel (voir la FAQ) pour IE6 et inférieur...
Si on tiens à la compatibilité IE6, voilà à rajouter dans le <head>:
  <!--[if lt IE 7]>
  <style type="text/css">
    div.contenant {
      zoom: 1;
    }
  </style>
  <![ endif ]-->

Smiley cligne
Modifié par PacteNovation (07 Jun 2007 - 11:33)