货无忧
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.

119 lines
3.1 KiB

2 years ago
<!--
* @Author: weisheng
* @Date: 2023-02-13 10:07:50
* @LastEditTime: 2023-03-29 18:11:20
* @LastEditors: weisheng
* @Description:
* @FilePath: \fant-mini-plus\src\uni_modules\fant-mini-plus\components\hd-overlay\hd-overlay.vue
* 记得注释
-->
<template>
<view>
<hd-transition
v-if="lockScroll"
:show="show"
custom-class="hd-overlay"
:custom-style="overlayStyle"
:duration="duration"
@click="onClick"
@touchmove="noop"
>
<slot></slot>
</hd-transition>
<hd-transition v-else :show="show" custom-class="hd-overlay" :custom-style="overlayStyle" :duration="duration" @click="onClick">
<slot></slot>
</hd-transition>
</view>
</template>
<script lang="ts" setup>
/**
* overlay 遮罩
* @description 创建一个遮罩层用于强调特定的页面元素并阻止用户对遮罩下层的内容进行操作一般用于弹窗场景
* @property {Boolean} show 是否显示遮罩默认 false
* @property {String | Number} zIndex zIndex 层级默认 1
* @property {String | Number} duration 动画时长单位毫秒默认 300
* @property {String | Number} opacity 不透明度值当做rgba的第四个参数 默认 0.5
* @property {Object} customStyle 定义需要用到的外部样式
* @property {Boolean} lockScroll 是否锁定背景滚动锁定时蒙层里的内容也将无法滚动默认 false
* @event {Function} click 点击遮罩发送事件
* @example <hd-overlay :show="show" @click="show = false"></hd-overlay>
*/
import { computed, watch } from 'vue'
import { CommonUtil } from '../..'
interface Props {
// 是否显示遮罩
show?: boolean
// 自定义样式
customStyle?: string
// 动画时长,单位毫秒
duration?: number
// 自定义层级
zIndex?: number
// 是否锁定背景滚动,锁定时蒙层里的内容也将无法滚动
lockScroll?: boolean
// 不透明度值,当做rgba的第四个参数
opacity?: string | number
}
const props = withDefaults(defineProps<Props>(), {
// 是否显示遮罩
show: false,
// 自定义样式
customStyle: '',
// 动画时长,单位毫秒
duration: 300,
// 自定义层级
zIndex: 1,
// 是否锁定背景滚动,锁定时蒙层里的内容也将无法滚动
lockScroll: false,
// 不透明度值,当做rgba的第四个参数
opacity: 0.5
})
const overlayStyle = computed(() => {
const style = {
position: 'fixed',
top: 0,
left: 0,
right: 0,
zIndex: props.zIndex,
bottom: 0,
'background-color': `rgba(0, 0, 0, ${props.opacity})`
}
return CommonUtil.style([style, props.customStyle])
})
const emit = defineEmits(['click'])
// #ifdef MP-LARK
watch(
() => props.show,
(newVal) => {
console.log(newVal)
}
)
// #endif
function onClick() {
/**
* 遮罩被点击时触发
*/
emit('click')
}
// 阻止touchmove
function noop() {}
</script>
<style lang="scss" scoped>
@import '../../libs/css/index.scss';
.hd-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: $overlay-background-color;
}
</style>