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

为什么两个DIV不能在父DIV下拖动?

两个DIV不能在父DIV下拖动的原因是因为DIV元素默认是静态定位(position: static),静态定位的元素不受拖动的影响。要实现拖动效果,需要将DIV元素的定位属性设置为相对定位(position: relative)或绝对定位(position: absolute)。

相对定位的元素会相对于其正常位置进行移动,而绝对定位的元素会相对于其最近的已定位祖先元素进行移动。

以下是一个实现两个DIV在父DIV下拖动的示例代码:

HTML代码:

代码语言:txt
复制
<div id="parent">
  <div id="div1"></div>
  <div id="div2"></div>
</div>

CSS代码:

代码语言:txt
复制
#parent {
  position: relative;
  width: 500px;
  height: 500px;
  border: 1px solid black;
}

#div1, #div2 {
  position: absolute;
  width: 100px;
  height: 100px;
  background-color: red;
}

#div1 {
  top: 0;
  left: 0;
}

#div2 {
  top: 200px;
  left: 200px;
}

JavaScript代码:

代码语言:txt
复制
var div1 = document.getElementById("div1");
var div2 = document.getElementById("div2");
var parent = document.getElementById("parent");

div1.addEventListener("mousedown", dragStart);
div2.addEventListener("mousedown", dragStart);

function dragStart(event) {
  var startX = event.clientX;
  var startY = event.clientY;
  var startLeft = parseInt(this.style.left) || 0;
  var startTop = parseInt(this.style.top) || 0;

  document.addEventListener("mousemove", drag);
  document.addEventListener("mouseup", dragEnd);

  function drag(event) {
    var deltaX = event.clientX - startX;
    var deltaY = event.clientY - startY;
    var newLeft = startLeft + deltaX;
    var newTop = startTop + deltaY;

    this.style.left = newLeft + "px";
    this.style.top = newTop + "px";
  }

  function dragEnd() {
    document.removeEventListener("mousemove", drag);
    document.removeEventListener("mouseup", dragEnd);
  }
}

在上述代码中,我们通过设置DIV元素的定位属性为绝对定位,并监听鼠标的mousedown、mousemove和mouseup事件来实现拖动效果。当鼠标按下时,记录鼠标的初始位置和DIV元素的初始位置,然后在mousemove事件中计算鼠标的偏移量,并根据偏移量更新DIV元素的位置。当鼠标松开时,移除事件监听器。

这样,两个DIV就可以在父DIV下进行拖动了。

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

相关·内容

手写实战应用:Vue拖拽插件的应用与选择

name: 'Drag',   components: {     VueDragResize   }, } 和普通的组件引入没有什么区别,需要注意的是要有一个容器来盛放拖动的元素...,并且要给容器设置相对定位,否则拖动元素将会自动相对于视图窗口定位拖动元素默认宽高是200pxw可以设置元素的宽,设置时不需要带单位,如果设置auto则为组件内部内容的宽度h是高x表示相对于元素在x...限制拖拽范围如果设置拖拽范围,可以在整个页面进行拖拽 图片可以使用parent-limitation限制只在元素内拖动也可以手动设置拖拽范围的宽高parentW,parentH//指定只在元素内拖动...,始终保持拖动的元素在最上层,此时就需要监听拖动元素,把当前元素设置为最高级使用@clicked事件监听,当点击拖动元素时,可以传如此元素的索引,把此元素的层级设置为最高,其他的设置为最低 图片为什么要选择手写鞋子合不合适只有穿过才知道

40130

基于Vue的拖拽插件的实战应用,但最后我还是选择了手写

