Bonjour,
j'ai un petit questionnement au niveau des flottants.
On a là un div (1) qui englobe :
un titre (h4)
deux div (2 et 3) que je voudrais mettre l'un à côté de l'autre.
Le 2 est donc flottant (à gauche).

Quand je mets une largeur de 50% au premier, les deux se collent bien côte à côte mais dès que je donne une largeur aux deux (2 et 3), le 3 descend sous le 2, peu importe les largeurs que je leur donne.(ex : 50% et 30%)

Je suis donc curieux de connaître la raison de ce comportement.

div 1
--------------------------------
|Titre h4 |
--------------------------------
|div 2 ex:50% |
|div 3ex:30%|
--------------------------------

par contre, étrangement si je mets le 2 à float:left et le 3 à float:right ,
ça marche mais ça me semble redondant comme écriture.


merci!
Modifié par gauguin (07 Mar 2006 - 13:08)
Il me semble que c'est un comportement normal.

Tu peux :
- mettre les deux en float: left
- mettre les deux en float: right (ce qui inverse l'ordre d'affichage sans inverser l'ordre du code... parfois bien pratique !)
- mettre le premier en float: left et le deuxième en float: right
- mettre le premier en float: right et le deuxième en float: left (ce qui inverse aussi l'ordre d'affichage)

Ou bien :
- mettre le premier en float left et le deuxième en positionnement static (pas besoin de le préciser, c'est la valeur par défaut) mais avec une marge à gauche de la largeur du bloc flottant + un peu de marge)
- mettre le premier en float right et le deuxième en positionnement static mais avec une marge à droite de la largeur du bloc flottant + un peu de marge)
Pour ce qui est de mettre le premier en static avec marge et le deuxième en float, je ne sais plus trop comment c'est géré, par contre.
Merci beaucoup pour tes réponses éclairantes,

Notamment le fait de pouvoir spécifier à présent la largeur des deux div (flottant et statique) sans que le statique ne "tombe" grâce à la marge gauche.

Mais permet moi d'abuser :

Sais-tu pourquoi cela réagit comme ça, c-à-d :
1- Pourquoi si je donne également, et sans mettre de marge gauche, une largeur au statique (3) qui suit le flottant (2) , le statique change de ligne
2-pourquoi devoir préciser une marge gauche (dans ce cas là) au static (3) qui suit le flottant (2) afin de pouvoir donner une largeur au deux div (2 et 3)

Les deux questions sont en fait une seule et même question tournée différemment pour essayer de me faire comprendre, étant novice et sur les forums et dans la création de site web.

ps : j'en profite pour remercier alsacréation de m'acceuillir sur ce forum et j'espère ne pas avoir à poser trop de questions facheuses.
Modifié par gauguin (07 Mar 2006 - 16:24)
Je commence par le post scriptum :
gauguin a écrit :
ps : j'en profite pour remercier alsacréation de m'acceuillir sur ce forum et j'espère ne pas avoir à poser trop de questions facheuses.

Non non, pour l'instant niveau questions ça va. Et puis c'est toujours un plaisir d'accueillir un grand artiste. J'adore votre dernier film, d'ailleurs Smiley cligne

gauguin a écrit :
Sais-tu pourquoi cela réagit comme ça, c-à-d :
1- Pourquoi si je donne également, et sans mettre de marge gauche, une largeur au statique (3) qui suit le flottant (2) , le statique change de ligne
2-pourquoi devoir préciser une marge gauche (dans ce cas là) au static (3) qui suit le flottant (2) afin de pouvoir donner une largeur au deux div (2 et 3)

Pour la première question j'avoue que je ne sais pas au juste, c'est surtout un comportement que je constate (d'ailleurs en général j'oublie que ça se passe comme ça, je fais ma mise en page et paf! ça ne marche pas, et c'est là que je me rappelle que.)

Par contre, pour la deuxième question je peux peut-être répondre.
Ce qu'il faut savoir pour commencer :
- un élément de type bloc flottant prend par défaut la largeur de son contenu ;
- un élément de type bloc statique prend par défaut 100% de la largeur disponible.

Maintenant, si dans un conteneur de largeur 600px on a en premier un bloc flottant à gauche de largeur 200px, il nous reste 400 pixels de large. En donnant 400px de large au deuxième bloc tout en le faisant flotter à gauche ou à droite, ça tiendra. Il faut savoir que si jamais il manquant un seul pixel, le deuxième bloc passerait à la ligne.

Mais revenons un peu en arrière : disons qu'on a un premier bloc (toujours 200px de large) flottant à gauche. Ou à droite, d'ailleurs. Bref, il flotte. Ce qui signifie concrètement :
- qu'il se place par dessus les éléments qui le suivent dans le flux (des paragraphes ou des listes, par exemple) ;
- qu'il repousse néanmoins, à l'intérieur de ces éléments, les objets de type en-ligne, dont le texte, les images, etc.
Il faudrait que je vérifie ce dernier point par des tests complets, mais c'est le comportement que j'observe.
Un objet flottant a donc un comportement différent d'un élément statique, mais aussi différent de celui d'un élément en positionnement absolu (que Dreamweaver appelle "calque" par analogie à ce qu'on trouve dans les applications graphiques : ça flotte par dessus (ou par dessous) sans la moindre interaction avec le reste).

Donc, si le deuxième bloc a une marge à gauche de la largeur du bloc flottant à gauche, ce bloc flottant flotte par dessus le deuxième bloc (la marge faisant techniquement partie du bloc, même si graphiquement ce n'est pas le cas). On a donc besoin de la marge à gauche pour créer l'impression graphique d'un élément qui se décale à droite.

Bon, à ce stade là je crois que je suis loin d'être clair Smiley lol ... moi-même je tâtonne...

En tout cas, pour répondre à ta question, donner une marge à gauche au premier bloc n'est pas nécessaire pour pouvoir donner une largeur aux deux blocs. C'est nécessaire pour créer l'impression graphique de deux blocs qui ne se chevauchent pas, et en gros c'est tout. Ensuite, on peut garder notre deuxième bloc avec une largeur automatique : dans notre exemple, on lui donnera une marge à gauche de 210px (par exemple), ce qui nous donnera une largeur totale de 600 - 210 = 390px.

Par contre, si nos deux blocs sont flottants, ils doivent tous les deux tenir dans la largeur disponible, sinon le deuxième passera à la ligne. Si on met le premier en flottant à gauche et le deuxième en flottant à droite, la seule solution sera d'avoir deux largeurs fixes ou relatives dont la somme fait 600px ou moins (en fixe) ou 100% ou moins (en relatif).
- Si donne une largeur fixe de 50% au premier bloc mais pas de largeur au deuxième bloc, le deuxième bloc prendra toute la largeur nécessaire à son contenu. Si ce contenu est du texte de plus de quelques mots, il est probable que ce deuxième bloc s'étende jusqu'à 100% de la largeur du conteneur. On aura donc au total 50% + 100% = 150%. Pas bon, ça passe à la ligne.
- Si on donne une largeur de 50% au premier bloc, et de 50% au deuxième, ça passe. On fera attention cependant aux bordures et aux blancs internes (padding), qui se rajoutent en plus de la largeur indiquée. Avec deux blocs de 50% ayant tous deux une bordure de 1px, on aura en tout (1px + 50% + 1px) + (1px + 50% + 1px) = 100% + 4px, soit 4 pixels de trop. Ça ne passe pas.

Voilà, j'espère que ça peut t'aider un peu, et que tu n'es pas dix fois plus perplexe maintenant qu'avant Smiley sweatdrop
Pour mieux voir tout ça, cette petite page :

http://web.covertprestige.info/test/07-colonnes-flottantes-et-place-dans-le-flux.html

C'est une page de tests que j'avais réalisé il y a quelques semaines, mais qui ne mettait pas bien en avant le chevauchement des blocs (lorsqu'un élément flottant repousse le texte des blocs statiques, mais pas pour autant les limites de ces blocs). Du coup, j'ai remplacé les fonds colorés des blocs et paragraphes par des images PNG (couleur unie) avec transparence. Du coup, maintenant c'est beaucoup plus clair. Sauf sur IE qui n'affiche pas correctement les PNG avec canal alpha (transparence).

EDIT: au passage, ça m'a permis de repérer deux bugs d'IE 6 (win) qu'il faudra que j'explore un peu plus tard Smiley biggol
Modifié par mpop (07 Mar 2006 - 21:01)
Je suis tout novice en css, mais il y a une astuce qui m'a permis d'avancer bien plus vite:
Perso pour mieux comprendre une structure qui réagit bizarrement , j'use et j'abuse du style "border" sur les éléments à prblm, et là tt s'éclaire ! On comprend l'interaction des éléments entre eux, ça ne règle pas le prblm mais ça te donne une orientation visuelle pour le résoudre.
Et comprendre…
lefelinherbivore a écrit :
Je suis tout novice en css, mais il y a une astuce qui m'a permis d'avancer bien plus vite:
Perso pour mieux comprendre une structure qui réagit bizarrement , j'use et j'abuse du style "border" sur les éléments à prblm, et là tt s'éclaire ! On comprend l'interaction des éléments entre eux, ça ne règle pas le prblm mais ça te donne une orientation visuelle pour le résoudre.
Et comprendre…


Pour un test fiable, mieux vaut utiliser des couleurs de fond plutôt que des bordures. Les bordures élargissent le bloc, et sous IE elles confèrent au bloc le layout (à ce qu'il me semble, j'ai un petit doute...). Enfin, elles peuvent modifier l'apparence du bloc en empêchant certaines fusion de marges. Bref, l'utilisation des bordures n'est pas inocente et introduit un paramètre qui fausse l'expérience.

Mais c'est vrai que dans beaucoup de situations c'est très pratique, surtout en le faisant automatiquement via l'extension webdevelopper pour Firefox...
Modifié par mpop (08 Mar 2006 - 21:40)
N'exagérons rien mpop, la méthode des bordures est une méthode de travail pas du tout idiote pour arriver à intuitionner les rapports entre les différents blocs. Même si elle a des limites dans "certaines circonstances" il n'y a pas à en faire un pensum. A chacun d'expérimenter et de se frotter aux rigueurs de la chose.
clb56 a écrit :
N'exagérons rien mpop, la méthode des bordures est une méthode de travail pas du tout idiote pour arriver à intuitionner les rapports entre les différents blocs. Même si elle a des limites dans "certaines circonstances" il n'y a pas à en faire un pensum. A chacun d'expérimenter et de se frotter aux rigueurs de la chose.

Relis mon message, je n'ai pas l'impression d'exagérer. Smiley cligne
Je précise d'ailleurs que c'est très pratique, mais je rappelle que ça peut changer certaines choses et fausser les paramètres. Je pense surtout à l'annulation de la fusion des marges.
Bonjour,

mpop a écrit :
Les bordures élargissent le bloc, et sous IE elles confèrent au bloc le layout (à ce qu'il me semble, j'ai un petit doute...).


La propriété border n'induit pas de haslayout.
Laurent Denis a écrit :
La propriété border n'induit pas de haslayout.

Oups, effectivement... j'ai fait la confusion avec un test que j'avais réalisé et où j'avais utilisé des blocs avec bordures ET une largeur fixe. La largeur fixe confère le layout, pas la bordure. Argh. Smiley sweatdrop
Ça m'apprendra à jouer au prof Smiley eek

Reste le problème de la fusion des marges, mais il n'est pas énorme non plus...
Modifié par mpop (09 Mar 2006 - 18:33)