通过鼠标移动来调整两个盒子的宽度(响应式)

DOM结构:

html 复制代码
 <div class="courer">  // 外层盒子
      <div  class="dividing-line" title="拖动"></div>  // 拖动的那个线
      <div class="course-title-box">  // 第一个盒子
        <div class="course-content-box" v-infinite-scroll="load" infinite-scroll-disabled="disabled">
         
          <div v-for="(item2, i2) in detialList" :key="i2" @contextmenu="handleRightClick(i2, item2)">
            <!--标题-->
            <div class="course-content-item" @click="currentChange(item2)">
              <div style="width: calc(100% - 50px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap">
              
                {{ item2.name }}
              </div>
            </div>
          </div>
         
          <div v-if="noMore" style="color: #999; font-size: 12px; text-align: center; margin: 10px 0">没有更多了</div>
        </div>
      </div>
      <div class="course-detail-content-box" style="display: flex; align-items: center; justify-content: center">// 第二个盒子
        <div style="color: #bdbdbd">
          <span>点击任务标题查看详情</span>
        </div>
      </div>
      
    </div>

css样式:

css 复制代码
.courer {
  /* padding: 20px; */
  width: calc(100% - 150px);
  height: 100%;
  overflow-y: auto;
  overflow-x: hidden;
  display: flex;
  position: relative;
}
.dividing-line {
  position: absolute;
  width: 10px;
  height: 100%;
  left: 200px;
  top: 0;
  transform: translate(-50%, 0);
  cursor: col-resize;
  /* background-color: rgba(20, 20, 23, 0.3); */
  background-color: transparent;
}

.course-title-box {
  width: 200px;
  height: 100%;
  overflow-y: auto;
  overflow-x: hidden;
  /* background-color: #789; */
  border-right: 1px solid rgba(0, 0, 0, 0.07);
  border-top: 1px solid rgba(0, 0, 0, 0.07);
  padding: 5px 15px;

  .course-title-item {
    cursor: pointer;
    padding: 10px 0;
    color: #333;
    font-weight: 700;
    /* background-color: #669; */
    position: relative;

    &:hover {
      color: #5fa4f6;

      .el-icon-more-outline {
        display: block;
      }
    }

    .el-icon-more-outline {
      display: none;
    }

    span {
      padding: 0 7px;
    }

    .add {
      position: absolute;
      right: 5px;
      top: 13px;
    }
  }

  .course-content-box {
    .course-content-item {
      color: #333;
      cursor: pointer;
      padding: 10px;
      /* background-color: #898; */
      border-bottom: 1px solid rgba(0, 0, 0, 0.03);
      position: relative;

      &:hover {
        background-color: #e7f3ff;
      }

      .detail-box {
        position: absolute;
        right: 13px;
        top: 0;
        height: 40px;
        display: flex;
        align-items: center;

        .more-icon:hover {
          color: #5fa4f6;
        }
      }
    }

    .active-course-content-item {
      background-color: #e7f3ff;
    }
  }
}

重中之重的js代码:

