// cx, cy - центр большого круга
// r - радиус большого круга
// alpha - угол в полярной системе координат
let x = cx + cos(alpha - PI/2) * r;
let y = cy + sin(alpha - PI/2) * r;
您可以使用调试器从此处拉出已完成的调试器svg,而不使用页面上的任何脚本。
let r1 = 500, // радиус большого круга
r2 = 12, // радиус маленьких кругов
step = 0.08, // шаг между кругами в радианах
cx = 150, // координаты центра
cy = r1 + 40; // большого круга
let icons = ['🍣','🍟','🍩','🍔','🍕','🍦','🍜'];
// функция, добавляющая круг, аргументы - x центра, y центра, радиус, классы стилей
let circle = (x,y,r,c) => `<circle r="${r}" cx="${x}" cy="${y}" class="${c}"></circle>`;
// функция, добавляющая текст, аргументы - x центра, y центра, текст
let text = (x,y,t) => `<text x="${x}" y="${y}">${t}</text>`;
let g = document.querySelector('svg g');
// большой круг
g.innerHTML += circle(cx, cy, r1, 'bg');
icons.forEach((e,i) => {
// тут я наверное слишком намудрил, сдвиг считается таким образом, чтобы расположить
// первый элемент по центру, а последующие поочередно справа и слева...
let shift = Math.floor(++i/2)* Math.sign(i%2-0.5)*step;
// считаем центры малых кругов
let x = cx + Math.cos(shift - Math.PI/2)*r1;
let y = cy + Math.sin(shift - Math.PI/2)*r1;
// малый круг
g.innerHTML += circle(x, y, r2, 'small');
// emoji icon вставляется обычным текстом
g.innerHTML += text(x, y+2, e);
});
// а это небольшой бонус дающий эффект интерактивности
addEventListener('mousemove', e => {
// вращаем всю группу элементов вокруг центра большого круга
g.setAttribute('transform', `rotate(${0.5-e.x/innerWidth}, ${cx} ${cy})`)
})
在这里,您可以
svg+css根据公式自动确定小圆圈在大圆圈上的位置。您可以使用调试器从此处拉出已完成的调试器
svg,而不使用页面上的任何脚本。PS:对我来说,这个选项很方便,因为你可以对它进行一些小改动,改变系数,就是这样......
这样的选择,但作为一种选择))