首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在不考虑旋转的情况下拖动旋转元素的子元素,同时保持旋转

,可以通过以下步骤来实现:

  1. 首先,需要明确的是,父元素进行了旋转变换,子元素的拖动实际上是相对于父元素进行的。
  2. 在父元素上添加事件监听器,监听鼠标按下(mousedown)事件。
  3. 当鼠标按下时,记录下当前的鼠标位置和子元素的初始位置。
  4. 添加mousemove事件监听器,监听鼠标移动(mousemove)事件。
  5. 在mousemove事件的回调函数中,根据鼠标的位置变化计算出子元素的相对移动距离。
  6. 在计算出子元素的新位置后,需要考虑到父元素的旋转变换。可以通过逆向旋转父元素的角度,将子元素的相对移动距离也进行相同的逆向旋转变换,以确保子元素的拖动方向与鼠标移动方向保持一致。
  7. 更新子元素的位置,并确保其在父元素的范围内。

下面是一个示例代码,假设父元素的id为parent,子元素的id为child:

代码语言:txt
复制
// 获取父元素和子元素
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
  };
}

以上代码实现了在不考虑旋转的情况下拖动旋转元素的子元素,并保持旋转的效果。在实际使用中,可以根据具体的需求进行优化和修改,以适应不同的场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

图片不变形,宽高超出父元素情况下旋转图片

demo 如题,具体效果见这里 。做这样效果难点在于,计算没旋转前图片宽,高和旋转宽高。 下面来看具体实现。 实现步骤 让图片在父元素中水平居中,垂直居中显示。我用是 flex。...我们知道图片在旋转 (2n * 90)度元素宽高是一样,((2n + 1) * 90) 度元素宽高是一样。...图片宽和高要满足 超出父元素 图片不能变形 在上面的条件下,图片宽高只有有限值可以选。... 旋转 (2n * 90) 度情况下 图片宽为父元素宽,高度自适应 图片高为父元素高,宽度自适应 旋转((2n + 1) * 90) 度情况下 图片宽为父元素高,高度自适应 图片高为父元素宽...旋转用 CSS3 transform: rotate(旋转角度)deg; 来实现。

