J'ai un problème lorsque j'essaie de centrer les "produits" du bloc div car je ne connais pas à l'avance la largeur du div. Quelqu'un a une solution?
Mise à jour: Le problème que j'ai est que je ne sais pas combien de produits je vais afficher, je peux avoir 1, 2 ou 3 produits, je peux les centrer si c'était un nombre fixe car je connais la largeur du parent div, je ne sais tout simplement pas comment le faire lorsque le contenu est dynamique.
.product_container {
text-align: center;
height: 150px;
}
.products {
height: 140px;
text-align: center;
margin: 0 auto;
clear: ccc both;
}
.price {
margin: 6px 2px;
width: 137px;
color: #666;
font-size: 14pt;
font-style: normal;
border: 1px solid #CCC;
background-color: #EFEFEF;
}
<div class="product_container">
<div class="products" id="products">
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
</div>
</div>
Réponses:
Mise à jour du 27 février 2015: ma réponse d'origine continue d'être votée, mais maintenant j'utilise plutôt l'approche de @ bobince à la place.
Mon message d'origine à des fins historiques:
Vous voudrez peut-être essayer cette approche.
Voici le style correspondant:
JSFiddle
L'idée ici est que vous conteniez le contenu que vous souhaitez centrer en deux divisions, une externe et une interne. Vous faites flotter les deux div de sorte que leur largeur diminue automatiquement pour s'adapter à votre contenu. Ensuite, vous positionnez relativement la div externe avec son bord droit au centre du conteneur. Enfin, vous positionnez relativement la div intérieure dans la direction opposée de la moitié de sa propre largeur (en fait la largeur de la div extérieure, mais elles sont les mêmes). En fin de compte, cela centre le contenu dans le conteneur dans lequel il se trouve.
Vous pouvez avoir besoin de ce div vide à la fin si vous dépendez du contenu de votre "produit" pour dimensionner la hauteur du "product_container".
la source
overflow:hidden
pour.product_container
laouter-center
div chevauchera autres contenus à proximité à droite de celui - ci. Tous les liens ou boutons à droiteouter-center
ne fonctionneront pas. Essayez la couleur d'arrière-plan pourouter-center
comprendre la nécessitéoverflow :hidden
. Il s'agit d'une modification suggérée par Cicil ThomasUn élément avec 'display: block' (comme div est par défaut) a une largeur déterminée par la largeur de son conteneur. Vous ne pouvez pas faire dépendre la largeur d'un bloc de la largeur de son contenu (rétrécir pour s'adapter).
(Sauf pour les blocs qui sont «float: left / right» dans CSS 2.1, mais ce n'est pas utile pour le centrage.)
Vous pouvez définir la propriété 'display' sur 'inline-block' pour transformer un bloc en objet rétréci pour s'adapter qui peut être contrôlé par la propriété text-align de son parent, mais la prise en charge du navigateur est inégale. Vous pouvez surtout vous en tirer en utilisant des hacks (par exemple, voir -moz-inline-stack) si vous voulez aller dans ce sens.
L'autre voie à suivre est les tableaux. Cela peut être nécessaire lorsque vous avez des colonnes dont la largeur ne peut vraiment pas être connue à l'avance. Je ne peux pas vraiment dire ce que vous essayez de faire à partir de l'exemple de code - il n'y a rien d'évident là-dedans qui aurait besoin d' un bloc rétractable - mais une liste de produits pourrait éventuellement être considérée comme tabulaire.
[PS. n'utilisez jamais 'pt' pour les tailles de police sur le web. 'px' est plus fiable si vous avez vraiment besoin d'un texte de taille fixe, sinon les unités relatives comme '%' sont meilleures. Et "clear: ccc both" - une faute de frappe?]
JSFiddle
la source
display: inline-block
n'est pas pris en charge dans IE7 et les anciennes versions de FirefoxLa plupart des navigateurs prennent en charge la
display: table;
règle CSS. C'est une bonne astuce pour centrer une div dans un conteneur sans ajouter de code HTML supplémentaire ni appliquer de styles contraignants au conteneur (commetext-align: center;
ce qui centrerait tout autre contenu en ligne dans le conteneur), tout en conservant la largeur dynamique pour la div contenue:HTML:
CSS:
Afficher l'extrait de code
Mise à jour (2015-03-09):
La bonne façon de le faire aujourd'hui est en fait d'utiliser des règles flexbox. La prise en charge du navigateur est un peu plus restreinte ( prise en charge des tables CSS vs prise en charge de Flexbox ) mais cette méthode permet également bien d'autres choses, et est une règle CSS dédiée pour ce type de comportement:
HTML:
CSS:
Afficher l'extrait de code
la source
display: table;
variante est idéale pour les pseudo-éléments (::before
,::after
) où vous ne pouvez pas ajouter de balisage supplémentaire et vous voulez éviter de perturber les styles d'éléments adjacents.six façons d'écorcher ce chat:
Bouton un: tout élément de type
display: block
prendra la largeur totale des parents. (sauf si combiné avecfloat
ou undisplay: flex
parent). Vrai. Mauvais exemple.Bouton 2: aller pour
display: inline-block
entraînera une largeur automatique (plutôt que pleine). Vous pouvez ensuite centrer l'aidetext-align: center
sur le bloc d'emballage . Probablement le plus simple et le plus compatible, même avec les navigateurs `` vintage '' ...Bouton 3: pas besoin de mettre quoi que ce soit sur l'emballage. C'est peut-être la solution la plus élégante. Fonctionne également verticalement. (Le support du navigateur pour la traduction est assez bon (≥IE9) de nos jours ...).
Btw: également un excellent moyen de centrer verticalement des blocs de hauteur inconnue (en relation avec un positionnement absolu).
Bouton 4: positionnement absolu. Assurez-vous simplement de réserver suffisamment de hauteur dans le wrapper, car personne d'autre ne le fera (ni clearfix ni implicite ...)
Bouton 5: float (qui amène également les éléments de niveau bloc à la largeur dynamique) et un décalage relatif. Bien que je n'aie jamais vu ça dans la nature. Il y a peut-être des inconvénients ...
Mise à jour: Bouton 6: Et de nos jours, vous pouvez également utiliser la boîte flexible. Notez que les styles s'appliquent au wrapper de l'objet centré.
→ code source complet (syntaxe du stylet)
la source
J'ai trouvé une solution plus élégante, combinant "inline-block" pour éviter d'utiliser float et le hacky clear: les deux. Cela nécessite toujours des divs imbriqués, ce qui n'est pas très sémantique mais cela fonctionne juste ...
J'espère que ça aide!
la source
Si l'élément cible est absolument positionné, vous pouvez le centrer en le déplaçant de 50% dans une direction (
left: 50%
) puis en le transformant de 50% dans la direction d'opposition (transform:translateX(-50%)
). Cela fonctionne sans définir la largeur de l'élément cible (ou avecwidth:auto
). La position de l'élément parent peut être statique, absolue, relative ou fixe.la source
Par défaut, les
div
éléments sont affichés en tant qu'éléments de bloc, ils ont donc une largeur de 100%, ce qui les rend centrés sans signification. Comme suggéré par Arief, vous devez spécifier unwidth
et vous pouvez ensuite utiliserauto
lors de la spécificationmargin
afin de centrer adiv
.Alternativement, vous pouvez également forcer
display: inline
, mais vous auriez alors quelque chose qui se comporte à peu près comme unspan
au lieu d'undiv
, donc cela n'a pas beaucoup de sens.la source
Cela centrera un élément tel qu'une liste ordonnée, une liste non ordonnée ou tout autre élément. Enveloppez-le simplement avec un Div avec la classe de externalElement et donnez à l'élément interne la classe de innerElement.
La classe des éléments externes représente IE, l'ancien Mozilla et la plupart des nouveaux navigateurs.
la source
utiliser css3 flexbox avec justification-contenu: centre;
la source
Légère variation sur la réponse de Mike M. Lin
Si vous ajoutez
overflow: auto;
(ouhidden
) àdiv.product_container
, vous n'avez pas besoindiv.clear
.Ceci est dérivé de cet article -> http://www.quirksmode.org/css/clearing.html
Voici le HTML modifié:
Et voici le CSS modifié:
La raison pour laquelle il vaut mieux sans
div.clear
(à part le fait d'avoir un élément vide) est l'attribution de marge trop zélée de Firefox.Si, par exemple, vous avez ce html:
puis, dans Firefox (8.0 au moment de la rédaction), vous verrez une
11px
marge avantproduct_container
. Le pire, c'est que vous obtiendrez une barre de défilement verticale pour toute la page, même si le contenu correspond bien aux dimensions de l'écran.la source
Essayez ce nouveau CSS et balisage
Voici le HTML modifié:
Et voici le CSS modifié:
la source
Si vous ne fournissez pas "overflow: hidden" pour ".product_container", la div "centre extérieur" chevauchera les autres contenus à proximité à sa droite. Tout lien ou bouton à droite de "centre extérieur" ne fonctionnera pas. Essayez la couleur d'arrière-plan pour "centre extérieur" pour comprendre la nécessité de "débordement: caché"
la source
J'ai trouvé une solution intéressante, je faisais des curseurs et je devais centrer les contrôles des diapositives et je l'ai fait et ça fonctionne bien. Vous pouvez également ajouter une position relative au parent et déplacer la position de l'enfant verticalement. Jetez un œil http://jsfiddle.net/bergb/6DvJz/
CSS:
HTML:
la source
Faire
display:table;
et définirmargin
surauto
Bit de code important:
Peu importe le nombre d'éléments que vous avez maintenant, il s'alignera automatiquement au centre
Exemple dans l'extrait de code:
Afficher l'extrait de code
la source
J'ai peur que la seule façon de le faire sans spécifier explicitement la largeur soit d'utiliser des tables (haletantes).
la source
Correction de merde, mais ça marche ...
CSS:
HTML:
la source
Correctif simple qui fonctionne dans les anciens navigateurs (mais utilise des tableaux et nécessite une hauteur à définir):
la source
}
utiliser la durée de vie des divisions internes
la source
Je sais que cette question est ancienne, mais j'y prends une fissure. Très similaire à la réponse de Bobince mais avec un exemple de code fonctionnel.
Faites de chaque produit un bloc en ligne. Centrez le contenu du conteneur. Terminé.
http://jsfiddle.net/rgbk/6Z2Re/
Voir aussi: Centrer les blocs en ligne avec une largeur dynamique en CSS
la source
C'est une façon de centrer quoi que ce soit à l'intérieur d'un div sans connaître la largeur intérieure des éléments.
la source
ma solution était:
la source
ajoutez ce css à votre classe product_container
la source