拖拽div的四边,改变div的大小

该篇文章详细描述了如何在Vue项目中使用JavaScript和CSS实现一个可调整大小的黑色盒子,通过监听mousedown、mousemove和mouseup事件,以及计算鼠标移动的距离来改变盒子的宽度和高度。
摘要由CSDN通过智能技术生成

在这里插入图片描述

要求:点击黑色边缘的盒子,点住然后拉拽,改变盒子的大小,vue项目

思路:给盒子四周定位上四条线,给四条线绑定方法,获取拖拽开始到结束的x、y位置上的变化,通过js对宽高进行改变

注释:blackBox为黑色边缘盒子,topLine、rightLine、bottomLine、leftLine为div模拟的红色线条
<div class="blackBox"
	<div
        class="topLine"
        @mousedown="
          e => {
            handleMouseDown(e, 'top');
          }
        "
      ></div>
      <div
        class="rightLine"
        @mousedown="
          e => {
            handleMouseDown(e, 'right');
          }
        "
      ></div>
      <div
        class="bottomLine"
        @mousedown="
          e => {
            handleMouseDown(e, 'bottom');
          }
        "
      ></div>
      <div
        class="leftLine"
        @mousedown="
          e => {
            handleMouseDown(e, 'left');
          }
        "
      ></div>
</div>
.blackBox{
	width:200px;
	height:200px;
	border: 1px solid black;
	position: relative;
	.topLine {
    width: 100%;
    height: 1px;
    cursor: ns-resize;
    background-color: red;
    position: absolute;
    top: 0px;
    left: 0px;
  }
  .rightLine {
    width: 1px;
    height: 100vh;
    background-color: red;
    position: absolute;
    top: 0px;
    right: 0px;
    cursor: ew-resize;
  }
  .bottomLine {
    width: 100%;
    height: 1px;
    background-color: red;
    position: absolute;
    bottom: 0px;
    left: 0px;
    cursor: ns-resize;
  }
  .leftLine {
    width: 1px;
    height: 100vh;
    background-color: red;
    position: absolute;
    top: 0px;
    left: 0px;
    cursor: ew-resize;
  }
}
methods:{
	 handleMouseDown(event, value) {
      this.$nextTick(() => {
        let isDragging = false; // 判断是否正在拖动
        let startX = null; // 记录起始位置的x坐标
        let startY = null; // 记录起始位置的y坐标
        let initialWidth = null; // 记录初始宽度
        let initialHeight = null; // 记录初始高度
        let initialTop = null; // 记录初始top
        let initialLeft = null; // 记录初始left

        const blackBoxEle = document.querySelector(
          ".blackBox"
        ); // 获取盒子元素

        event.preventDefault(); // 防止默认行为(如选中文本)
        isDragging = true;
        startX = event.clientX; // 记录起始位置的x坐标
        startY = event.clientY; // 记录起始位置的y坐标
        initialWidth = parseInt(getComputedStyle(blackBoxEle).width); // 记录初始宽度
        initialHeight = parseInt(getComputedStyle(blackBoxEle).height); // 记录初始高度
        initialTop = parseInt(getComputedStyle(blackBoxEle).top); // 记录初始top
        initialLeft = parseInt(getComputedStyle(blackBoxEle).left); // 记录初始left

        const handleMouseMove = (event, value) => {
          if (isDragging) {
            if (value === "top" || value === "bottom") {
              const deltaY = event.clientY - startY; // 计算鼠标相对于起始位置的垂直距离
              const newHeight =
                value === "top"
                  ? initialHeight - deltaY
                  : initialHeight + deltaY; // 新的高度等于原有高度加上距离变化量

              blackBoxEle.style.height = newHeight + "px"; // 设置盒子的高度

              if (value === "top") {
                blackBoxEle.style.top = initialTop + deltaY + "px";
              }
            } else if (value === "right" || value === "left") {
              const deltaX = event.clientX - startX; // 计算鼠标相对于起始位置的水平距离
              const newWidth =
                value === "left"
                  ? initialWidth - deltaX
                  : initialWidth + deltaX; // 新的宽度等于原有宽度加上距离变化量

              blackBoxEle.style.width = newWidth + "px"; // 设置盒子的宽度
              if (value === "left") {
                blackBoxEle.style.left = initialLeft + deltaX + "px";
              }
            }
          }
        };
        function handleMouseUp() {
          isDragging = false;
        }

        document.addEventListener("mousemove", e => {
          handleMouseMove(e, value);
        });
        document.addEventListener("mouseup", handleMouseUp);
      });
    },
},
beforeDestroy() {
  document.onmousemove = null;
  document.onmouseup = null;
},
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
div拖动是指在网页中,可以使用鼠标来点击并拖动一个div元素,改变它的位置。这通常通过在div元素上添加拖动事件处理程序来实现。当用户点击div元素并移动鼠标时,div元素会跟随鼠标一起移动,直到用户释放鼠标。 实现div拖动的关键是监听鼠标事件,并根据鼠标的位置来改变div元素的位置。当用户按下鼠标时,记录下鼠标的初始位置和div元素的初始位置,并持续监测鼠标的移动。当鼠标移动时,计算鼠标位置的变化,并将div元素的位置相应地进行调整。最后当用户释放鼠标时,停止监测鼠标的移动,并完成div元素的位置改变。这样就实现了div拖动的效果。 div拖动可以给用户带来更好的交互体验,使页面元素的布局更加灵活和个性化。通过div拖动,用户可以自由地调整页面元素的位置,以适应其个人喜好和使用习惯。同时,对于网页设计者来说,div拖动也可以为设计出更加创新和有趣的页面布局提供更多可能性。 在实现div拖动时,需要考虑到用户体验和页面性能等方面的问题。例如,需要合理地控制拖动的范围,避免div元素移出页面边界;还需要优化代码逻辑和减少不必要的重绘,以提高页面的响应速度和用户体验。总而言之,div拖动是一种常见且有趣的网页交互效果,可以通过合理的实现方式为用户带来更好的使用体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值