default { name: 'Drag', components: { VueDragResize }, } 和普通的组件引入没有什么区别,需要注意的是要有一个容器来盛放拖动的元素...,并且要给容器设置相对定位,否则拖动元素将会自动相对于视图窗口定位 拖动元素默认宽高是200px w可以设置元素的宽,设置时不需要带单位,如果设置auto则为组件内部内容的宽度 h是高 x表示相对于元素在...限制拖拽范围 如果设置拖拽范围,可以在整个页面进行拖拽 可以使用parent-limitation限制只在元素内拖动 也可以手动设置拖拽范围的宽高parentW,parentH //指定只在元素内拖动...,始终保持拖动的元素在最上层,此时就需要监听拖动元素,把当前元素设置为最高级 使用@clicked事件监听,当点击拖动元素时,可以传如此元素的索引,把此元素的层级设置为最高,其他的设置为最低 <template...1px solid red; position: relative; margin: 0 auto; } .drag{ border: 2px solid red; } 为什么要选择手写

1.7K60
  • 随心所欲的滚动条,远离产品汪(一)

    在产品定下需求后给的网页设计图中我们最常遇到的是自定义滚动条的样式,或者当你想构建一个很有特色和创意的网页,那么也肯定希望自己能够去设置滚动条样式,当然,做好准备才是最重要的,最近在项目中遇到了,正好来总结一。...结构布局分析 我们在开发项目中会时不时的碰到这种情况,当滚动块B超出了级可视部分,我们总会设置overflow的属性值来隐藏超出的部分,根据默认的滚动条来操作隐藏区的内容,当将可视区A设置overflow...Y轴坐标 nowY = 0, // 鼠标拖动时滚动条C距级顶部的高度 maxY = 0, // 拖动的最大极限值 nowDisY =...即:滚动条的滚动距离 = 拖动后鼠标变化的Y值 – 点击时鼠标获取的Y值 nowY = nowDisY + newY - oldY; // 拖动后的滚动条C的top值 c) 实现滚动条拖动 在实现滚动条拖动的同时...每次滚动都需要拖拽,很累啊,为什么鼠标滚轮不能用? 2. 并没有到考虑兼容问题。

    1.5K50

    使用jQuery Draggable和Droppable实现拖拽功能

    节点可以折叠起来 2.用户可以通过拖放的操作,将元素从左侧拖放到右侧。如果是拖的节点元素,那么需要把它子节点的元素一并拖到右边 3.元素放到右侧,右侧可以接受元素的区域有2种可能。...但是测试拖动结果,发现元素只能在它所在的container里面拖动,再往右拖动div会出现水平或垂直滚动条。不知道是不是自己在参数设置上不对。container设置了overflow:auto。... 中间拖拽容器元素 <script type="text/...实现<em>拖动</em><em>父</em>节点时,其下面的子节点元素也要拖放到右边。如果是<em>拖动</em>的子节点元素,就在右边直接显示子节点元素。...<em>父</em>节点和子节点是相对的,因为左侧树形结构的节点可以是无限级的,所以一个元素既可能是子节点元素,也会是<em>父</em>节点元素。通过监听鼠标的mousedown和mouseup事件,来判断用户在<em>拖动</em>元素。

    2.8K60

    抛开插件,你真的懂拖动怎么实现吗?

    id="drag">橙某人 要让一个元素可拖动,我们需要处理三个事件: mousedown[2]:按。...网上找了个图,可以瞧瞧: 列表拖动 简单的整完,咱们开始上点强度,这次要做的功能如下: 看着可能稍微有点复杂,但实际还好啦,我们一步一步来完成。 一样,先把布局与样式整一: <!...交换元素的过程,咱们也可以单独写一个函数,如下: // 交换两个相邻的元素位置 function swap(nodeA, nodeB) { // 获取节点,为后续插入提供一个支点 const...我们可以看看实际的DOM结构,第二个元素与占位元素中间还隔着拖动元素呢,注意我们是要交换两个相邻的元素,不是随便两个相隔遥远的元素哦。 好,到此完毕,列表拖动就完成啦。...'); list.classList.add('list'); // 覆盖在表格上,如果是在局部,需要在共同的元素上加上relative,小编这里元素是body,就不用了。

    6610

    从 antDesign 来窥探移动端“滚动穿透”行为

    上述是 MDN 中对于 overscroll-behavior 属性的描述,上述这段话恰恰描述了为什么会发生"滚动穿透"现象。...现象 直观上来说所谓的 Scroll Chaining(滚动链接)通常会在两种情况被意外触发: 拖动不可滚动元素时,可滚动背景意外滚动。...比如上方图片中有两个元素,一个为红色边框存在滚动条的元素,另一个则为蓝色边框黑色背景不存在滚动条的子元素。 当我们拖动不可滚动的子元素时,实际会意外造成元素会跟随滚动。...继续沿着相同方向进行拖动,此时浏览器会寻找当前元素最近的可滚动祖先元素从而意外触发祖先元素的滚动。 同样,动画中红色边框为拥有滚动区域的元素,蓝色边框为元素中同样拥有滚动区域的子元素。...想象一,如果你的页面中每个 Modal 弹窗都使用了 useLockScroll 这个 hook ,那么当页面中开启两个弹窗,当关闭一个时另一个还存在时总不能移除了 BODY_LOCK_CLASS 吧

    53020

    Vue.js 组件编码规范

    为什么? 开发者可以随意给事件命名,即使是原生事件的名字,这样会带来迷惑性。 过于宽松的事件命名可能与 DOM 模板兼容。 怎么做? 事件名也使用连字符命名。...$parent Vue.js 支持组件嵌套,并且子组件可访问组件的上下文。访问组件之外的上下文违反了基于模块开发的第一原则。因此你应该尽量避免使用 this.$parent。 为什么?...如果一个组件需要访问其父组件的上下文,那么该组件将不能在其它上下文中复用。 怎么做? 通过 props 将值传递给子组件。 通过 props 传递回调函数给子组件来达到调用组件方法的目的。...在大多数情况,通过 this.$refs来访问其它组件的上下文是可以避免的。在使用的的时候你需要注意避免调用了恰当的组件 API,所以应该尽量避免使用 this.$refs。 为什么?...为什么? demo 可以说明组件是独立可使用的。 demo 可以让开发者预览组件的功能效果。 demo 可以展示组件各种配置参数的功能。

    6.4K20

    为了秋招,我开发了一款页面元素高亮插件

    ,主要是show和destory这两个方法。...同时需要注意,为了适配更多业务场景,这个hook也应当支持选择被插入的节点。...#3 副作用 最后一步是对上边两个方法对调用,同时注意我们需要通过ReactDOM.render的API将React组件渲染到刚才的创建的节点上。 这里为什么不用传送门?...麻烦的是我们如何确定菜单呈现的位置,如何模拟正常的操作菜单的交互 #1 处理边界情况 这里看着可能会模糊看一这里,为什么我需要将ref.current的宽高赋值给memoAttr?...此时禁用窗口拖动、滑动。而我们实现中为了方便,对于禁用窗口拖动、滑动采取的方案是在这种情况下直接关闭菜单。

    1.1K30

    HTML5 拖放API与Vue.js实战

    } header { margin-bottom: 10px; } header h3 { text-align: center; } 现在项目的框架搭好了,接下来先概述一拖放功能在浏览器中是怎样工作的...当用户将鼠标移到可拖动元素上时,拖动操作开始,然后将元素移动到启用拖放的元素上。 再默认情况,唯一可拖动的 HTML 元素是图像和链接。...可以在开始拖动操作时(调用 dragstart 事件时)将数据添加到拖动数据存储中,并且只能在完成拖放操作后(调用 drop 事件时)才能接收数据。...从拖动到释放元素的这段时间中,元素被拖放后,将会在被拖动的元素上触发两个事件:dragstart 和 dragend。 现在还不能把可拖动元素拖放到任何地方。...❝需要注意的是,仅在触发放置事件时才能访问存储在 DataTransfer 对象中的数据,而不能在 dragenter 或 dragover 上访问。

    4.3K10
    领券