前端——封装vue通用拖拽滑动分隔面板组件(Split)

2023-11-02

目录

 

1.通过splitpanes封装


1.通过splitpanes封装

参考文章:封装vue通用拖拽滑动分隔面板组件(Split) - 掘金

使用js库:splitpanes  https://antoniandre.github.io/splitpanes/https://antoniandre.github.io/splitpanes/

使用方法:

npm i splitpanes # For Vue 3

完整代码:

<template>
    <div ref="splitPane" class="split-pane" :class="props.direction" :style="{ flexDirection: direction }">
        <div class="pane pane-one" :style="lengthType + ':' + paneLengthValue">
            <slot name="one"></slot>
        </div>
        <div class="pane-trigger" :style="lengthType + ':' + triggerLengthValue" @mousedown="handleMouseDown"></div>
        <div class="pane pane-two">
            <slot name="two"></slot>
        </div>
    </div>
</template>

<script setup>
import { ref, defineProps, computed } from 'vue'
/* 属性 */
const splitPane = ref()
let paneLengthPercent = ref(50) // 区域1宽度 (%)
let triggerLength = ref(10)     // 滑动器宽度 (px)
let triggerLeftOffset = ref(0)    // 鼠标距滑动器左(顶)侧偏移量
const props = defineProps({
    direction: {
        type: String,
        default: 'column'
    },
    //滑动限制-最小
    min: {
        type: Number,
        default: 10
    },
    //滑动限制-最大
    max: {
        type: Number,
        default: 90
    },
    paneLengthPercent: {
        type: Number,
        default: 50
    },

    triggerLength: {
        type: Number,
        default: 10
    }

})
const lengthType = computed(() => {
    return props.direction === 'row' ? 'width' : 'height'
})
const paneLengthValue = computed(() => {
    return `calc(${paneLengthPercent.value}% - ${triggerLength.value / 2 + 'px'})`
})
const triggerLengthValue = computed(() => {
    return triggerLength.value + 'px'
})

/* 方法 */
// 按下滑动器
const handleMouseDown = (e) => {
    document.addEventListener('mousemove', handleMouseMove)
    document.addEventListener('mouseup', handleMouseUp)
    if (props.direction === 'row') {
        triggerLeftOffset.value = e.pageX - e.srcElement.getBoundingClientRect().left
    } else {
        triggerLeftOffset.value = e.pageY - e.srcElement.getBoundingClientRect().top
    }

}

// 按下滑动器后移动鼠标
const handleMouseMove = (e) => {
    const clientRect = splitPane.value.getBoundingClientRect()
    paneLengthPercent.value = 0
    //方向判断
    if (props.direction === 'row') {
        const offset = e.pageX - clientRect.left - triggerLeftOffset.value + triggerLength.value / 2
        paneLengthPercent.value = (offset / clientRect.width) * 100
    } else {
        const offset = e.pageY - clientRect.top - triggerLeftOffset.value + triggerLength.value / 2
        paneLengthPercent.value = (offset / clientRect.height) * 100
    }
    //滑动限制判断
    if (paneLengthPercent.value < props.min) {
        paneLengthPercent.value = props.min
    }
    if (paneLengthPercent.value > props.max) {
        paneLengthPercent.value = props.max
    }

}

// 松开滑动器
const handleMouseUp = () => {
    document.removeEventListener('mousemove', handleMouseMove)
}

</script>

<style scoped lang="scss">
.split-pane {
    background: palegreen;
    height: 100%;
    display: flex;

    &.row {
        .pane {
            height: 100%;
        }

        .pane-trigger {
            height: 100%;
            cursor: col-resize; //鼠标样式
        }
    }

    &.column {
        .pane {
            width: 100%;

        }

        .pane-trigger {
            width: 100%;
            cursor: row-resize; //鼠标样式
        }
    }

    .pane-one {
        width: 50%;
        background: palevioletred;
    }

    .pane-trigger {
        background: palegoldenrod;
        user-select: none;
    }

    .pane-two {
        flex: 1;
        background: turquoise;
    }
}
</style>

2.通过vue-splitpane插件

参考文章:Vue中 引入使用 vue-splitpane 实现窗格的拆分、调节_明天也要努力的博客-CSDN博客_vue-splitpane

3.通过Vue-Split-Panel插件

参考文章:vue-split-panel - npm 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端——封装vue通用拖拽滑动分隔面板组件(Split) 的相关文章

