变换后的宽度/高度

IT技术 javascript jquery html css
2021-02-01 18:28:28

应用后如何检索宽度和高度属性transform: rotate(45deg);

就像,旋转后的 11x11 正方形变为 17x17(Chrome 结果),但 javascript 仍然返回原始宽度/高度 - 10x10。

我如何获得这个 17x17?

4个回答

您可以通过HTMLDOMElement's获得它,而不是自己计算它getBoundingClientRect()

考虑到转换矩阵,这将返回一个具有正确height的对象width

js小提琴

@Userpassword 是的,jQuery 就是这样工作的。你需要使用[0]get(0)或类似的。
2021-03-22 18:28:28
这要简单得多。谢谢你。
2021-03-22 18:28:28
我只是让它正常工作。是的,我知道这个问题很老,但如果今天问这个问题,我相信这应该是公认的答案。
2021-04-08 18:28:28
同意其他人的意见。与其他过度设计/复杂的解决方案相比,这应该是可接受的答案。
2021-04-12 18:28:28
我知道这种类型的评论是不允许的,但我喜欢@alex 如何将 OP 的图片放到 jsfiddle 而不是一些随机图像 xD
2021-04-12 18:28:28

即使你旋转了一些东西,它的尺寸也不会改变,所以你需要一个包装器。尝试用另一个 div 元素包装您的 div 并计算包装尺寸:

  <style type="text/css">
  #wrap {
    border:1px solid green;
    float:left;
    }

  #box {
    -moz-transform:rotate(120deg);
    border:1px solid red;
    width:11px;
    height:11px;
  }
  </style>

  <script type="text/javascript">
  $(document).ready(function() {
    alert($('#box').width());
    alert($('#wrap').width());
  });
  </script>
</head>

<body>
 <div id="wrap">
  <div id="box"></div>
  </div>
</body>

编辑:包装器解决方案无法正常工作,因为包装器不会自动调整到内部 div 的内容。遵循数学解决方案:

var rotationAngle;

var x = $('#box').width()*Math.cos(rotationAngle) + $('#box').height()*Math.sin(rotationAngle); 
在解决这个问题的同时,我终于发现 javascript 中的 cos/sin 需要径向!不是度数!我希望我通过这条评论为某人节省了一点时间;)
2021-03-20 18:28:28
@Tom firefox 的行为与您描述的一样。首先,我们需要清楚的是,旋转后的盒子仍然具有相同的尺寸。就像,如果你在桌子上旋转一张纸,它的尺寸保持不变。这就是为什么你需要包装器。如果你负担不起,你需要数学来计算你需要的尺寸。同样的数学,firefox 在内部使用来计算 wrap 的尺寸。请在这里考虑我的 +1。
2021-03-23 18:28:28
是的,当你发布这个时,我已经做了一个计算新维度的函数。-1 表示 CSS3/DOM3/HTML5 不使用原生函数来检索这些基本值。
2021-04-04 18:28:28
数学解决方案适用于宽度,我该如何计算高度?
2021-04-07 18:28:28
也许在 Firefox 中它不会改变,但检查器视图中的 Chrome 显示计算值。Wrapper 是一个很好的解决方案,但它很昂贵。
2021-04-13 18:28:28

我为此做了一个函数, domvertices.js

它计算任何、deep、transformed、positioned DOM 元素的 4 个顶点 3d 坐标——实际上只是任何元素:参见DEMO

a                b
 +--------------+
 |              |
 |      el      |
 |              |
 +--------------+
d                c

var v = domvertices(el);
console.log(v);
{
  a: {x: , y: , z: },
  b: {x: , y: , z: },
  c: {x: , y: , z: },
  d: {x: , y: , z: }
}

使用这些顶点,您可以计算以下任何内容:宽度、高度...例如,在您的情况下:

// norm(a,b)
var width = Math.sqrt(Math.pow(v.b.x - v.a.x, 2) + Math.pow(v.b.y - v.a.y, 2));

有关更多信息,请参阅自述文件

——

它作为 npm module发布(没有 dep),所以只需安装它:

npm install domvertices

干杯。

凉爽的!一个非常好的补充将是widthheight(或w,h)对于我们这些记得数学不太好的人;) 即使function如果你想避免不使用计算s 也会很棒。
2021-04-11 18:28:28

如果您正在寻找一个函数来以编程方式计算这些值...

// return an object with full width/height (including borders), top/bottom coordinates
var getPositionData = function(el){
    return $.extend({ width : el.outerWidth(false), height : el.outerHeight(false) }, el.offset());
};

// get rotated dimensions   
var transformedDimensions = function(el, angle){
    var dimensions = getPositionData(el);
    return { width : dimensions.width + Math.ceil(dimensions.width * Math.cos(angle)), height : dimensions.height + Math.ceil(dimensions.height * Math.cos(angle)) };
}

这是我提出的一些东西。可能不是有史以来最好的事情,但对我有用。