28172 sujets

CSS et mise en forme, CSS3

Bonjour, j'essaie tant bien que mal de centrer plusieurs boîtes et de les aligner sur une même ligne, sans retour à la ligne donc.

.flottante {
    background-color : #00ff00;
    border-color : #ffff00;
    border-style : dotted;
    border-width : 2px;
    float : left;
    margin : 2px;
    position : relative;
    text-align : center;
    width : 100px;
  }


.conteneur {
    width: 100%;
    text-align: center;
  }


.spacer {
    clear: both;
  }



<div class="conteneur">
  <div class="flottante">boîte verte 1</div>
  <div class="flottante">boîte verte 2</div>
  <div class="flottante">boîte verte 3</div>
  <div class="spacer">&nbsp;</div>
</div>

Rien à faire, je n'arrive pas à mettre les boîte au centre du conteneur, elles sont alignées à partir de la gauche...
Comment faire ?
Modérateur
bonsoir,

ne pas utilisé la propriété 'float' , qui éjecte à gauche ou à droite l'élément ainsi positionné , il ne sont pas 'centrable' naturellement tant horizontalement dans leur conteneur parent que verticalement par rapport à leurs éléments adjacent.

Le centrage horizontale peut s'appliquer a un élément de type block , dimensionné en largeur et en marge auto (en mode standard pour IE , en passant) . Pour un tableau on peut omettre les dimensions de largeurs. 1 seul élément block se positionnera sur cet axe horizontal .

Le 'text-align:center; s'applique aux textes , images et éléments de type inline , Le display:inline-block; devrait en principe permettre de de donné cette possibilité de mise en forme a touts elements en gardant la possibilité de dimensionné ceux-ci.

Firefox ne comprends pas cette règle et Internet explorer (version 7 à ce jour dispo) implémente cette propriété différemment.

En bref ce que tu veux n'est pas vraiment possible à l'heure actuelle dans l'ensemble des navigateurs (ça évolue vite quand-même Smiley smile ).

Si tu aime 'le risque' , voici une bidouille qui brut comme ça peut sembler satisfaisante:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>test centrage</title>
<style type='text/css'>

.flottante {
   background-color : #00ff00;
   border-color : #ffff00;
   border-style : dotted;
   border-width : 2px;
   margin : 2px;
display:table-cell;/* gecko */
display:inline-block; /* selon w3c  */
   width : 100px;
vertical-align:middle;
  }

.conteneur {
border-spacing:2px;
text-align:center;
display:table;/* pour tous exepté IE */
margin:auto;

 }

.spacer {
    clear: both;
  }

</style>

<!--[if IE]>
<style type="text/css">
.flottante {
 display:inline;
zoom:1;
}
</style>
<![endif]--> 

</head>
<body>

<div class="conteneur">
  <div class="flottante">boîte verte 1</div>
  <div class="flottante">boîte verte 2</div>
  <div class="flottante">boîte verte 3<br/>yrtyty</div>
  <div class="spacer">&nbsp;</div>
</div>

</body>
</html>


mise en forme a l'aide de display:table; et margin auto; pour tous les navigateurs exepté IE. , puis un display:table-cell ; pour Les gecko surchargé d'un display:inline-block .

Pour IE un display:inline-block; revisité en mode standard pour les éléments de type block (haslayout forcé).

Un br dans la 3eme boite pour te donner un aperçu des différences , pour percevoir un peu plus les différences , applique des bordures au conteneurs et des couleurs de fond. , multiplie le nombre de boite j...

Si les besoin de mise en forme reste sobre , les boites trés peu nombreuses, cela peut peut-etre te convenir ... Les gecko (Firefox entre autres) auront un comportement différents.

GC
Modifié par gcyrillus (15 Mar 2008 - 22:07)
Salut,

Tu mets le tout dans un conteneur susceptible de les contenir (attention aux bordures) que tu centres avec margin: auto; Smiley cligne
Tu peux remplacer les div .flottante et .spacer par des span et enlever le float, bien sur ça dépend de ce que tu veux mettre dans les boites. À noter que width:100% sur le .conteneur ne semble pas nécessaire, le div prend par défaut toute la place.
Modérateur
bonsoir
mumblefoot a écrit :

Tu peux remplacer les div .flottante et .spacer par des span et enlever le float, bien sur ça dépend de ce que tu veux mettre dans les boites. À noter que width:100% sur le .conteneur ne semble pas nécessaire, le div prend par défaut toute la place.


Ce qui ne reglera pas le probleme , la demande , c'est 3 éléments auxquels on donne une dimension (ici 100px de largeur) sur un même plan horizontal avec un comportement similaire a du texte ou des images.
ghost a écrit :
Salut,

Tu mets le tout dans un conteneur susceptible de les contenir (attention aux bordures) que tu centres avec margin: auto; Smiley cligne


vi , un tableau 3 colonnes Smiley cligne sans largeur prédefinie ... les cellules peuvent alors prendre largeur et bordure avec un border-spacing en lieu et place des marges des 3 boites.

Dommage qu'un simple display:inline-block; ne passe pas bien partout Smiley smile

GC
@gcyrillus

Le width des boites est fixe (100px) , margins, borders connus, on ne peut pas les inclures dans un bloc de taille fixe qui va bien, centré margin: auto; ?
Modérateur
on peut aussi forcé le conteneur en width:300px + les marges et y laisser les 3 div en flottants a l'interieur.

ça marche aussi , bien que ce soit un peu plus 'rigide' , il faudra penser a ajouter un overflow:hidden; et un display:inline; pour contrecarrer quelques bug de IE .

on peut aussi regardé du coté du centrage a l'aide des marges négatives (voir les gabarits d'alsacréations).

Une fois de plus , je pense que le probleme enoncé et le contexte dans lequel les solutions possibles serait utilisé ne sont pas assez claire.

Se limite t'on a 3 boites et un contenu statique ? , le conteneur affiche t-il un fond graphique .... la structure html est-elle imposée ou s'agirait t-il d'une liste de lien , d'un titre et paragraphes , ou ... ?

Je n'ai relevé qu'un comportement inline pour 3 éléments que l'on veut quand même de taille définie. Je me suis orienté vers une soluce presque 'passe-partout' , sauf pour cecko qui lui reprendra un comportement de tableau Smiley smile a defaut d'appliqué le inline-block.

En fait , plusieurs techniques seraient applicables pour obtenir ce résultat .

Le inline-block finira par etre implémenté dans tout les navigateurs , autant le prendre en considération et en parler Smiley smile .

GC
Bonsoir, et merci de votre aide,
Il s'agit d'aligner plusieurs vignettes d'images, de largeur différentes, mais de même hauteur.
Je me retrouve souvent confronter à ce problème de centrage d'un div et d'adaptation en largeur à son contenu... (comportement d'un tableau en somme..)
gcyrillus, ta méthode fonctionne très bien, merci ! Smiley smile
Modifié par Sekisushai (17 Mar 2008 - 00:10)