围绕一个圆圈动态排列一些元素

IT技术 javascript jquery
2021-02-03 13:55:06

我正在寻找一个函数来围绕一个圆圈排列一些元素。
结果应该是这样的:

在此处输入图片说明

5个回答

以下是一些应该可以帮助您的代码:

var numElements = 4,
    angle = 0
    step = (2*Math.PI) / numElements;
for(var i = 0; i < numElements.length; i++) {
    var x = container_width/2 + radius * Math.cos(angle);
    var y = container_height/2 + radius * Math.sin(angle);
    angle += step;
}

它并不完整,但应该给你一个良好的开端。


更新:这里有一些实际有效的东西:

var radius = 200; // radius of the circle
var fields = $('.field'),
    container = $('#container'),
    width = container.width(),
    height = container.height(),
    angle = 0,
    step = (2*Math.PI) / fields.length;
fields.each(function() {
    var x = Math.round(width/2 + radius * Math.cos(angle) - $(this).width()/2),
        y = Math.round(height/2 + radius * Math.sin(angle) - $(this).height()/2);
    $(this).css({
        left: x + 'px',
        top: y + 'px'
    });
    angle += step;
});

演示:http : //jsfiddle.net/ThiefMaster/LPh33/
这是一个改进版本,您可以在其中更改元素计数。

您需要添加圆的坐标,并从x和 您y自己减去元素尺寸的一半
2021-03-20 13:55:06
@ThiefMaster,在你的名字后面有一颗钻石你还贪婪吗??:P
2021-03-26 13:55:06
你怎么知道循环在哪里?
2021-04-01 13:55:06
我真的很想了解这个。您能否在答案中用数学公式解释一下。漂亮请:)
2021-04-05 13:55:06
@Starx:听起来像是值得赏金的东西;)
2021-04-11 13:55:06

对于以 ( x , y )为中心的元素,距离为r,元素的中心应位于:

(x + r cos(2kπ/n), y + r sin(2kπ/n))

其中n是元素的数量,k是您当前定位的元素的“数量”(介于 1 和n之间)。

xyx * y数学中的意思相同
2021-03-27 13:55:06
将它们放在椭圆中的公式是什么?
2021-04-07 13:55:06

我将 ThiefMaster 的小提琴与 jQuery pointAt 插件结合起来:

演示:http : //jsfiddle.net/BananaAcid/nytN6/

the code is somewhat like above.
might be interesting to some of you.

在圆圈中排列元素 (Javascript)

function arrangeElementsInCircle (elements, x, y, r) {
    for (var i = 0; i < elements.length; i++) {
        elements[i].scaleX = 1 / elements.length
        elements[i].scaleY = 1 / elements.length
        elements[i].x = (x + r * Math.cos((2 * Math.PI) * i/elements.length))
        elements[i].y = (y + r * Math.sin((2 * Math.PI) * i/store.length))
    }
}

哪里x,y是点坐标,elements是要放置的元素数组,r是半径。

小偷大师答案的仅 Javascript 版本

function distributeFields(deg){
  deg = deg || 0;
  var radius = 200;
  var fields = document.querySelectorAll('.field'), //using queryselector instead of $ to select items 
      container = document.querySelector('#container'),
      width = container.offsetWidth,  //offsetWidth gives the width of the container
      height = container.offsetHeight,
      angle = deg || Math.PI * 3.5,
      step = (2 * Math.PI) / fields.length;
      console.log(width, height)
      
     //using forEach loop on a NodeList instead of a Jquery .each, 
     //so we can now use "field" as an iterator instead of $(this)

      fields.forEach((field)=>{
        var x = Math.round(width / 2 + radius * Math.cos(angle) - field.offsetWidth/2);
        var y = Math.round(height / 2 + radius * Math.sin(angle) - field.offsetHeight/2);
        console.log(x, y)
        field.style.left = x + 'px';  //adding inline style to the document (field)
        field.style.top= y + 'px';

        angle += step;
      })
}

distributeFields();
请在您的代码中添加注释以解释您的答案
2021-03-27 13:55:06
谢谢,加了评论
2021-04-09 13:55:06