vue实现拖拽拉伸容器宽度

news2024/11/27 11:45:01

效果
在这里插入图片描述

实现逻辑

  • 监听鼠标按下事件,设置滑条背景色,left距离,记录初始位置,捕获鼠标
  • 监听鼠标拖动事件,获取移动的距离,设置左侧区域与右侧区域的宽度,滑条的left值
  • 监听鼠标松开事件,取消事件监听,恢复滑条背景色,释放鼠标

代码

<template>
  <div :class="prefixCls">
    <div ref="wrapRef" :class="`${prefixCls}-content`">
      <div ref="leftRef" :class="`${prefixCls}-aside`">
        <slot name="aside" />
      </div>

      <span ref="resizeRef" class="resize" />

      <div ref="rightRef" :class="[`${prefixCls}-main`, $slots.aside && 'ml']">
        <slot name="header" />
        <div :class="`${prefixCls}-main-content`">
          <slot />
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Demo',
  inheritAttrs: false
}
</script>

<script setup>
import { computed, onMounted, ref, unref, shallowRef } from 'vue'

const prefixCls = computed(() => 'page-layout')

const wrapRef = shallowRef()
const leftRef = ref()
const resizeRef = ref()
const rightRef = ref()

onMounted(() => dragController())

function dragController() {
  const leftEleMinWidth = 271
  const rightEleMinWidth = 500
  unref(resizeRef).onmousedown = function(e) {
    // 设置颜色
    resizeRef.value.style.background = '#3D8BF2'
    const startX = e.clientX
    resizeRef.value.left = unref(resizeRef).offsetLeft
    
    // 鼠标拖动
    document.onmousemove = function({ clientX }) {
      const endX = clientX
      // 移动距离
      let movingDistance = unref(resizeRef).left + (endX - startX)
      // 右边区域宽度
      const rightEleWidth = unref(wrapRef).clientWidth - unref(resizeRef).offsetWidth

	  // 拉伸的宽度不能小于左侧区域的宽度
      if (movingDistance < leftEleMinWidth) movingDistance = leftEleMinWidth
      // 判断最大宽度
      if (movingDistance > rightEleWidth - rightEleMinWidth) movingDistance = rightEleWidth - rightEleMinWidth

	 // 设置左侧区域宽度
      resizeRef.value.style.left = movingDistance
      leftRef.value.style.width = movingDistance + 'px'
      // 设置右侧区域宽度
      rightRef.value.style.width = (unref(wrapRef).clientWidth - movingDistance - 10) + 'px'
    }
    
    // 鼠标松开
    document.onmouseup = function() {
      resizeRef.value.style.background = '#fff'
      document.onmousemove = null
      document.onmouseup = null
      unref(resizeRef)?.releaseCapture?.()
    }
    unref(resizeRef)?.setCapture?.() // 设置鼠标捕获
    return false
  }
}
</script>

