,可以通过以下步骤来实现:
下面是一个示例代码,假设父元素的id为parent,子元素的id为child:
// 获取父元素和子元素
var parent = document.getElementById('parent');
var child = document.getElementById('child');
// 初始化变量
var isDragging = false;
var mouseX = 0;
var mouseY = 0;
var initialChildX = 0;
var initialChildY = 0;
// 鼠标按下事件监听器
parent.addEventListener('mousedown', function(e) {
isDragging = true;
mouseX = e.clientX;
mouseY = e.clientY;
initialChildX = child.offsetLeft;
initialChildY = child.offsetTop;
});
// 鼠标移动事件监听器
document.addEventListener('mousemove', function(e) {
if (isDragging) {
var deltaX = e.clientX - mouseX;
var deltaY = e.clientY - mouseY;
// 计算子元素的新位置
var newChildX = initialChildX + deltaX;
var newChildY = initialChildY + deltaY;
// 获取父元素的旋转角度
var parentRotation = getRotation(parent);
// 将子元素的相对移动距离逆向旋转
var reverseDelta = rotate(deltaX, deltaY, -parentRotation);
// 将逆向旋转后的距离应用到子元素的位置
child.style.left = newChildX + reverseDelta.x + 'px';
child.style.top = newChildY + reverseDelta.y + 'px';
// 确保子元素在父元素的范围内
var parentRect = parent.getBoundingClientRect();
var childRect = child.getBoundingClientRect();
if (childRect.left < parentRect.left) {
child.style.left = parentRect.left - parentRect.left + 'px';
}
if (childRect.right > parentRect.right) {
child.style.left = parentRect.right - childRect.width - parentRect.left + 'px';
}
if (childRect.top < parentRect.top) {
child.style.top = parentRect.top - parentRect.top + 'px';
}
if (childRect.bottom > parentRect.bottom) {
child.style.top = parentRect.bottom - childRect.height - parentRect.top + 'px';
}
}
});
// 鼠标松开事件监听器
document.addEventListener('mouseup', function() {
isDragging = false;
});
// 获取元素的旋转角度(单位:度)
function getRotation(element) {
var st = window.getComputedStyle(element, null);
var tr = st.getPropertyValue('transform');
var values = tr.split('(')[1].split(')')[0].split(',');
var a = values[0];
var b = values[1];
var angle = Math.round(Math.atan2(b, a) * (180 / Math.PI));
return (angle < 0 ? angle + 360 : angle);
}
// 对坐标点进行逆向旋转变换
function rotate(x, y, angle) {
var newX = x * Math.cos(angle) + y * Math.sin(angle);
var newY = -x * Math.sin(angle) + y * Math.cos(angle);
return {
x: newX,
y: newY
};
}
以上代码实现了在不考虑旋转的情况下拖动旋转元素的子元素,并保持旋转的效果。在实际使用中,可以根据具体的需求进行优化和修改,以适应不同的场景。
领取专属 10元无门槛券
手把手带您无忧上云