vue分割面板封装实现记录

本文实例为大家分享了vue分割面板封装实现的具体代码,供大家参考,具体内容如下

记录一次 分割面板的封装:

 <template>
  <div class="split-pane-wrapper" ref="outer">
    <div class="pane pane-left" :style="{ width: leftOffsetPercent }">
      <slot name="left"></slot>
    </div>
    <div
      class="pane-trigger-con"
      @mousedown="handleMousedown"
      :style="{ left: triggerLeft, width: `${triggerWidth}px` }"
    >
    //中间分割按钮
      <div class="pane-trigger-con__button">
        <div v-for="i in 10" :key="i"></div>
      </div>
    </div>
    <div class="pane pane-right" :style="{ left: leftOffsetPercent }">
      <slot name="right"></slot>
    </div>
  </div>
</template>
<script>
export default {
  name: "SplitPane",
  props: {
      //分割值
    value: {
      type: Number,
      default: 0.5,
    },
    //按钮宽度
    triggerWidth: {
      type: Number,
      default: 8,
    },
    //最大分割值/最小分割值
    min: {
      type: Number,
      default: 0.1,
    },
    max: {
      type: Number,
      default: 0.9,
    },
  },
  data() {
    return {
      // leftOffset: 0.3,
      canMove: false,
      initOffset: 0,
    };
  },
  computed: {
      //计算左边面板的宽度
    leftOffsetPercent() {
      return `${this.value * 100}%`;
    },
    //右边面板的marginleft
    triggerLeft() {
      return `calc(${this.value * 100}% - ${this.triggerWidth / 2}px)`;
    },
  },
  methods: {
      //鼠标点击  鼠标移动事件  计算偏差
    handleMousedown(event) {
      document.addEventListener("mousemove", this.handleMousemove);
      document.addEventListener("mouseup", this.handleMouseup);
      this.initOffset =
        event.pageX - event.srcElement.getBoundingClientRect().left;
      this.canMove = true;
    },
    //鼠标移动事件 计算移动距离
    handleMousemove(event) {
      if (!this.canMove) return;
      const outerRect = this.$refs.outer.getBoundingClientRect();
      let offsetPercent =
        (event.pageX -
          this.initOffset +
          this.triggerWidth / 2 -
          outerRect.left) /
        outerRect.width;
      if (offsetPercent < this.min) offsetPercent = this.min;
      if (offsetPercent > this.max) offsetPercent = this.max;
      // this.$emit('input', offsetPercent)
      this.$emit("update:value", offsetPercent);
    },
    handleMouseup() {
      this.canMove = false;
    },
  },
};
</script>
<style lang="scss">
.split-pane-wrapper {
  height: 100%;
  width: 100%;
  position: relative;
  .pane {
    position: absolute;
    top: 0;
    height: 100%;
    &-left {
      background: transparent;
      padding: 10px;
      box-sizing: border-box;
    }
    &-right {
      box-sizing: border-box;
      right: 0;
      bottom: 0;
      background: transparent;
      padding: 10px;
    }
    &-trigger-con {
      height: 100%;
      background: rgb(240, 240, 240);
      position: absolute;
      top: 0;
      z-index: 10;
      user-select: none;
      cursor: col-resize;
      .pane-trigger-con__button {
        border: 1px solid lightgrey;
        width: calc(100% - 2px);
        height: 20px;
        margin: 0 auto;
        position: relative;
        top: 50%; /*偏移*/
        transform: translateY(-50%);
        border-radius: 2px;
        div {
          margin: 1px 0;
          width: 100%;
          height: 1px;
          background-color: lightgrey;
        }
      }
    }
  }
}
</style>

页面使用split-pane:

 <div class="split-pane-con">
        <split-pane :value.sync="offset">
          <div slot="left"><el-input></el-input></div>
          <div slot="right"><el-input></el-input></div>
        </split-pane>
  </div>
      
  data() {
    return {
      offset: 0.4,
    };
  },

