[TOC] >[success] # splitpane -- 分割面板组件 ~~~ 1.splitpane -- 分割面板组件 介绍,是一个可以拖动菜单宽度,可以生成想要 的菜单宽度和内容宽度的一种布局方式 ~~~ >[danger] ##### 思想总结 ~~~ 1.做一个布局组件,或者其他类型组件的时候,将组件内部最外层的宽和高 设置成100%,当你去调用组件的时候,就可以通过设置调用组件包裹的 dom,去设置这个dom即可让组件宽高变成自己想要的 2.左右布局传统的形式是float浮动来设置布局 3.可以用定位的形式来进行布局调整 4.要用数据去驱动这个组件逻辑 5.计算图片中,红色区域在正中间(图片见代码思想总结第五条) ~~~ >[info] ## 思想总结代码 ~~~ 1.下面代码组件 统一是'split-pane' ~~~ >[danger] ##### 思想总结第一条和第二条 ~~~ 1. 组件整个根节点'split-pane-wrapper' 这个样式宽和高被设置成了百分百, 当你在调用的时候例如下面案例只需要将'split-pane-con'定义好想要的宽高 即可: <template> <div class="split-pane-con"> <split-pane></split-pane> </div> </template> 2.在less 语法中'&-'是缩写上级名称例如下面案例中的'&-left'等同于'pane-right' 3.注意class命名规则'pane pane-lef' 和 'pane pane-right' 可以将共同的样式 写在'pane'也让命名更加规范 4.数据操作vue样式,让整个布局动起来 ~~~ ~~~ <template> <div class="split-pane-wrapper"> <div class="pane pane-left"></div> <div></div> <div class="pane pane-right"></div> </div> </template> <script> export default { name: "split-pane" } </script> <style lang="less"> .split-pane-wrapper{ width: 100%; height: 100%; .pane{ float:left; width: 50%; height: 100%; &-left{ background: brown; } &-right{ background: chartreuse; } } } </style> ~~~ >[danger] ##### 思想总结第三条 ![](https://box.kancloud.cn/d50762a53cc1550bf70f6e4519f0b96a_699x227.png) ~~~ <template> <div class="split-pane-wrapper"> <div class="pane pane-left"></div> <div></div> <div class="pane pane-right"></div> </div> </template> <script> export default { name: "split-pane" } </script> <style lang="less"> .split-pane-wrapper{ width: 100%; height: 100%; /*定位位置一*/ position: relative; .pane{ /*定位位置二直接利用pane 设置左右公共的样式*/ position: absolute; height: 100%; /*设置top共同位置*/ top:0; &-left{ /*设置左侧的宽度*/ width: 30%; background: brown; } &-right{ /*设置右侧内容区域*/ right: 0; bottom: 0; left: 30%; background: chartreuse; } } } </style> ~~~ >[danger] ##### 思想总结第四条 ~~~ 1.用数据去驱动的时候,可以先找共同点,所谓的共同点例如这个案例,控 制左右布局的宽度都是30%,只不过右面是宽度百分之30,左面用了定位 距离左面left距离30% 2.利用这个思想下面的案例做一个按钮每次减去2%,让整个左右布局形成 动态变化 3.数据变化要使用计算属性去做,有一些需要基础值去拼接的数据,可以不 用在data 直接拼接好,反而可以利用计算属性重新组合,这样数据和拼接 分开我们只要关心data中的数据即可,所有的二次加工个计算属性 ~~~ ~~~ <template> <div class="split-pane-wrapper"> <div class="pane pane-left" :style="{width:leftOffsetPercent}"> <button @click="handleClick">点击减少左侧宽度</button> </div> <div></div> <div class="pane pane-right" :style="{left:leftOffsetPercent}"></div> </div> </template> <script> export default { name: "split-pane", data(){ return{ // 在这定义一个值。这样用户可以直接指定占比的值 // 在页面css 布局使用的值 使用计算属性拼接即可 leftOffset:0.3 } }, methods:{ handleClick(){ this.leftOffset -= 0.02 } }, computed:{ // 动态属性去拼接生成css 实际需要的代%形式的数据 leftOffsetPercent(){ return `${this.leftOffset * 100}%` } }, } </script> <style lang="less"> .split-pane-wrapper{ width: 100%; height: 100%; position: relative; .pane{ position: absolute; height: 100%; top:0; &-left{ /*width: 30%;*/ background: brown; } &-right{ right: 0; bottom: 0; /*left: 30%;*/ background: chartreuse; } } } </style> ~~~ >[danger] ##### 思想总结第五条 ![](https://box.kancloud.cn/73119425a98b95b8f3d98989ac9f9970_416x226.png) ~~~ 1.根据第五条我们要保证红色区域在,左右布局的中间位置,也就是在褐色 区域,和绿色区域各占比一半 2.根据第四条数据驱动原则,红色条想到达指定的位置也是需要有参照,可以 跟左侧绿色定位方式,定位红色区域使用left方式定位,想让它居中的话就是 left偏移值-红丝条宽度/2 ~~~ ~~~ <template> <div class="split-pane-wrapper"> <div class="pane pane-left" :style="{width:leftOffsetPercent}"> <button @click="handleClick">点击减少左侧宽度</button> </div> <div class="pane-trigger-con" :style="{left:triggerLeft,width:triggerWidthPx}"></div> <div class="pane pane-right" :style="{left:leftOffsetPercent}"></div> </div> </template> <script> export default { name: "split-pane", data(){ return{ // 在这定义一个值。这样用户可以直接指定占比的值 // 在页面css 布局使用的值 使用计算属性拼接即可 leftOffset:0.3, triggerWidth:8 } }, methods:{ handleClick(){ this.leftOffset -= 0.02 } }, computed:{ // 动态属性去拼接生成css 实际需要的代%形式的数据 leftOffsetPercent(){ return `${this.leftOffset * 100}%` }, triggerWidthPx(){ return `${this.triggerWidth}px` }, triggerLeft(){ return `calc(${this.leftOffset * 100}% - ${this.triggerWidth/2}px)` }, }, } </script> <style lang="less"> .split-pane-wrapper{ width: 100%; height: 100%; position: relative; .pane{ position: absolute; height: 100%; top:0; &-left{ /*width: 30%;*/ background: brown; } &-right{ right: 0; bottom: 0; /*left: 30%;*/ background: chartreuse; } &-trigger-con{ z-index: 100; height: 100%; background: red; position: absolute; top: 0; } } } </style> ~~~