当前位置: 首页 > 知识库问答 >
问题:

计算旋转HTML元素的原点

潘飞英
2023-03-14

我目前正在处理一个关于如何在元素旋转之前找到初始点的问题。

在我的项目中,我有两个div,它们不能在同一个容器中,这导致了我遇到的问题。

我试图计算一个已经旋转的元素的初始点,这样我就可以正确地将另一个元素放置在它上面,然后应用相同的旋转度。为了确保使用正确的坐标,我有一个div,它在每次旋转时都会标记一个小正方形。蓝色方块表示初始点,红色方块表示元素旋转的中心点。我以为Javascript中有公式,但似乎有问题。我离0度或180度越远,我的其他元素就离它应该在的地方越远。下面是我目前使用的公式。

var angle = (integer passed in to the function. Example: 45)
var rotatedX = blueBox.getBoundingClientRect().left;
var rotatedY = blueBox.getBoundingClientRect().top;
var centerX = redBox.getBoundingClientRect().left;
var centerY = redBox.getBoundingClientRect().top;

var dx = rotatedX - centerX;
var dy = rotatedY - centerY;

var toRadians = (Math.PI / 180);
var dx2 = dx * Math.cos(toRadians * angle) - dy * Math.sin(toRadians * angle);
var dy2 = dx * Math.sin(toRadians * angle) + dy * Math.cos(toRadians * angle);

var initialX = dx2 + centerX;
var initialY = dy2 + centerY;

elementToRotate.style.top = initialX + "px";
elementToRotate.style.left = initialY + "px";

//This just applies the CSS transform:rotate(45deg) to the element
elementToRotate.rotateDegrees(angle);

我最初在这里计算公式:HTML5 Canvas:旋转时计算x、y点

但我在让我的项目正常工作方面经历了一段艰难的时光。在此方面的任何帮助都将不胜感激。如果我需要提供任何其他信息,请告诉我。

http://jsfiddle.net/aSr7J/1/这是问题的关键所在。目标是计算黑色轮廓框内的水框。该计算适用于0度和180度,在45度时非常不正确。

共有2个答案

罗安和
2023-03-14

我尝试了一种不同的方法,但也许它可以帮助你。我没有真正计算旋转,我只是将相同的变换应用于另一个div并计算偏移量。这是我的jsfiddle演示。

注1:我不确定您使用的是jQuery,所以我没有使用它。但这会使转换拷贝更容易
注2:我在演示中使用了前缀,因此如果您使用其他浏览器,可能需要更改这些前缀。javascript代码也处理其他前缀。

代码为:

function alignRedToBlue() {
    var blue = document.getElementById("blue"),
        blueStyle = window.getComputedStyle(blue, null),
        red = document.getElementById("red"),
        props = ["transform", "-moz-transform","-webkit-transform", "-ms-transform", "-o-transform"],
        index, prop;
    for (index in props) {
        prop = props[index];
        red.style[prop] = blueStyle.getPropertyValue(prop);
    }
    red.style.top = blue.offsetTop + (blue.offsetHeight - red.offsetHeight) / 2 + "px";
    red.style.left = blue.offsetLeft + (blue.offsetWidth - red.offsetWidth) / 2 + "px";
}
叶琦
2023-03-14

差异的来源是如何测量垂直Y坐标。在html坐标中,正Y是向下的,而在数学中,它被假定为向上的。

为了说明这一点,只需更改以下两行:

var dy = rotatedY - centerY;

var dy = centerY - rotatedY;

和改变

var initialY = dy2 + centerY;

var initialY = centerY - dy2;

这是JSFiddle。

 类似资料:
  • 我想数一数一条流的不同元素,我想知道为什么 不行,日蚀告诉我 类型收集器中的方法toMap(Function,Function,BinaryOperator)不适用于参数((s)- 顺便说一句,我知道这个解决方案: 所以我有两个问题: 我的第一个方法有什么错误 编辑:我自己解决了第一个问题: Java需要一个函数作为第二个参数。

  • 问题内容: 我想知道旋转JavaScript数组的最有效方法是什么。 我想出了这个解决方案,其中一个正数将数组向右旋转,而一个负数向左(): 然后可以使用这种方式: 在下面的评论中指出的那样,我上面的原始版本有一个缺陷,那就是正确的版本(附加返回值允许链接): 是否有可能在JavaScript框架中更紧凑和/或更快速的解决方案?(以下任何一种建议的版本都不会更紧凑或更快速) 有没有内置数组旋转的J

  • 问题内容: 能够将常规元素临时转换为会非常有用。例如,假设我有一个想要翻转的样式。我想动态创建画布,将其“渲染” 到画布中,隐藏原始元素并为画布设置动画。 能做到吗 问题答案: 抱歉,浏览器无法将HTML渲染到画布中。 如果可能的话,这将带来潜在的安全风险,因为HTML可以包含来自第三方站点的内容(尤其是图像和iframe)。如果可以将HTML内容转换为图像,然后读取图像数据,则有可能从其他站点提

  • 问题内容: 是否有直接函数来计算CosmosDb查询中的不同元素? 这是默认计数: 和无数的独特作品: 但这会返回错误的请求-语法错误: 会和他们一起工作吗? 问题答案: 这是另一个解决地区问题并适用于的查询。基本上,您需要封装不重复内容然后进行计数。我们已经通过分页对它进行了测试,以查找您想要唯一记录的情况,而不仅是计数,而且它正在起作用。 您还可以根据条件所基于的内容,在括号的内部和外部使用子

  • 主要内容:HTML 元素,HTML 元素语法,嵌套的 HTML 元素,HTML 文档实例,HTML 实例解析,不要忘记结束标签,HTML 空元素,HTML 提示:使用小写标签HTML 文档由 HTML 元素定义。 HTML 元素 开始标签 * 元素内容 结束标签 * <p> 这是一个段落 </p> <a href="default.htm"> 这是一个链接 </a> <br> 换行   *开始标签常被称为起始标签(opening tag),结束标签常称为闭合标签(closing tag)。 HT

  • HTML 文档由 HTML 元素定义。 HTML 元素 开始标签 * 元素内容 结束标签 * <p> 这是一个段落 </p> <a href="default.htm"> 这是一个链接 </a> <br> 开始标签常被称为起始标签(opening tag) 结束标签常称为闭合标签(closing tag)。 HTML 元素语法 HTML 元素以开始标签起始 HTML 元素以结束标签终止 元素的内容