Bonjour,
Je butte régulièrement sur le problème suivant :
On a une liste d'éléments HTML assez grands tous de même largeur (disons des span avec un css display:inline-block, mais cela pourrait être n'importe quoi d'autre et en particulier des images). On souhaite que ces éléments soient centrés dans leur conteneur (de largeur inconnue, celle-ci variant avec la taille de la fenêtre ouverte par l'internaute). Jusque-là, c'est facile : un text-align:center sur le conteneur suffit.
Mais si l'on se contente de ça, et si la dernière ligne contient moins d'éléments que les autres lignes, on obtient un effet pas terrible la plupart du temps, les éléments de cette dernière ligne étant eux aussi centrés. Et si au lieu d'un text-align:center, on fait un text-align:left, quand les éléments sont assez grands, l'effet n'est pas génial non plus.
On souhaiterait que l'ensemble soit centré, mais que sur la dernière ligne, le premier élément soit aligné avec le premier élément de la ligne du dessus,. Par exemple, pour une liste de 10 éléments, dont 4 tiennent dans la largeur du conteneur, on souhaiterait obtenir (l'ensemble étant centré dans son conteneur) :
XXXX
XXXX
XX
Et si l’internaute réduit sa fenêtre, avec par exemple 3 éléments seulement tenant dans la largeur du conteneur, on souhaiterait obtenir (l'ensemble étant toujours centré dans son conteneur) :
XXX
XXX
XXX
X
J'arrive à faire ça plus ou moins facilement en javascript : voir http://jsfiddle.net/tz01dt1s/, mais au prix d'un fatal manque de fluidité et d'un setTimeout dont on voudrait bien se passer).
Je recherche donc une solution en css pure (tous les coups sont permis, on peut rajouter des éléments HTML si besoin est, et on laisse tomber les vieux navigateurs).
Quelqu'un saurait-il faire ça ?
Note : idéalement, il faudrait ne pas avoir à supposer quoique ce soit sur la largeur du conteneur, et sur la largeur des éléments de la liste (tout ce qu'on sait étant qu'ils ont tous la même largeur). Si l'on connait cette largeur a priori, et si l'on connait le ratio largeur du conteneur par rapport à la largeur de la fenêtre, on pourrait éventuellement s'en sortir à coup de @media (max-width:...) {...}
Ci-dessous le code HTML (les <!-- --> permettant d'éviter la présence de blancs entre les éléments dans le rendu final. D'autres techniques pour supprimer ces blancs existent. j'ai choisis celle-là pour simplifier) :
Modifié par parsimonhi (09 Dec 2015 - 18:11)
Je butte régulièrement sur le problème suivant :
On a une liste d'éléments HTML assez grands tous de même largeur (disons des span avec un css display:inline-block, mais cela pourrait être n'importe quoi d'autre et en particulier des images). On souhaite que ces éléments soient centrés dans leur conteneur (de largeur inconnue, celle-ci variant avec la taille de la fenêtre ouverte par l'internaute). Jusque-là, c'est facile : un text-align:center sur le conteneur suffit.
Mais si l'on se contente de ça, et si la dernière ligne contient moins d'éléments que les autres lignes, on obtient un effet pas terrible la plupart du temps, les éléments de cette dernière ligne étant eux aussi centrés. Et si au lieu d'un text-align:center, on fait un text-align:left, quand les éléments sont assez grands, l'effet n'est pas génial non plus.
On souhaiterait que l'ensemble soit centré, mais que sur la dernière ligne, le premier élément soit aligné avec le premier élément de la ligne du dessus,. Par exemple, pour une liste de 10 éléments, dont 4 tiennent dans la largeur du conteneur, on souhaiterait obtenir (l'ensemble étant centré dans son conteneur) :
XXXX
XXXX
XX
Et si l’internaute réduit sa fenêtre, avec par exemple 3 éléments seulement tenant dans la largeur du conteneur, on souhaiterait obtenir (l'ensemble étant toujours centré dans son conteneur) :
XXX
XXX
XXX
X
J'arrive à faire ça plus ou moins facilement en javascript : voir http://jsfiddle.net/tz01dt1s/, mais au prix d'un fatal manque de fluidité et d'un setTimeout dont on voudrait bien se passer).
Je recherche donc une solution en css pure (tous les coups sont permis, on peut rajouter des éléments HTML si besoin est, et on laisse tomber les vieux navigateurs).
Quelqu'un saurait-il faire ça ?
Note : idéalement, il faudrait ne pas avoir à supposer quoique ce soit sur la largeur du conteneur, et sur la largeur des éléments de la liste (tout ce qu'on sait étant qu'ils ont tous la même largeur). Si l'on connait cette largeur a priori, et si l'on connait le ratio largeur du conteneur par rapport à la largeur de la fenêtre, on pourrait éventuellement s'en sortir à coup de @media (max-width:...) {...}
Ci-dessous le code HTML (les <!-- --> permettant d'éviter la présence de blancs entre les éléments dans le rendu final. D'autres techniques pour supprimer ces blancs existent. j'ai choisis celle-là pour simplifier) :
<div id="A"><!--
--><span>A</span><!--
--><span>B</span><!--
--><span>C</span><!--
--><span>D</span><!--
--><span>E</span><!--
--><span>F</span><!--
--><span>G</span><!--
--><span>H</span><!--
--><span>I</span><!--
--><span>J</span><!--
--></div>
Modifié par parsimonhi (09 Dec 2015 - 18:11)