<style lang="scss">
.page-layout {
  overflow: hidden;
  display: flex;
  width: 100%;
  height: 100%;

  &-content {
    position: relative;
    overflow: hidden;
    flex: 1;
    display: flex;
    margin: 16px;
  }

  &-aside {
    overflow: hidden;
    width: 271px;
    padding: 16px 0 16px 16px;
  }

  &-main {
    flex: 1;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    margin: 16px 16px 0;
    background-color: white;

    &-content {
      flex: auto;
      overflow: hidden;
      padding-top: 16px;
    }
  }

  .resize {
    width: 5px;
    margin: 16px 16px 11px 0;
    cursor: w-resize;
    background-color: #fff;
  }
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1160607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算能】cmake版本不对应

fatal error: boost/numeric/ublas/matrix.hpp: No such file or directory#include <boost/numeric/ublas/matrix.hpp> 解决方法&#xff1a; 这是由于cmake版本不对应&#xff0c;应该提高版本&#xff0c;是的C的编译成功

Redis系统学习(高级篇)-Redis主从集群

目录 一、搭建主从集群 二、主从数据同步的原理 三、repl_backlog原理 四、主从同步优化 五、小结 一、搭建主从集群 为了提高高并发&#xff0c;主从集群是很有必要的&#xff0c;因为这样可以实现读写分离&#xff0c;主节点负责写&#xff0c;从节点就只负责读&#xf…

ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南续篇

作者&#xff1a;运维有术 前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ks-master-1172.16.33.1661650200KubeSp…

攻防世界-web-bug

1. 问题描述 没有额外的描述&#xff0c;仅仅是这样的一个登录界面 但是&#xff0c;我们注意到有注册&#xff08;Register&#xff09;和找回密码&#xff08;Findpwd&#xff09;这俩按钮 注册界面如下&#xff1a;需要输入用户名&#xff0c;密码&#xff0c;生日及地址 …

《 博弈论教程(罗云峰版) 》——习题二答案

前言 博弈论这门课程&#xff0c;我们主要参考的教材是《博弈论教程&#xff08;罗云峰版&#xff09;》&#xff0c;但是罗老师的课后习题并没有给出完整的答案&#xff0c;秉着学习的态度&#xff0c;本人结合教材和 PPT 在这里给出课后习题的答案。 由于我们只学了完全信息…

2.Spark的工作与架构原理

概述 目标&#xff1a; spark的工作原理spark数据处理通用流程rdd 什么是rddrdd 的特点 spark架构 spark架构相关进程spark架构原理 spark的工作原理 spark 的工作原理&#xff0c;如下图 图中中间部分是spark集群&#xff0c;也可以是基于 yarn 的&#xff0c;图上可以…

修改docker容器commit定制镜像

通过修改容器&#xff0c;然后commit提交为镜像 定制特定的镜像:在实际工作&#xff0c;公网的镜像往往不符合我们预期,因此我们需要自己定制镜像以满足业务需求。 例如:我们期望定制一个符号我们自己的Nginx镜像,并期望镜像交付就包含项目代码与我们期望的配置, 后期只需要轻…

通过Google搜索广告传送的携带木马的PyCharm软件版本

导语 最近&#xff0c;一起新的恶意广告活动被发现&#xff0c;利用被入侵的网站通过Google搜索结果推广虚假版本的PyCharm软件。这个活动利用了动态搜索广告&#xff0c;将广告链接指向被黑客篡改的网页&#xff0c;用户点击链接后下载的并不是PyCharm软件&#xff0c;而是多种…

python hashlib模块及实例

hashlib 模块密码加密密码撞库密码加盐 一&#xff0c;hashlib模块 hashlib模块是用来为字符串进行加密的模块&#xff0c;通过该作用就可以为用户的密码进行加密。 通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个…

vue(32) : win10创建vue2基础前端框架

vue2element-uiaxios 1.创建vue2项目 开发工具为HBuilderX 3.7.3 1.1.新建项目 1.2.普通项目-vue项目(2.6.10) 等待创建项目 2.安装element-ui组件 2.1右键左下角开始图标 2.2.cd进入项目目录,执行安装element-ui npm i element-ui -S 2.3.main.js引入配置 import {Paginat…

HTML样式CSS、图像

HTML样式-CSS: CSS (Cascading Style Sheets) 用于渲染HTML元素标签的样式。CSS可以通过以下方式添加到HTML中&#xff1a;1&#xff09;、内联方式&#xff1a;在HTML元素中使用“style”属性&#xff1b;2&#xff09;、内部样式表&#xff1a;在HTML文档头部<head>区…

ssh远程登录服务

目录 1.1版本协商阶段 1.2密钥和算法协商阶段 1.3认证阶段(两种认证方法): 2.1.安装ssh 2.2.配置文件分析: 3.1配置ssh监听端口号 3.2拒绝以root身份登录服务器 3.3虚拟机之间实现免密登录 3.4xshell免密登录 SSH (Secure Shell Protocol,安全壳程序协议)由IETF的网络…

NumPy 相关函数

本篇文章介绍了Python中NumPy库的相关函数 np.corrcoef() 函数。 NumPy 中的相关性 相关系数是一个数字值&#xff0c;表示数据集给定特征之间的关系。 相关性可以是正相关&#xff0c;这意味着它们具有直接关系&#xff0c;并且一个特征的增加会导致另一个特征的增加。 负相…

Unity 解决因版本不同打开项目大量报错

文章目录 问题描述解决办法 问题描述 当我们在使用Unity不同版本打开同一项目时&#xff0c;可能会因为版本的不同&#xff0c;编辑器大量报错&#xff0c;特别是从高版本打开低版本 解决办法 删除项目文件夹下的 Library、 Logs、 Packages文件夹 然后打开项目重新生成这些…

python自动化测试(十):EcShop删除商品功能

前置条件&#xff1a; 本地部署&#xff1a;ECShop的版本是3.0.0、Google版本是 Google Chrome65.0.3325.162 (正式版本) &#xff08;32 位&#xff09; py的selenium版本是3.11.0 目录 一、前置代码 二、删除操作 2.1 进入商品列表 2.2 通过货号进行删除 一、前置代…

nodejs+vue啄木鸟便民维修网站设计与实现-计算机毕业设计python-django-php

1、目的&#xff1a; 设计一个适用于便民家电维护的平台。该系统方便管理员对用户信息的管理&#xff0c;使用户在不掌握任何专业知识的前提下&#xff0c;可以方便快速的上手&#xff0c;因此项目应具有广泛使用人群。该课题应包括&#xff08;至少包括&#xff09;以下几个基…

断货、售罄,双十一首日西圣Olite开放式耳机杀疯了!

西圣Olite首战双十一&#xff0c;仅需一天&#xff0c;就已经“售罄缺货”。作为国内深耕智能声学领域多年的 xisem西圣科技&#xff0c;在10月最新推出的一款Olite开放式耳机&#xff0c;售价仅为199&#xff0c;自问世之初就迅速引起了广泛的关注和需求&#xff0c;只因超高性…

selenium自动化测试入门 —— 下拉框元素定位

选择获取反选下拉框元素首先要实例化select元素 from selenium.webdriver.support.ui import Select # 引入包 select_elementSelect(element) # 实例化select 三种常用选择方法 select_element. select_by_index(index) 根据index定位&#xff0c;从0开始 select_element. …

快速解决!打开软件提示缺失x3daudio1_7.dll的解决方案

在我理解中&#xff0c;x3daudio1 7.dll丢失的问题是许多电脑用户都可能遇到的一个常见问题。这个问题可能会导致电脑无法正常播放音频&#xff0c;甚至可能影响到电脑的正常使用。那么&#xff0c;面对这样的问题&#xff0c;我们应该如何进行修复呢&#xff1f;下面&#xff…

[每日一氵] cudaDevAttrMaxBlocksPerMultiprocessor is not a member of cudaDeviceAttr

省流版&#xff1a; 本来懒得氵了&#xff0c;结果搜了下没啥结果&#xff0c;看了CUDA文档才知道&#xff0c;CUDA10还没有这个枚举值, CUDA11以及以上的版本才有 带着 CINN 编译 Paddle 报错: cmake .. -DWITH_GPUON -DWITH_TESTINGON -DCINN_ONLYOFF -DWITH_CINNON/Paddle…