Si css3 est une option, cela peut être fait en utilisant le css calc()
fonction.
Cas 1: justification des cases sur une seule ligne ( VIOLON )
Le balisage est simple - un tas de divs avec certains élément conteneur.
CSS ressemble à ceci:
div
{
height: 100px;
float: left;
background:pink;
width: 50px;
margin-right: calc((100% - 300px) / 5 - 1px);
}
div:last-child
{
margin-right:0;
}
où -1px de fixer une IE9+ calc/arrondi bug - voir ici
Cas 2: justification des boîtes sur plusieurs lignes ( VIOLON )
Ici, en plus de l' calc()
fonction media queries
sont nécessaires.
L'idée de base est de mettre en place une media query pour chaque #colonnes unis, où je puis utiliser calc() pour travailler sur la marge de droite sur chacun des éléments (à l'exception de ceux dans la dernière colonne).
Cela ressemble à beaucoup de travail, mais si vous êtes en utilisant plus ou SASS cela peut se faire assez facilement
(Il peut encore être fait avec css normal, mais alors vous aurez à faire tous les calculs à la main, et puis si vous changez la largeur de la zone -, vous avez à travailler à nouveau le tout)
Ci-dessous un exemple d'utilisation de MOINS de: (Vous pouvez copier/coller ce code ici de jouer avec elle, [c'est aussi le code que j'ai utilisé pour générer le ci-dessus mentionné violon])
@min-margin: 15px;
@div-width: 150px;
@3divs: (@div-width * 3);
@4divs: (@div-width * 4);
@5divs: (@div-width * 5);
@6divs: (@div-width * 6);
@7divs: (@div-width * 7);
@3divs-width: (@3divs + @min-margin * 2);
@4divs-width: (@4divs + @min-margin * 3);
@5divs-width: (@5divs + @min-margin * 4);
@6divs-width: (@6divs + @min-margin * 5);
@7divs-width: (@7divs + @min-margin * 6);
*{margin:0;padding:0;}
.container
{
overflow: auto;
display: block;
min-width: @3divs-width;
}
.container > div
{
margin-bottom: 20px;
width: @div-width;
height: 100px;
background: blue;
float:left;
color: #fff;
text-align: center;
}
@media (max-width: @3divs-width) {
.container > div {
margin-right: @min-margin;
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @3divs-width) and (max-width: @4divs-width) {
.container > div {
margin-right: ~"calc((100% - @{3divs})/2 - 1px)";
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @4divs-width) and (max-width: @5divs-width) {
.container > div {
margin-right: ~"calc((100% - @{4divs})/3 - 1px)";
}
.container > div:nth-child(4n) {
margin-right: 0;
}
}
@media (min-width: @5divs-width) and (max-width: @6divs-width) {
.container > div {
margin-right: ~"calc((100% - @{5divs})/4 - 1px)";
}
.container > div:nth-child(5n) {
margin-right: 0;
}
}
@media (min-width: @6divs-width){
.container > div {
margin-right: ~"calc((100% - @{6divs})/5 - 1px)";
}
.container > div:nth-child(6n) {
margin-right: 0;
}
}
Donc, fondamentalement, vous devez d'abord décider d'une boîte de largeur et un minimum de marge que vous souhaitez entre les cases.
Avec cela, vous pouvez savoir combien d'espace vous avez besoin pour chaque état.
Ensuite, utilisez calc() pour calcuate la marge de droite, et nth-child pour supprimer la marge de droite des cases dans la dernière colonne.
L' avantage de cette réponse au cours de la accepté de répondre qui utilise text-align:justify
, c'est que lorsque vous avez plus d'une rangée de boîtes les boîtes sur la dernière rangée de ne pas se "justifier" par exemple: Si il y a 2 cases restantes sur la dernière rangée - je ne veux pas la première case de gauche et que le suivant sur la droite -, mais plutôt que les cases se suivent dans l'ordre.
Concernant la prise en charge du navigateur: Ce sera le travail sur IE9+,Firefox,Chrome,Safari6.0+ - (voir ici pour plus de détails) Cependant j'ai remarqué que sur IE9+, il y a un peu d'un problème entre les médias requête unis. [si quelqu'un sait comment résoudre ce problème que je voudrais vraiment savoir :) ] <-- FIXE ICI