拖动侧边栏改变div宽度

任务描述

实现左右拖拽布局功能:当拖动分割线时,可以重置左右两侧模块宽度实现宽度自定义。

首先搞清楚几个值的概念
(1)clientX
clientX:鼠标点击时位置距离当前body可视区域的x坐标

(2)left
相对于具有定位属性(position定义为relative)的父对象 的左边距

(3)offsetLeft 与 offsetWidth
offsetLeft:当前元素距父元素左侧的值
offsetWidth: 元素的width+元素的padding+边框的宽度

(这部分网上有很多图示详解,不懂得可以去学习一下)

整体思路
(1)按下鼠标时,获取当前点击位置距离当前body的位置
(2)移动该鼠标时,计算左边div的距离,
计算公式是 = 原先左边div的距离 + 最后鼠标的位置 - 起始鼠标的位置
(3)在容错处理上,设置了可移动的最大距离,防止宽度溢出。

<template>
  <div id="box">
    <div class="top">顶部导航</div>
    <div id="left"> 左边的div
      <svg width="100%" id="controllerSvg" ></svg>
    </div>
    <div id="resize"></div>
    <div id="right" style="border-top: 1px solid #b5b9a9; ">右边的div
<!--      <svg width="100%" height="auto" id="serverSvg" ></svg>-->
    </div>
    <p></p>
  </div>
</template>

<script>
export default {
  name: 'change',
  methods: {
    dragControllerDiv: function () {
      let resize = document.getElementById('resize')
      let left = document.getElementById('left')
      let right = document.getElementById('right')
      let box = document.getElementById('box')

      resize.onmousedown = function (e) {
        let startX = e.clientX
        resize.left = resize.offsetLeft
        document.onmousemove = function (e) {
          let endX = e.clientX
          let moveLen = resize.left + (endX - startX)
          let maxT = box.clientWidth - resize.offsetWidth
          if (moveLen < 150) moveLen = 360
          if (moveLen > maxT - 800) moveLen = maxT - 800
          resize.style.left = moveLen
          left.style.width = moveLen + 'px'
          right.style.width = (box.clientWidth - moveLen - 5) + 'px'
        }
        document.onmouseup = function () {
          document.onmousemove = null
          document.onmouseup = null
          resize.releaseCapture && resize.releaseCapture()
        }
        resize.setCapture && resize.setCapture()
        return false
      }
    }
  },
  mounted () {
    this.dragControllerDiv()
  }
}
</script>

<style scoped>
  #box{
    width:100%;
    height:400px;
    position: relative;
    overflow:hidden;
  }
  .top {
    width: 100%;
    height: 80px;
    background: #ffe0c6;
  }
  #left{
    width:calc(30% - 5px);
    height: 100%;
    float:left;
    overflow: auto;
    background: pink;
  }

  #resize{
    position: relative;
    width:5px;
    height:100%;
    cursor: w-resize;
    float:left;
  }

  #right{
    width:70%;
    height:100%;
    float:left;
    overflow: hidden;
    background: #ffc5c1;
  }
</style>

转载:https://blog.csdn.net/qq_39295665/article/details/99622493

实现拖动调整左右两侧div宽度,可以使用JavaScript和CSS技术来实现。 首先,我们需要在HTML中创建两个div元素,用来表示左右两侧内容的容器。例如: ```html <div id="left-div"></div> <div id="right-div"></div> ``` 然后,我们可以使用CSS来给这两个div设置样式,包括初始的宽度和边框样式等。例如: ```css #left-div { width: 50%; border: 1px solid black; } #right-div { width: 50%; border: 1px solid black; } ``` 接下来,我们可以使用JavaScript来实现拖动调整宽度的功能。我们可以为左侧div元素绑定mousedown、mousemove和mouseup事件,通过计算鼠标移动的距离来实时更新左右两侧div宽度。例如: ```javascript const leftDiv = document.getElementById('left-div'); const rightDiv = document.getElementById('right-div'); let isDragging = false; let startX = 0; let leftWidth = 0; leftDiv.addEventListener('mousedown', (e) => { isDragging = true; startX = e.clientX; leftWidth = parseInt(getComputedStyle(leftDiv).width, 10); }); document.addEventListener('mousemove', (e) => { if (isDragging) { const moveX = e.clientX - startX; const newLeftWidth = leftWidth + moveX; leftDiv.style.width = `${newLeftWidth}px`; rightDiv.style.width = `calc(100% - ${newLeftWidth}px)`; } }); document.addEventListener('mouseup', () => { isDragging = false; }); ``` 通过以上的JavaScript代码,我们实现了鼠标拖动调整左右两侧div宽度的功能。当鼠标按下左侧div时,记录鼠标按下的位置和当前左侧div宽度。当鼠标移动时,计算鼠标相对于按下位置的移动距离,并根据移动距离更新左右两侧div宽度。当鼠标松开时,停止拖动。 最后,我们可以在页面中插入一些内容,测试拖动调整宽度的功能。这样,当我们在浏览器中打开页面时,就可以通过拖动调整左右两侧div宽度了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值