javascript 复制代码
// methods里的

    setTaskBox() {
      if (window.localStorage.getItem('lineLeft') != null) {
        const titleBox = document.getElementsByClassName('course-title-box')[0]
        const contentBox = document.getElementsByClassName('course-detail-content-box')[0]
        const line = document.getElementsByClassName('dividing-line')[0]

        line.style.left = window.localStorage.getItem('lineLeft') + '%'
        titleBox.style.width = window.localStorage.getItem('titleBoxWidth') + '%'
        contentBox.style.width = window.localStorage.getItem('contentBoxWidth') + '%'
      }
    },

    // 实现任务列表和任务详情显现区域变化功能
    changeTaskBox() {
      const titleBox = document.getElementsByClassName('course-title-box')[0]
      const contentBox = document.getElementsByClassName('course-detail-content-box')[0]
      const line = document.getElementsByClassName('dividing-line')[0]
      const box = document.getElementsByClassName('courer')[0]
      let titleBoxStyle = window.getComputedStyle(titleBox)
      let contentBoxStyle = window.getComputedStyle(contentBox)
      let boxStyle = window.getComputedStyle(box)
      console.log(titleBoxStyle.width, contentBoxStyle.width, boxStyle.width)
      // 鼠标按下事件
      line.onmousedown = e => {
        let titleBoxWidth = parseFloat(titleBoxStyle.width)
        let contentBoxWidth = parseFloat(contentBoxStyle.width)
        let boxWidth = parseFloat(boxStyle.width)

        const startX = e.clientX
        console.log('startX', startX)
        const lineLeft = line.offsetLeft
        console.log('lineLeft', lineLeft)
        // 鼠标拖动事件
        document.onmousemove = e => {
          const moveX = e.clientX
          console.log('moveX', moveX)
          // 鼠标移动距离
          let moveLen = lineLeft + moveX - startX
          moveLen = moveLen < 200 ? 200 : moveLen //左边区域最小宽度为200px
          moveLen = moveLen > boxWidth - 500 ? boxWidth - 500 : moveLen //右边区域最小宽度为500px
          line.style.left = moveLen + 'px'
          titleBox.style.width = moveLen + 'px'
          contentBox.style.width = boxWidth - moveLen + 'px'
          titleBoxWidth = parseFloat(titleBoxStyle.width)
          contentBoxWidth = parseFloat(contentBoxStyle.width)
        }
        // 鼠标松开事件
        document.onmouseup = function () {
          let newLineLeft = (parseInt(line.offsetLeft) / boxWidth).toFixed(2) * 100
          let newTitleBoxWidth = (titleBoxWidth / boxWidth).toFixed(2) * 100
          let newContentBoxWidth = (contentBoxWidth / boxWidth).toFixed(2) * 100

          window.localStorage.setItem('titleBoxWidth', newTitleBoxWidth)
          window.localStorage.setItem('contentBoxWidth', newContentBoxWidth)
          window.localStorage.setItem('lineLeft', newLineLeft)
          document.onmousemove = null
          document.onmouseup = null
        }
        return false
      }
    },

e.clientX 是一个事件对象的属性,它表示鼠标指针相对于浏览器视口(viewport)的水平位置。具体来说,e.clientX 返回鼠标指针相对于视口左边缘的 x 坐标。

mounted里的:

javascript 复制代码
  mounted() {
    this.changeTaskBox()
    this.setTaskBox()
  },

就可以完成拖动那根线,实现两边的盒子的宽度根据线的移动而变化;

offsetLeftstyle.left 在 Vue 或 JavaScript 中有不同的用途和含义:

1.offsetLeft:

  • 是一个只读属性,表示元素相对于其最近的定位祖先元素(或视口)的左边缘的距离。
  • 它返回的是一个整数,单位是像素(px)
  • 用于获取元素的当前位置,不可用于设置元素的位置

2.style.left:

  • style.left 是一个可读写属性,表示元素在 CSS 中的 left 属性值。
  • 它可以直接修改元素的位置。
  • 用于设置元素的 CSS left 属性,从而改变元素的位置。
  • 可以设置为字符串形式,如 '100px'100 + 'px'

应用场景

  • 当你需要获取元素的当前位置时,使用 offsetLeft
  • 当你需要动态改变元素的位置时,使用 style.left
相关推荐
Myli_ing37 分钟前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
dr李四维1 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
I_Am_Me_1 小时前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
雯0609~1 小时前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ1 小时前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z1 小时前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
前端百草阁2 小时前
【TS简单上手,快速入门教程】————适合零基础
javascript·typescript
彭世瑜2 小时前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
FØund4042 小时前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
Backstroke fish2 小时前
Token刷新机制
前端·javascript·vue.js·typescript·vue