【问题标题】:Calculate Wheel Data XY Position计算车轮数据 XY 位置
【发布时间】:2020-04-12 00:27:16
【问题描述】:

我尝试使用 reactjs 创建一个幸运抽奖轮,首先,我需要将所有输入数据放置到某个 XY 位置。下面是我需要的预期输出 XY 位置示例。

var renderData = ["1","2","3","4","5","6","7","8","9","10","11","12"];
React.createElement('div', { className: '_data'},
    renderData.map((index,item)=>{
        var itemPosition = index / renderData.length * 360;
        var itemX = itemPosition * Math.PI/180;
        var itemY = itemPosition * Math.PI/180;
        return React.createElement('div', { className: '_items',
            style:{top:itemX,left:itemY}
        },item);
    })
)

所以我使用createElement 为每个数据创建div,然后使用topleft 作为XY 位置。

如何计算每个div的XY位置

更新

尝试@keikai 回答后

var renderData = ["1","2","3","4","5","6","7","8","9","10","11","12"];
const r = 350;
const len = renderData.length;
const radiusList = renderData.map(x => (360 / len) * (x - 1));
const positionPairList = radiusList.map(x => ({
        x: Math.sin((Math.PI * x) / 180) * r,
        y: Math.cos((Math.PI * x) / 180) * r
}));
React.createElement('div', { className: '_data'},
    renderData.map((item, index) => {
        return React.createElement('div', { className: `_items`,
            style:{top:`${positionPairList[index].x.toFixed(2)}px`,left:`${positionPairList[index].y.toFixed(2)}px`}
        },item);
    })
)

  1. 所有数据都旋转0度
  2. 子 div 仍然没有放在父 div 内的正确位置
  3. 顺时针从10开始?

【问题讨论】:

  • 这能回答你的问题吗? How to get x, y distance from a circle
  • @keikai 您提到的链接,为计算提供了 45 度,我不确定如何计算每个数据的每个度数,因为输入数据长度也可能不同。
  • 只需将45 替换为您计算出的天使即可。
  • @keikai,正如上面的评论,我提到我不确定如何计算每个数据的每个度数

标签: javascript html css reactjs styles


【解决方案1】:

更新:使用时钟样式旋转显示

import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";

function App() {
  const n = 12;
  const r = 500;

  const radiusList = Array.from(Array(n).keys()).map(x => (360 / n) * x);
  const positionPairList = radiusList.map(item => ({
    x: Math.sin((Math.PI * item) / 180) * r,
    y: Math.cos((Math.PI * item) / 180) * r
  }));
  return (
    <div className="App">
      {positionPairList.map((item, index) => {
        const offset = index === 0 ? n : 0;
        return (
          <div
            className="Parts"
            style={{
              top: `${r - item.y.toFixed(0)}px`,
              right: `${r + 200 - item.x.toFixed(0)}px`,
              transform: `rotate(${radiusList[index]}deg)`
            }}
          >
            {index + offset}
          </div>
        );
      })}
    </div>
  );
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

【讨论】:

  • 您好,感谢您发布答案,尝试您的答案时我面临两个问题,1)所有数据都旋转 0 度 2)值 r 不等于 div 父级的宽度对吗?因为我的轮子是一个大圆 div(例如 700px),我尝试将一半 350px 的值设置为 r,但子 div 仍然没有放在父 div 内的正确位置
  • 好的,然后忘记 0deg,我通过尝试你的答案更新了我的问题,x 和 y 仍然不正确的位置,我使用你的 x 和 y 作为顶部和左侧,它不匹配父 div
  • 顺时针为什么从 10 开始?
  • 我可以将您标记为正确,看来您的回答确实很有帮助,但它应该从 1 而不是 12 开始,虽然它是时钟明智的,但不是时钟格式,对此感到抱歉
  • @FeelRightz 如果你想从 1 开始,把上面的offset 去掉就行了。
猜你喜欢
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多