158 lines
3.4 KiB
Vue
158 lines
3.4 KiB
Vue
<template>
|
||
<view class="collapse-box" :class="{boxShadow:boxShadow,borderRadius:borderRadius}">
|
||
<view class="title" :class="{border: border}"
|
||
:style="{backgroundColor: !disabled&&isShow?activebg:'',fontSize:fontSize+'rpx',height:height+'rpx',color:!disabled&&isShow?activeColor:''}"
|
||
@click="disabled?'':show()">
|
||
<slot name="title">
|
||
<text>{{title}}</text>
|
||
<image :src="rightIcon?rightIcon:require('./img/arrow-right.png')" class="right-icon" />
|
||
</slot>
|
||
</view>
|
||
<view class="content-box" :style="{height:isShow?contentHeight+'px':'0'}">
|
||
<view id="content" class="content">
|
||
<slot>{{content}}</slot>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
/**
|
||
* collapse 手风琴
|
||
* @property {String} title 面板标题
|
||
* @property {String} content 内容
|
||
* @property {Boolean} open 设置某个面板的初始状态是否打开(默认false)
|
||
* @property {Boolean} disabled 面板是否可以打开或收起(默认false)
|
||
* @property {String} activebg 面板打开时,标题的背景颜色(默认#fff)
|
||
* @property {String} fontSize 标题的文字大小,单位为rpx(默认28)
|
||
* @property {String} height 标题的高度,单位为rpx(默认90)
|
||
* @property {String} rightIcon 标题右侧图标(默认右箭头>)
|
||
* @property {Boolean} boxShadow 面板是否有阴影(默认false)
|
||
* @property {Boolean} borderRadius 面板是否有圆角(默认false)
|
||
* @property {String} activeColor 面板打开时标题的颜色(默认#333)
|
||
* @property {Boolean} border 标题是否显示下边框(默认true)
|
||
*/
|
||
export default {
|
||
props: {
|
||
title: {
|
||
type: String,
|
||
default: "标题"
|
||
},
|
||
content: {
|
||
type: String,
|
||
default: "内容"
|
||
},
|
||
open: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
disabled: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
activebg: {
|
||
type: String,
|
||
default: "#fff"
|
||
},
|
||
fontSize: {
|
||
type: String,
|
||
default: "28"
|
||
},
|
||
height: {
|
||
type: String,
|
||
default: "90"
|
||
},
|
||
rightIcon: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
boxShadow: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
borderRadius: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
activeColor: {
|
||
type: String,
|
||
default: "#333"
|
||
},
|
||
border: {
|
||
type: Boolean,
|
||
default: true
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
isShow: this.open,
|
||
contentHeight: ''
|
||
};
|
||
},
|
||
created() {
|
||
},
|
||
mounted() {
|
||
this.init();
|
||
},
|
||
methods: {
|
||
// 异步获取内容,或者动态修改了内容时,需要重新初始化
|
||
init() {
|
||
this.$nextTick(() => {
|
||
this.queryRect();
|
||
});
|
||
},
|
||
// 查询内容高度
|
||
queryRect() {
|
||
const query = uni.createSelectorQuery().in(this);
|
||
query.select("#content").boundingClientRect(res => {
|
||
this.contentHeight = res.height;
|
||
}).exec()
|
||
},
|
||
show() {
|
||
this.isShow = !this.isShow
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.collapse-box {
|
||
|
||
}
|
||
|
||
.boxShadow {
|
||
box-shadow: 0 4rpx 6rpx rgba($color: #bbb, $alpha: 0.6);
|
||
}
|
||
|
||
.borderRadius {
|
||
border-radius: 16rpx;
|
||
}
|
||
|
||
.title {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
padding: 0 24rpx;
|
||
transition: 0.4s all;
|
||
|
||
.right-icon {
|
||
width: 32rpx;
|
||
height: 32rpx;
|
||
}
|
||
}
|
||
|
||
.border {
|
||
border-bottom: 2rpx solid #eee;
|
||
}
|
||
|
||
.content-box {
|
||
transition: 0.4s all;
|
||
overflow: hidden;
|
||
|
||
.content {
|
||
padding: 32rpx 24rpx;
|
||
}
|
||
}
|
||
|
||
</style>
|