vue3 实现点击元素外的区域隐藏该元素,但点击该元素的绝对定位的子元素不隐藏?
比如这种点击红色框以外的区域
回答:
把事件委托给 document
,点击的时候判断是否点到目标元素,没点到就算 clickOutside
/** * @function clickOutSideRef - 用于初始化 clickOutSide 点击事件
* @param {Function} clickOutsideCallback - 点击到区域外时的回调函数
*/
const clickOutSideRef = (clickOutsideCallback) => {
const ref = ref(null);
const clickHandler = (event) => {
const { target } = event;
// 判断是否点在外面
if(!target.contains(ref.value)){
clickOutsideCallback(event);
}
}
onMounted(() => {
if(!ref) return;
document.addEventListener("click", clickHandler);
});
onBeforeUnount(() => {
document.removeEventListener("click", clickHandler);
});
return ref;
}
使用方法与 vue.ref
类似,但是需要传入 clickOutSide
回调函数:
<script setup> const ref = clickOutSideRef(() => {
alert('点到外面了');
});
</script>
<template>
<div ref="ref">点点试试</div>
</template>
我对 Vue3 并不熟悉,以上代码未经测试,仅提供一种思路。
回答:
<template> <div>
<button @click="showElement">显示/隐藏</button>
<div ref="target" v-show="visible" @click="handleClick">
<!-- 子元素 -->
<div ref="child" class="child" style="position: absolute;">我是不会隐藏的</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
visible: false,
}
},
methods: {
showElement() {
this.visible = !this.visible
},
handleClick(event) {
const target = this.$refs.target
const child = this.$refs.child
if (target && target.contains(event.target)) {
// 点击了目标元素或其子元素,不处理
if (child && child.contains(event.target)) {
// 点击了子元素,不隐藏目标元素
} else {
// 没有点击子元素,隐藏目标元素
this.visible = false
}
} else {
// 点击了目标元素外的区域,隐藏目标元素
this.visible = false
}
},
},
}
</script>
以上是 vue3 实现点击元素外的区域隐藏该元素,但点击该元素的绝对定位的子元素不隐藏? 的全部内容, 来源链接: utcz.com/p/934102.html