You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
3.4 KiB
172 lines
3.4 KiB
2 years ago
|
<template>
|
||
|
<transition
|
||
|
name="slide-fade"
|
||
|
@after-enter="afterEnter">
|
||
|
<el-card
|
||
|
id="slide"
|
||
|
ref="slide"
|
||
|
:style="{ 'z-index': zIndex }"
|
||
|
:body-style="bodyStyle"
|
||
|
class="slide-detail-card-container">
|
||
|
<el-button
|
||
|
class="close-btn"
|
||
|
type="primary"
|
||
|
icon="el-icon-close"
|
||
|
@click="close"/>
|
||
|
<slot/>
|
||
|
</el-card>
|
||
|
</transition>
|
||
|
</template>
|
||
|
<script type="text/javascript">
|
||
|
import {
|
||
|
PopupManager
|
||
|
} from 'element-ui/lib/utils/popup'
|
||
|
|
||
|
|
||
|
export default {
|
||
|
name: 'SlideView', // 客户管理详情 滑动view
|
||
|
components: {},
|
||
|
props: {
|
||
|
bodyStyle: {
|
||
|
type: Object,
|
||
|
default: () => {
|
||
|
return { padding: 0 }
|
||
|
}
|
||
|
},
|
||
|
/** 监听点击事件 隐藏视图 */
|
||
|
listenerIDs: {
|
||
|
type: Array,
|
||
|
default: () => {
|
||
|
return []
|
||
|
}
|
||
|
},
|
||
|
/** 阻挡点击事件 隐藏视图 */
|
||
|
noListenerIDs: {
|
||
|
type: Array,
|
||
|
default: () => {
|
||
|
return []
|
||
|
}
|
||
|
},
|
||
|
noListenerClass: {
|
||
|
type: Array,
|
||
|
default: () => {
|
||
|
return []
|
||
|
}
|
||
|
},
|
||
|
appendToBody: {
|
||
|
type: Boolean,
|
||
|
default: false
|
||
|
},
|
||
|
showClose: {
|
||
|
type: Boolean,
|
||
|
default: true
|
||
|
},
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
zIndex: this.getMaxIndex()
|
||
|
}
|
||
|
},
|
||
|
computed: {},
|
||
|
watch: {},
|
||
|
mounted() {
|
||
|
if (this.appendToBody) {
|
||
|
document.body.appendChild(this.$el)
|
||
|
}
|
||
|
this.listenerIDs.forEach(element => {
|
||
|
if (document.getElementById(element)) {
|
||
|
document
|
||
|
.getElementById(element)
|
||
|
.addEventListener('click', this.handleDocumentClick, false)
|
||
|
}
|
||
|
})
|
||
|
},
|
||
|
|
||
|
beforeDestroy() {
|
||
|
if (this.appendToBody && this.$el && this.$el.parentNode) {
|
||
|
this.$el.parentNode.removeChild(this.$el)
|
||
|
}
|
||
|
},
|
||
|
methods: {
|
||
|
handleDocumentClick(e) {
|
||
|
var hidden = true
|
||
|
this.noListenerIDs.forEach(element => {
|
||
|
if (
|
||
|
document.getElementById(element) &&
|
||
|
document.getElementById(element).contains(e.target)
|
||
|
) {
|
||
|
hidden = false
|
||
|
}
|
||
|
})
|
||
|
|
||
|
this.noListenerClass.forEach(element => {
|
||
|
var items = document.getElementsByClassName(element)
|
||
|
if (items && hidden) {
|
||
|
for (let index = 0; index < items.length; index++) {
|
||
|
const element = items[index]
|
||
|
if (element.contains(e.target)) {
|
||
|
hidden = false
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
if (
|
||
|
document.getElementById('slide') &&
|
||
|
document.getElementById('slide').contains(e.target)
|
||
|
) {
|
||
|
hidden = false
|
||
|
}
|
||
|
if (hidden) {
|
||
|
this.$emit('side-close')
|
||
|
}
|
||
|
},
|
||
|
afterEnter() {
|
||
|
this.$emit('afterEnter')
|
||
|
},
|
||
|
getMaxIndex() {
|
||
|
return PopupManager.nextZIndex()
|
||
|
},
|
||
|
close() {
|
||
|
this.$emit('side-close')
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
<style lang="scss" scoped>
|
||
|
.slide-fade-enter-active,
|
||
|
.slide-fade-leave-active {
|
||
|
will-change: transform;
|
||
|
transition: all 0.35s ease;
|
||
|
}
|
||
|
.slide-fade-enter,
|
||
|
.slide-fade-leave-to {
|
||
|
transform: translateX(100%);
|
||
|
}
|
||
|
|
||
|
|
||
|
.el-card {
|
||
|
overflow: visible;
|
||
|
}
|
||
|
|
||
|
.slide-detail-card-container {
|
||
|
// position: relative;
|
||
|
/*background-color: #f5f6f9;*/
|
||
|
}
|
||
|
.close-btn {
|
||
|
position: absolute;
|
||
|
top: 130px;
|
||
|
left: -20px;
|
||
|
z-index: 10000;
|
||
|
border-radius: 25px;
|
||
|
padding: 2px;
|
||
|
background: #9facc3;
|
||
|
border-color: #9facc3;
|
||
|
|
||
|
/deep/ i {
|
||
|
font-size: 26px;
|
||
|
}
|
||
|
}
|
||
|
</style>
|