offsetLeft 无法检测到 transform: translate(100px, 100px) 的移动距离?

使用transform: translate,offsetLeft的值永远是0,是无法检测到吗?定位是可以的。

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>

* {
  padding: 0;
  margin: 0;
}

div {
  width: 300px;
  height: 300px;
  background-color: skyblue;
  transform: translate(100px, 100px);
}

</style>
</head>

<body>
<div></div>

<script>

// debugger  
const div = document.querySelector('div');
let x = 0;
let y = 0;

function handleClient(ev) {
 
  ev.target.style.transform = `translate(${ev.clientX - x}px,${ev.clientY - y}px)`;
}

div.addEventListener('mousedown', (ev) => {

  x = ev.clientX - ev.target.offsetLeft;
  y = ev.clientY - ev.target.offsetTop;
  console.log(`x${x}, y${y}`);
  console.log('offsetLeft ', ev.target.offsetLeft, 'offsetTop ', ev.target.offsetTop);
  console.log('ev.clientX ', x, 'ev.clientY ', y);
  console.log('ev.clientX - x: ', ev.clientX - x, 'ev.clientY - y: ', ev.clientY - y);
});


</script>
</body>

</html>

阅读 3.2k
2 个回答
ignoring any transforms that apply to the element and its ancestors.

规范明确说明忽略变换

不会包含 CSS3 的 transform,如果你非要计算,可以使用私有方法 WebKitCSSMatrix(仅 Webkit 内核浏览器可用)。

下面是个例子:

let el = document.getElementById('my-element');
let elTransform = new WebKitCSSMatrix(window.getComputedStyle(el).webkitTransform);
let realOffsetLeft = el.offsetLeft + elTransform.m41;
let realOffsetTop = el.offsetTop + elTransform.m42;

上面是可以拿到 transform 的具体计算值的,如果你并不在意这个值,而只希望得到最后实际的偏移量,那么 getBoundingClientRect 这个方法已经足够了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题