效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue3 可拖动的左右面板分割组件实现

    目录 分解组件 左侧面板 右侧面板 入参分解 props slots 具体实现 如何拖动呢? 事件监听 宽度处理 优化 bug git地址 最近在使用vue的时候,遇到一个需求,实现左右div可通过中间部分拖拽调整宽度,本文就整理一下,分享给大家,具体如下: 效果图 分解组件 整体使用flex布局 左侧面板 面板的具体内容通过slot具名插槽传入. title通过prop传入 可拖动,为了保证内容样式不会被拖动所破坏,对面板的宽度设定最大值/最小值 右侧面板 右侧面板宽度随着左侧面板的宽度变化而

  • vue-Split实现面板分割

    本文实例为大家分享了vue-Split实现面板分割的具体代码,供大家参考,具体内容如下 <template>   <div class="split-pane-wrapper">     <div class="pane pane-left" :style="{width:leftOffsetPercent}">       <button @click="handleClick"&g

  • vue实现拖拽滑动分割面板

    本文实例为大家分享了vue实现拖拽滑动分割面板的具体代码,供大家参考,具体内容如下 需求背景 左边是列表,右边是详情. 想更大范围的查看详情,所以要拖拽滑块,进行面板的分割 整体思路 在布局上,采用flex布局,单位采用百分比.设置flex:1,让其自动伸缩 滑动滑块,计算滑块在滑动过程中,占整个页面的百分比 将百分比,通过动态样式赋值给列表页的宽度 同时改变滑块的位置(也是百分比形式) 其次就是在vue里对鼠标事件的使用 代码实现 在template里 写事件 @mousedown.preve

  • vue分割面板封装实现记录

    本文实例为大家分享了vue分割面板封装实现的具体代码,供大家参考,具体内容如下 记录一次 分割面板的封装:  <template>   <div class="split-pane-wrapper" ref="outer">     <div class="pane pane-left" :style="{ width: leftOffsetPercent }">       <slo

  • vue使用Split封装通用拖拽滑动分隔面板组件

    前言 手动封装一个类似Iview中的Split组件,可将一片区域,分割为可以拖拽调整宽度或高度的两部分区域,最终效果如下: 开始 基础布局 在vue工程中创建SplitPane组件,引入页面使用. <template> <div class="page"> <SplitPane /> </div> </template> <script> import SplitPane from './components/sp

  • Vue折叠面板组件的封装

    本文实例为大家分享了Vue折叠面板组件的封装代码,供大家参考,具体内容如下 该组件使用了 Element 的一些 icon 图标,以及 过渡动画 el-collapse-transition,需安装 element 具体使用方法,主要知识点 provide ,inject,this.$children 和 _uid (vue中无论递归组件,还是自定义组件,每个组件都有唯一的_uid) <!-- 折叠组件 --> <navigation-bar v-model="barName&

  • Vue项目中封装组件的简单步骤记录

    目录 前言 如何封装一个Toast组件 使用案例 具体实现 总结 前言 随着业务的发展 功能性开发 已经无法满足我们对于前端的需求,这一篇主要带大家体验一下如何开发一套属于自己的组件库 使用场景:公司内部组件库的开发,个人组件库的开发,与项目解耦,多项目中使用同一组件,只需维护一套组件库 如何封装一个Toast组件 组件说明: 实现提示功能. 效果展示: 实现的功能: 根据某个判断条件或者点击某个按钮,弹出弹框: 可配置位置,类型,样式名等 使用案例 1. 简单使用 vm.$toast('网络异

  • vue 2.0封装model组件的方法

    本文介绍了vue 2.0封装model组件的方法,分享给大家,希望对大家有所帮助 单文件组件 使用单文件组件封装model的模板.逻辑和样式,之后就可以在页面中调用此通用组件. 需求 model有两个使用场景: 1.备注/修改密码(简易): 在屏幕中垂直居中 2.添加/修改/展示信息(复杂): 距离屏幕顶部200px,内容过长时可滚动. 3.常规要求(共同点): 标题,关闭icon 点击确定/关闭/遮罩,隐藏model组件 分析上述需求点,得到如下图: wrapper:负责遮盖屏幕 inner:

  • Vue使用v-model封装el-pagination组件的全过程

    使用v-model绑定分页信息对象,分页信息对象包括3个核心属性参数,分页事件直接绑定查询数据的方法,消除父组件的handleSizeChange和handleCurrentChange的绑定事件方法. 1.前言   通过封装el-pagination组件开发自定义分页组件的类似文章网上已经有很多了,但看了一圈,总是不如意,于是决定还是自己动手搞一个. 2.背景 2.1.常规分页处理方法   利用el-pagination组件的常规做法如下:   模板部分: <el-pagination @si

  • Vue结合Element-Plus封装递归组件实现目录示例

    目录 前言 用正则匹配出所有的h标签并且保存在数组中 封装函数,将数组中的内容变成父子结构 封装递归组件fold-item(在使用之前不要忘了导入自己哦) 在foldMenu中使用递归组件 使用效果 前言 在写我的个人博客网站,用MarkDownIt将md解析成html时,我一直在想,怎么才能实现官方文档他们那些可折叠的目录结构呢?我有那么多标题(h1...h5),而且有的文章是只有h2或者h3的,难道我要在目录组件里面一个个v-if来渲染这些标题达到目录的效果嘛?这个问题在我某一天看vue文档

  • vue虚拟化列表封装的实现

    目录 vue虚拟化列表封装 将下面代码复制一份到自己的项目中 vue虚拟列表-vue-virtual-scroll-list 使用场景 安装 使用 vue虚拟化列表封装 将下面代码复制一份到自己的项目中 <template> <div class="scrollParent" ref="scrollContent" @scroll="handleScroll"> <div :style="blankFill

  • Vue开发之封装分页组件与使用示例

    本文实例讲述了Vue开发之封装分页组件与使用.分享给大家供大家参考,具体如下: 使用elementui中的el-pagination来封装分页组件 pagination.vue: <template> <div class="pagination"> <el-pagination small class="text-center" @size-change="handleSizeChange" @current-ch

随机推荐