前言
在后台管理系统中,可能会有类似查看文章或其它文件读取进行操作等功能,本身后台管理系统页面除去侧边菜单栏的宽度后,剩余的可操作空间就变得比较少,当页面内存在文件列表查看文章等类似功能后,还需放置其它内容时,空间就十分不足了。
如果侧边类似文件列表的内容在进行其它操作时不需要展示,那么将其收起到一边可能会更方便内容的呈现。
实际需求
目前分析所需的是,侧边内容在操作后一段时间内不需要呈现,以将更大的空间给主要内容呈现区或操作区。这其实跟管理系统的收起侧边栏非常相似。
代码结构
基本结构
需求的最基本内容就是有两个容器,一个是侧边容器,放置少操作的内容,一个是主要容器,是内容呈现区或操作区
<template>
<div class="side-pane">
<!-- 侧边内容 -->
<div class="side-pane-left">
</div>
<!-- 主体内容 -->
<div class="side-pane-main">
</div>
</div>
</template>
直接上代码
补充内容,一般这类面板都需要个header来设置title,还有主体内容区,所以主次容器都同样设计。侧边内容的宽度根据具体需求设置,可传具体值(如:side-width="200px")或传百分比(如:side-width="20%")。
<template>
<div class="side-pane" :class="{ 'fold': fold }" :style="{ height }">
<!-- 侧边内容 -->
<div class="side-pane-left" :style="{ width: sideWidth }">
<transition name="side-pane-left">
<div class="side-pane-left-con" v-if="!fold">
<div class="side-pane-left-header" v-if="$slots.leftHeader">
<slot name="leftHeader"></slot>
</div>
<!-- 侧边主体内容区 -->
<div class="side-pane-left-body">
<slot name="left"></slot>
</div>
<el-button class="fold-btn" type="text" icon="el-icon-arrow-left" @click="changeFold"></el-button>
</div>
</transition>
</div>
<!-- 主体内容 -->
<div class="side-pane-main" :style="{ marginLeft }">
<div class="side-pane-main-header" v-if="$slots.mainHeader">
<slot name="mainHeader"></slot>
</div>
<!-- 主体内容区 -->
<div class="side-pane-main-body">
<slot name="main"></slot>
</div>
<el-button v-if="fold" class="unfold-btn" type="text" icon="el-icon-arrow-right" @click="changeFold"></el-button>
</div>
</div>
</template>
<script>
export default {
props: {
height: {
type: String,
default: '100%'
},
sideWidth: {
type: String,
default: '25%'
}
},
computed: {
marginLeft () {
return this.fold ? 0 : this.sideWidth
}
},
data () {
return {
fold: false,
}
},
methods: {
/**
* @method changeFold 收起/展开侧边菜单
*/
changeFold () {
this.fold = !this.fold
}
},
}
</script>
样式
收起侧边时加上过渡动画,看起来会更自然~
<style lang="scss" scoped>
.side-pane {
position: relative;
min-height: 100px;
border: 1px solid #d7dae2;
background-color: #fff;
&.fold {
.side-pane-left {
width: 0;
height: 0;
border: none;
}
.side-pane-main {
margin-left: 0;
}
&:hover {
.unfold-btn {
visibility: visible;
}
}
}
.side-pane-left {
overflow: hidden;
position: absolute;
height: 100%;
top: 0;
left: 0;
border-right: 1px solid #d7dae2;
transition: width 0.3s;
&:hover {
.fold-btn {
visibility: visible;
}
}
&-con {
.side-pane-left-header {
overflow: hidden;
box-sizing: border-box;
min-height: 40px;
padding: 8px 20px 8px 16px;
border-bottom: 1px solid #d7dae2;
}
.fold-btn {
visibility: hidden;
position: absolute;
width: 20px;
height: 40px;
top: 0;
right: 0;
color: #666;
border-radius: 0;
background-color: rgba($color: #000000, $alpha: 0.05);
&:hover {
background-color: rgba($color: #000000, $alpha: 0.15);
}
}
}
}
.side-pane-main {
position: relative;
transition: all 0.3s;
.side-pane-main-header {
box-sizing: border-box;
min-height: 40px;
padding: 8px 20px;
border-bottom: 1px solid #d7dae2;
}
.side-pane-main-body {
padding: 8px 20px;
}
.unfold-btn {
visibility: hidden;
position: absolute;
width: 20px;
height: 40px;
top: 0;
left: 0;
color: #666;
border-radius: 0;
background-color: rgba($color: #000000, $alpha: 0.05);
&:hover {
background-color: rgba($color: #000000, $alpha: 0.15);
}
}
}
}
.side-pane-left-enter-active,
.side-pane-left-leave-active {
transition: opacity 0.5s;
}
.side-pane-left-enter,
.side-pane-left-leave-to {
opacity: 0;
}
</style>
使用
代码
<template>
<div class="component-side-pane">
<side-pane side-width="20%">
<span class="title" slot="leftHeader">文章列表</span>
<div class="article-list" slot="left">
<div class="article-item" v-for="i in 10" :key="i">这是文章 {{ i }}</div>
</div>
<span class="title" slot="mainHeader">文章标题</span>
<div slot="main" class="content">
这是文本内容
</div>
</side-pane>
</div>
</template>
效果图
首次发文,小白请大家多多指教!
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!