Vous pouvez certainement le faire avec du css pur ou utiliser JavaScript. Ma suggestion :
-
Si vous savez déjà que le nombre d'images ne changera jamais, calculez simplement vos styles et utilisez du css simple (avantages : meilleures performances, très fiable).
-
Si le nombre peut varier dynamiquement dans votre application ou peut simplement varier à l'avenir, optez pour une solution Js (avantages : plus résistant à l'avenir).
J'avais un travail similaire à faire, alors j'ai créé un script et l'ai mis en libre accès. ici sur Github pour tous ceux qui pourraient en avoir besoin. Il accepte simplement quelques valeurs de configuration et produit simplement le code CSS dont vous avez besoin.
Si vous souhaitez opter pour la solution Js, voici un pointeur simple qui peut vous être utile. En utilisant ce html comme point de départ étant #box
le conteneur et .dot
l'image/div au milieu autour de laquelle vous voulez que toutes vos autres images soient placées :
html de départ :
<div id="box">
<div class="dot"></div>
<img src="my-img.jpg">
<!-- all the other images you need-->
</div>
Démarrage de Css :
#box{
width: 400px;
height: 400px;
position: relative;
border-radius: 100%;
border: 1px solid teal;
}
.dot{
position: absolute;
border-radius: 100%;
width: 40px;
height: 40px;
left: 50%;
top: 50%;
margin-left: -20px;
margin-top: -20px;
background: rebeccapurple;
}
img{
width: 40px;
height: 40px;
position: absolute;
}
Vous pouvez créer une fonction rapide de ce type :
var circle = document.getElementById('box'),
imgs = document.getElementsByTagName('img'),
total = imgs.length,
coords = {},
diam, radius1, radius2, imgW;
// get circle diameter
// getBoundingClientRect outputs the actual px AFTER transform
// using getComputedStyle does the job as we want
diam = parseInt( window.getComputedStyle(circle).getPropertyValue('width') ),
radius = diam/2,
imgW = imgs[0].getBoundingClientRect().width,
// get the dimensions of the inner circle we want the images to align to
radius2 = radius - imgW
var i,
alpha = Math.PI / 2,
len = imgs.length,
corner = 2 * Math.PI / total;
// loop over the images and assign the correct css props
for ( i = 0 ; i < total; i++ ){
imgs[i].style.left = parseInt( ( radius - imgW / 2 ) + ( radius2 * Math.cos( alpha ) ) ) + 'px'
imgs[i].style.top = parseInt( ( radius - imgW / 2 ) - ( radius2 * Math.sin( alpha ) ) ) + 'px'
alpha = alpha - corner;
}
Vous pouvez voir un exemple en direct aquí