随机推荐

  • window7 配置telnet 服务

    第一步 点击开始 选择控制面板 第二步 选择 程序 选择打开或关闭windows 功能 在选择对话框中勾选Telnet客户端和Telnet服务端 第三步 点击 计算机 管理 属性 修改Telnet服务的启动方式 第四步 判断Telnet服务
  • [LeetCode] Reverse Linked List I II - 链表翻转问题

    题目概述 Reverse a singly linked list 翻转一个单链表 如 1 gt 2 输出 2 gt 1 1 gt 2 gt 3 输出3 gt 2 gt 1 题目解析 本人真的比较笨啊 首先想到的方法就是通过判断链尾是否存在
  • MySQL中的正斜杠和反斜杠

    目录 问题背景 问题提出 1 为什么书上的这种方法得不到正确的数据呢 2 是因为DBMS的问题嘛 3 如何在MySQL上得到正确的数据呢 问题总结 问题背景 今天数据库老师留了一道实验题 如下 14 查询 A C 课程的课程号和学分 如果没
  • 初识C++Primer plus

    写在前面 从事c 编程转眼也快一年了 一直从事工厂数据采集工作 然而就与硬件交互效率来说 无疑c c 与硬件更加契合 就很任性的买了一本c Primer plus 第六版 希望自己在博客里能坚持下去 将自己所悟所感写在这里与大家分享 分割线
  • 飞驰的高铁-第15届蓝桥杯第一次STEMA测评Scratch真题精选

    导读 超平老师的 Scratch蓝桥杯真题解析100讲 已经全部完成 后续会不定期解读蓝桥杯真题 这是Scratch蓝桥杯真题解析第150讲 飞驰的高铁 本题是2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组编
  • 源码大杀器:怎样查看源码

    一 以SpringBoot来分析下 首先获取到源码 二 点击GitHub获取源码 三 下载源码 SpringSpace 11 24 24 ls emptydemo springdemo gs accessing data jpa maste
  • 【Python网络爬虫与信息提取】Scrapy爬虫框架

    1 理论知识 pip install scrapy i http pypi douban com simple trusted host pypi douban com scrapy h scrapy startproject python
  • 第五章 初始化与清理(下)

    第五章 初始化与清理 现在总结的东西很多都需要用代码来帮助理解了 所以会有大量的测试代码 不过这中方式非常有用 如果认真敲过一遍之后 并且将这些代码弄清楚了 我相信你一定会对书中描述的内容有一个更清楚的认识 我是在eclipse工具上进行测
  • requests.session()会话保持

    可能大家对session已经比较熟悉了 也大概了解了session的机制和原理 但是我们在做爬虫时如何会运用到session呢 就是接下来要讲到的会话保持 首先说一下 为什么要进行会话保持的操作 requests库的session会话对象可
  • Flink如何连接hive

    回顾在上篇文章中 笔者使用的 CDH 版本为 5 16 2 其中 Hive 版本为 1 1 0 CDH 5 x 系列 Hive 版本都不高于 1 1 0 是不是不可理解 Flink 源代码本身对 Hive 1 1 0 版本兼容性不好 存在不
  • 测绘eps软件快捷键_行业内三款常用软件快捷键汇总整理及自定义设置

    今天小编要和各位看官分享的是测绘行业内三款常用软件的快捷键 这三款常用软件分别是CASS CAD EPS ARCGIS 快捷键是提高绘图速度 提升作业效率的不二法宝 小编也经常在给朋友们说一定要学会使用快捷键 特别是左手键的用法 今天我们就
  • 学习python过程中的心得体会和收获,也说一下好处坏处

    首先 Python是一种流行的编程语言 用于数据分析 机器学习 人工智能等领域 Python的语法简单易懂 易于学习和理解 这使得它成为许多初学者的首选编程语言 对于初学者来说 建议从基础开始学习 例如语法 数据类型 控制流等 同时 也要多
  • Linux下使用《du》命令查看某文件及目录的大小

    du ah max depth 1 这个是我想要的结果 a表示显示目录下所有的文件和文件夹 不含子目录 h表示以人类能看懂的方式 max depth表示目录的深度 du sh 目录 查看目录的大小 du sh 文件 查看文件大小 du命令用
  • Go语言学习史诗级教程-带你领略GoLang语言新世界

    Go基础 下载Go语言开发工具 下载Go语言环境 下载地址 https golang google cn dl 下载Go语言开发工具 下载地址 https www jetbrains com go 第一个Go语言代码 package mai
  • OAuth2 授权码模式为什么不直接返回access_token

    https www cnblogs com erichi101 p 13497971 html OAuth2的实际应用中 最常见的就是 授权码模式 了 微博是这种模式 微信也是这种模式 总结来说 就是简单的二步 1 获取code 2 根据c
  • buuctf- [BJDCTF2020]Easy MD5 (小宇特详解)

    buuctf BJDCTF2020 Easy MD5 小宇特详解 这里显示查询 这里没有回显 f12一下查看有没有有用的信息 我使用的火狐浏览器在网模块中找到了响应头 Hint select from admin where passwor
  • Incompatible ssh peer (no acceptable kex algorithm)

    安装greenplum数据库进行交换密码时输入root的密码一直不成功 后 用 gpssh exkeys f hostfile exkeys 命令结果如下 STEP 1 of 5 create local ID and authorize
  • R 语言做时间序列分析的实例(模式识别、拟合、检验、预测)

    文章目录 一 准备工作 1 数据准备 2 基本概念 二 数据处理 1 模式识别 2 参数估计 3 诊断性检验 1 残差序列 2 Ljung Box 检验 4 预测 一 准备工作 1 数据准备 所使用的数据是TSA包中的co2数据 如果没有这
  • 区块链支付,跨境支付新的解决方案

    区块链 也称为分布式账本技术 DLT 最初是为支持加密货币比特币而发明的 它提供了不可变的 安全的交易记录 通过消除对可信中介和繁琐的验证过程的需求 可能使交易更有效率 正在积极调查并在某些情况下试验区块链的中央银行包括美国 加拿大 中国
  • 前端——封装vue通用拖拽滑动分隔面板组件(Split)

    目录 1 通过splitpanes封装 1 通过splitpanes封装 参考文章 封装vue通用拖拽滑动分隔面板组件 Split 掘金 使用js库 splitpanes https antoniandre github io splitp