2.1K30
  • 提高效率 |ArcGIS Pro 中所有快捷键一网打尽

    V + 拖动 围绕一点旋转。 按住 V 键同时单击并拖动,以围绕您单击枢轴点旋转。 V + 方向键 围绕视图中心旋转。 按 V 并按上箭头键、下箭头键、左箭头键或右箭头键来围绕视图中心旋转。... 3D 中,照相机保持照相机角度和高度不变同时会向左移动一个屏幕宽度。 End 向右移动一个屏幕大小。 2D 中,向右平移一个屏幕宽度。...按住 V 键同时单击并拖动,以围绕您单击枢轴点旋转。V + 方向键围绕视图中心旋转。按 V 并按上箭头键、下箭头键、左箭头键或右箭头键来围绕视图中心旋转。B + 拖动 3D 场景中环视。... 3D 中,照相机保持照相机角度和高度不变同时会向下移动一个屏幕宽度。Home向左移动一个屏幕大小。 2D 中,向左平移一个屏幕宽度。... 3D 中,照相机保持照相机角度和高度不变同时会向左移动一个屏幕宽度。End向右移动一个屏幕大小。 2D 中,向右平移一个屏幕宽度。

    1.1K20

    我做了一个在线白板(二)

    根据矩形中心点计算鼠标拖动对角点坐标,比如我们拖动是矩形右下角,那么对角点就是左上角; 2.根据鼠标拖动实时位置结合对角点坐标,计算出新矩形中心点坐标; 3.获取鼠标实时坐标经新中心点反向旋转原始矩形旋转角度后坐标...图片 黑色为原始矩形,绿色为鼠标按住右下角实时拖动矩形,这个是没有保持原宽高比拖动到这个位置如果要保持宽高比应该为红色所示矩形。...根据之前逻辑,我们是可以计算出绿色矩形未旋转位置和宽高,那么新比例也可以计算出来,再根据原始矩形宽高比例,我们可以计算出红色矩形未旋转位置和宽高: 图片 如图所示,我们先计算出实时拖动绿色矩形未旋转位置和宽高...60,那么不考虑行高计算出字号就是30,考虑行高,显然字号会小于30,x * 1.5 = 30,所以还需要再除以行高比。...,比如: 1.元素点击检测完全是依赖于点到点距离或点到直线距离,这就导致不支持像贝塞尔曲线或是椭圆这样元素,因为无法知道曲线上每个点坐标,自然也无法比较; 2.多个元素同时旋转目前也没有很好解决

    1.4K31

    动画 | 什么是红黑树?(与2-3-4树等价)

    B树是一种自平衡树,根节点到其叶子节点路径高度都是一样,能够保持数据有序(通过中序遍历能得到有序数据)。...图:沿着链接向下进行变换,分解4-节点 沿着左右链接向下进行变换同时,也会进行命中查找。...这样对于任何一颗2-3-4树,只考虑左倾情况下,都能得到唯一一颗对应红黑树,这种树也叫左倾红黑树,相对比较减少了复杂性,设计更容易被实现。 红黑树查找算法 红黑树查找算法和二分搜索树一样。...红黑树删除算法 红黑树删除算法也需要进行旋转和颜色转换操作,插入算法中为了待插入元素所在节点不是4-节点,所以沿着左右链接向下进行变换时将4-节点分解成3个2-节点,中间2-节点与父节点合并;而在删除算法中为了待删除元素所在节点不是...删除最小元素 删除最小元素算法和二分搜索树一样,一直递归它左孩子,直到它左孩子为空才进行删除这个最小元素。但是红黑树递归同时如何旋转和颜色转换是个问题。

    82620

    Touch 移动设备上 手势识别 与 Js事件库

    Touch.js 是移动设备上手势识别与事件库, 由百度云Clouda团队维护,也是百度内部广泛使用开发工具。 Touch.js手势库专为移动设备设计。...Touch.js对于网页设计师来说,是一款不错辅助工具,可以减少很多写框架控制器时间。 网页合理使用Touch.js不但能增加网页美观感,而且节约时间,减少人力投入也有极大帮助。...selector string 代理元素选择器, callback function 事件处理函数,如需了解手势库支持新属性,详见《事件对象》 事件配置 touch.config(config)...startRotate 启动单指旋转方法,某个元素touchstart触发时调用 事件绑定 touch.on( element, types, callback ); 功能描述 事件绑定方法,根据参数区分事件绑定和事件代理...selector string 代理元素选择器 callback function 事件处理函数, 移除函数与绑定函数必须为同一引用。

    4.1K40

    「Adobe国际认证」Adobe Photoshop变换对象教程

    按比例缩放图层 现在,当变换任意图层类型时,拖动角手柄默认情况下会按比例缩放图层,这是由选项栏中处于“开”状态保持长宽比按钮(链接图标)来指示。...要将默认变换行为更改为按比例缩放,只需关闭保持长宽比按钮(链接图标)即可。现在,按下 Shift 键可用作保持长宽比按钮切换开关。...应用渐增变换之前,可以连续执行若干个操作。例如,您可以选取“缩放”并拖动手柄进行缩放,然后选取“扭曲”并拖动手柄进行扭曲。然后按 Enter 键或 Return 键以应用两种变换。...您可以水平、垂直或同时沿这两个方向缩放。 旋转围绕参考点转动项目。默认情况下,此点位于对象中心;但是,您可以将它移动到另一个位置。 斜切垂直或水平倾斜项目。 扭曲将项目向各个方向伸展。...例如,要将参考点移动到外框左上角,请单击参考点定位符左上角方块。 图像中出现变换外框中,拖动参考点 。参考点可以位于您想变换项目之外。

    3K40

    什么C3转换还可以这样玩???用CSS3实现2D转换、3D转换、3D呈现,详细总结及案例演示。

    1, 1, 0, 90deg); X轴和y轴正方向角平分线方向旋转90° 这里涉及矢量合成,因为X轴和Y轴上要同时旋转,X轴和Y轴矢量合成后为X轴和y轴正方向角平分线。...【3D呈现(transfrom-style)】 有时我们使用多个对象进行旋转时候,发现一个奇怪现象,明明设置了旋转,但旋转时候,元素旋转属性却消失了,不起作用,这是应为我们没有设置3D呈现(transfrom-style...语法: transform-style: flat; 元素默认不开启3d立体空间 transform-style: preserve-3d; 元素开启立体空间 注意:这个属性是设置给父元素...,但是影响元素。...relative; width: 200px; height: 200px; margin: 100px auto; transition: all 1s; /* 让元素保持

    81130

    为什么MySQL索引要用B+tree

    为什么采用二叉树 假设此时用普通二叉树记录 id 索引列,我们每插入一行记录同时还要维护二叉树索引字段。...id 索引列,我们每插入一行记录同时还要维护 Hash 表索引字段。...为什么采用红黑树 红黑树是一种特化 AVL树(平衡二叉树),都是进行插入和删除操作时通过特定操作保持二叉查找树平衡; 若一棵二叉查找树是红黑树,则它任一子树必为红黑树。...假设此时用红黑树记录 id 索引列,我们每插入一行记录同时还要维护红黑树索引字段。...1 ≤ 4 ❌ 它只剩1个关键字后,需要向兄弟节点借元素,这时候右兄弟有多,它说:我愿意把14借给你 但不可能让11和14放一起,因为 14 > 12 ,这时候就要进行 旋转 ~ 首先,将父节点元素

    47774

    对称、群论与魔术(五)——真实扑克牌图案对称性探索

    不信你看: 图1 手持牌叠样子 但是同时也可以注意到,其印制角标的位置连线是穿过2, 4象限对角线,即连线斜率为负。...这时候,左撇子要么就得学像右撇一样拿牌,其别扭程度就和右撇用不灵活左手打牌,灵活却使上劲右手持牌是一样。...如果纯旋转,那就是C4,很可惜长方形只是一个C2了,如果保持D4则必须元素本身也是。方块也只是D2罢了,用一个对称图形旋转得到可以保持其原有的中心对称性,这就有了4图案。...但是其D2需要旋转180度旋转对称,需要一个本就有轴对称性花色元素有着和长方形重合对称轴,然后绕着同样旋转中心变成两倍个元素去生成才行。...再来考虑偶数牌,如果按照上面的扩展摆放原则:2就上下排布保持D2,4则对称加旋转来扩展得到Klein-4,本来是都可以解决中心对称问题

    1.4K10

    解锁前端难题:亲手实现一个图片标注工具

    这里需要注意开头和结尾 save 和 restore 函数,因为我们会修改 scale,如果恢复的话,其会影响下一次绘制,一般修改上下文时,都是通过 save 和 restore 来复原。...还需要考虑点击新元素时,和点击空白时,重置上一个元素选中态逻辑,代码实现如下所示: canvas1.addEventListener('mousedown', (e) => { startX =...这是因为我们判断点在矩形内部逻辑,并未考虑旋转问题,我们矩形数据存储了矩形旋转之前坐标和旋转角度,如下所示。...,这需要改在 mousedown 和 mousemove 事件,实现拖动实时旋转。...「可扩展性」:设计上应该留有足够灵活性,以便开发者可以根据自己特定需求进行定制和扩展。 「性能优化」:注重性能优化,确保库处理大型图片或复杂标注时仍能保持良好性能。

    67510

    CSS3变形transform、过渡transition、动画animation学习

    ,继而投影到一个 2D 视平面上 透视还可以直接定义成属性 perspective: ,但其是设置所有的元素有一个共同透视值 其对于 3D 变换来说至关重要,如果指定透视,则 Z...作用于元素元素。...有两个值:flat:所有元素 2D 平面呈现;preserve-3d:保留3D空间 7-3) perspective-origin 该属性定义X轴和Y轴3D元素。...默认情况下,背面可见,这意味着即使翻转后,变换内容仍然可见。但当 backface-visibility 设置为 hidden 时,旋转后内容将隐藏,因为旋转后正面将不再可见。...设置对象动画之外状态 forwards:结束后保持动画结束时状态,但当animation-direction为0,则动画执行,持续保持动画开始时状态 backwards:结束后返回动画开始时状态

    2.6K10

    【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树艺术

    它不仅解决了二叉搜索树在数据插入和删除时可能产生失衡问题,更通过旋转操作,使得树高度始终保持一个相对较低水平,从而保证了搜索高效性 AVL树学习并非一蹴而就。...AVL树概念 二叉搜索树虽可以缩短查找效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于顺序表中搜索元素,效率低下。...AVL树节点定义 AVL树节点定义通常包含以下几个关键部分: 基本元素: _left:指向节点节点指针 _right:指向节点节点指针 _parent:指向节点父节点指针 _kv...AVL树性质要求任何节点平衡因子绝对值超过1(-1, 0, 1) 构造函数: 初始化一个新节点时,通常需要一个构造函数,它接受一个键值对(或仅键),并设置节点节点、右节点、父节点和平衡因子...这种严格平衡要求导致了相对较高维护成本,特别是频繁进行插入和删除操作情况下

    18710

    Canvas学习笔记,记录使用过程中遇到一些问题

    ,可以指定填充算法,决定点是路径内还是路径外。.../ let rectCenterPoint = { x: x + w / 2, y: y + h / 2 }; /* 旋转同时,让中心点回到原来位置 */ context.translate...设备像素比,它计算方式是 物理像素 / 屏幕宽度像素; 首先设置canvas宽度和高度是原来2倍 使用ctx.scale(2,2)设置绘制东西也放大2倍 canvas元素上使用缩放,使用...所以图形拖动时候,以touchstart事件坐标作为拖动参照点时会产生偏差,结果就是拖动开始时候,图形会瞬移一段距离。 可以将参照点坐标调整为第一次touchmove事件触发时坐标。...可以导出之前将canvas长宽放大指定倍数,同时将图形放大,之后再通过toDataURL导出,分辨率相对来说就高了。

    94121

    旋转吧!徽章!

    此时还基本无需考虑动画问题。因为手指移动是连续旋转就是连续。...实现动画之前,我们先来考虑一下动画机制。 屏幕渲染帧率通常是:60fps 但实际上这里还有个坑,iOS 省电模式下会降低帧率,导致不同情况下表现不一致。...拖动徽章(此时无需考虑动画、但要避免拖动与惯性动画冲突) 手离开屏幕,徽章旋转速度逐渐衰减(需要得知初速度) 最终总是停留在正面或是反面(平面上不同区间赋予对应方向加速度) ,可能简短文字难以描述清楚...但这并不是我们想要,我们希望它能总是保持正/反面。 同样我们可以从物理角度进行思考,水平面施加一个「重力」,使其总是保持正/反面。 这个重力(加速度)徽章左右区间正负是不一样。...但也存在一些小问题… 与惯性动画冲突造成抖动 通过各类状态判断,当用户拖动、仍在播放惯性动画时,陀螺仪效果生效(与拖动和惯性动画之间冲突处理逻辑类似) 陀螺仪因为用户初始拿位置便具有数值(

    4.5K31

    touch.js使用总结

    //触摸过程被系统取消时触发(少用) 一、事件绑定 touch.on(element,types,callback); 参数描述: element   element或string    元素对象、...swipedown向下滑动 swipe滑动 4、拖动 拖动开始    dragstart拖动屏幕 拖动           drag拖动手势 拖动结束     dragend拖动屏幕 5、长按 hold...   长按屏幕 6、敲击 tap单击屏幕 doubletap双击屏幕 三、部分事件处理函数 originEvent触发某事件原生对象 type事件名称 rotation旋转角度 scale缩放比例...rotate事件触发时旋转角度 duration                  touchstart 与 touchend之间时间戳 factor             swipe事件加速度因子...startRotate启动单指旋转方法,某个元素touchstart触发时调用

    1.7K10

    面经手册 · 第6篇《带着面试题学习红黑树操作原理,解析什么时候染色、怎么进行旋转、与2-3树有什么关联》

    复杂2-3树转换红黑树 上图是一个稍微复杂点2-3树,转换为红黑树过程,是这样一张图让你对红黑树更有感觉了,同时它也满足一下条件; 从任意节点到叶子节点,所经过黑色节点数目相同 黑色节点保持着整体平衡性...红黑树,则需要通过节点左侧旋转,将元素2拉起来,元素1和元素3,分别成为左右节点。 红黑树左旋,只会处理与之对应2-3树节点进行操作,不会整体改变。...红黑树,则需要通过节点右侧旋转,将元素2拉起来,元素1和元素3,分别成为左右节点。...,插入5,右侧位置插入,此时正好保持树平衡,不需要调整 1.4 染色 2-3树中,插入一个节点,为了保持树平衡是插入到空位置上,当插入节点后元素数量有3个后则需要调整中间元素向上,来保持树平衡。...删除操作 根据2-3-4树模型红黑树,删除时候基本是按照2-3方式进行删除,只不过在这个过程中需要染色和旋转操作,以保持树平衡。删除过程主要可以分为如图四种情况,如下; ?

    95721

    红黑树

    但它是如何保证一棵n个结点红黑树高度始终保持logn呢?这就引出了红黑树5个性质: 每个结点要么是红要么是黑。 根结点是黑。...对于树旋转,能保持不变只有原树搜索性质,而原树红黑性质则不能保持红黑树数据插入和删除后可利用旋转和颜色重涂来恢复树红黑性质。...但是当叔叔节点为黑色时,则要考虑节点是左孩子还是右孩子。 ? case2很简单,通过旋转生成右边图,而右边情况就是case3。 总之case2就是通过一次旋转,然后进行case3判断 3....少量旋转操作使得再添加节点时,大部分节点是可以被查询/修改(因为旋转时为了数据安全,会锁住某些节点不能被修改,而着色操作并不影响这些)。很多底层实现上,有大量红黑树实现。...但 TreeMap、TreeSet 比 HashMap、HashSet 优势在于:TreeMap 中所有 Entry 总是按 key 根据指定排序规则保持有序状态,TreeSet 中所有元素总是根据指定排序规则保持有序状态

    75840

    数据结构之红黑树

    添加元素1,创建一个2节点类型根节点 添加元素2,此时元素1和2存在同一个节点中,成为一个3节点。为什么添加元素2时,不能生成一个新节点作为元素1所节点节点呢?...并且根据大小关系元素4要位于元素3右侧 添加元素5,同插入元素4,元素5一路查找到元素3、4所三节点,与其融合,暂时形成一个4节点 分裂,元素3、4、5所4节点同上面元素1、2、3...我们只需要将元素4所节点与其父节点即元素2所节点进行融合即可。这时,元素2、4就形成了一个3节点 如果我们继续往2-3树中添加元素6和7,那么最终形成2-3树如下图所示: ?...红黑树则是从根节点到叶子节点最长路径超过最短路径2倍,其高度仅仅只会比AVL树高度大一倍,所以性能上,下降得并不多。由于红黑树也是自平衡树,也会采取一些机制来维持树平衡。...左旋转: 逆时针旋转红黑树两个节点,使得父节点被自己节点取代,而自己成为自己节点 ? 在上图中,身为右节点Y取代了X位置,而X变成了自己节点,因此为左旋转

    37510
    领券