内容左右收缩展开
- 实现需求
- 实现效果
- 自定义抽屉(el-drawer)展开位置
- 实现原理
- js方法,点击的时候抽屉伸缩展开,并且给左侧右侧内容对应的宽度
- 第二种方法
实现需求
页面内容是左右布局,需求想让左侧内容可收缩,然后展示完全右侧内容。本来想着写原生的css+v-show动态判断即可,后来想到了element组件库有抽屉(el-drawer),顺便想尝试一下是否能自定义抽屉展开的位置,所以有了这篇文章。
实现效果
自定义抽屉(el-drawer)展开位置
<template>
<div>
<el-row style="margin-top: 1%" :gutter="20">
<!-- 左侧 列表 -->
<el-col style="height: 350px;" :span="span" :class="[span != '8' ? 'span1' : 'span1']">
<div style="position: relative; width: 100%; height: 100%">
<el-drawer
class="drawerClass"
style="position: absolute"
:append-to-body="false"
:modal="false"
:show-close="false"
:wrapperClosable="false"
size="100%"
:visible.sync="drawer"
direction="ltr"
>
<el-card class="box-card" style="position: relative">
<div>左侧内容</div>
</el-card>
</el-drawer>
<div
style="
position: absolute;
z-index: 999999999;
cursor: pointer;
top: 30%;
"
:class="[drawer ? 'imgright' : 'imgright1']"
@click="clickImg"
>
<img
v-show="!drawer"
style="height: 40px; width: 25px"
:src="require('@/assets/image/zhankai.png')"
alt=""
/>
<img
v-show="drawer"
style="height: 40px; width: 25px"
:src="require('@/assets/image/shousuo.png')"
alt=""
/>
</div>
</div>
</el-col>
<!-- 右侧 用户列表 -->
<el-col :span="span1" :class="[span1 != '15' ? 'span1' : 'span1']">
<el-card class="box-card">
<div>右侧内容</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
实现原理
给el-drawer父级标签添加position: relative;
el-drawer属性调整:
:append-to-body=“false” 遮罩层是否插入至 body 元素上,
:modal=“false” 是否需要遮罩层
:show-close=“false” 是否显示关闭按钮
:wrapperClosable=“false” 点击遮罩层是否可以关闭 Drawer
js方法,点击的时候抽屉伸缩展开,并且给左侧右侧内容对应的宽度
export default {
data() {
return {
span: 8,
span1: 15,
drawer: true,
};
},
methods: {
clickImg() {
this.drawer = !this.drawer;
if (this.drawer) {
this.span = 8;
this.span1 = 15;
} else {
this.span = 1;
this.span1 = 23;
}
},
},
};
<style lang="scss" scoped>
.span1 {
transition: all 0.2s;
}
.imgright {
right: 0;
background-color: #f5f5f5;
transition: all 0.2s;
}
.imgright1 {
left: 0;
background-color: #fff;
transition: all 0.2s;
}
.drawerClass ::v-deep .el-drawer__container .el-drawer .el-drawer__header {
display: none;
}
</style>
以上只是尝试抽屉是否能自定义位置伸缩展开。当然有更简单的方法写个css动态判断宽度即可
第二种方法
<el-row style="margin-top: 1%">
<div style="display: flex; align-items: center">
<!-- 左侧 列表 -->
<div :class="[drawer ? 'left' : 'left1']">
<el-card class="box-card">
<div>左侧内容</div>
</el-card>
</div>
<!-- 折叠展开图片-->
<div
style="cursor: pointer; width: 5%"
:class="[drawer ? 'imgright' : 'imgright1']"
@click="clickImg"
>
<img
v-show="!drawer"
style="height: 40px; width: 25px"
:src="require('@/assets/image/zhankai.png')"
/>
<img
v-show="drawer"
style="height: 40px; width: 25px"
:src="require('@/assets/image/shousuo.png')"
/>
</div>
<!-- 右侧 用户列表 -->
<div :class="[drawer ? 'right' : 'right1']">
<el-card class="box-card">
<div>右侧内容</div>
</el-card>
</div>
</div>
</el-row>
methods: {
clickImg() {
this.drawer = !this.drawer;
},
},
.left {
width: 35%;
transition: all 0.2s;
}
.left1 {
width: 0%;
transition: all 0.2s;
}
.right {
width: 65%;
transition: all 0.2s;
}
.right1 {
width: 95%;
transition: all 0.2s;
}
.box-card {
height: 350px;
background-color: #ff6e6e;
}