基于Element Plus的vClickOutside点击其他的地方关闭弹窗,并且添加多个忽略DOM元素

本文是基于vue3的Element Plus版本。vue2的Element UI是否可用有待验证!

        项目中经常会有一些自己的弹层,需要通过点击其他的地方之后关闭这个弹层。所以就衍生出了vClickOutside的方法。

一、最常用的情况

1、引入ClickOutside

import { ClickOutside as vClickOutside } from "element-plus";

2、在对象的Dom元素中添加对应的事件

<div class="smallDom" v-click-outside="outsideClick">里面</div>

3、在函数中写自己的逻辑

const outsideClick = (e) => {
  console.log('点击的是其他的元素,不是自身')
}

4、完整示例代码

<template>
  <div id="test">
    <div id="bigDom">
      <div class="smallDom" v-click-outside="outsideClick">里面</div>
    </div>
  </div>
</template>
<script setup>
import { ClickOutside as vClickOutside } from "element-plus";
const outsideClick = (e) => {
  console.log('点击的是其他的元素,不是自身')
}
</script>
<style lang="css" scoped>
#bigDom {
  width: 500px;
  height: 600px;
  border: 1px solid black;
}
.smallDom {
  width: 100%;
  height: 200px;
  border: 1px solid red;
}
</style>

二、添加一个忽略DOM

        但是在开发中经常遇到一种情况就是。当我们点击本DOM元素之后的一个元素,也是希望算点击本DOM元素之内,也就是点击另一个元素也希望不触发这个outsideClick函数。那么我们需要这么操作;

1、在自定义指令的时候,后面添加一个:[ignoreDomRef],数组中是需要添加的忽略元素的ref对象;

<div class="smallDom" v-click-outside:[ignoreDom]="outsideClick">里面</div>

2、完整示例代码

<template>
  <div id="test">
    <div id="bigDom">
      <div class="smallDom" v-click-outside:[ignoreDom]="outsideClick">里面</div>
      <div class="smallDom" ref="ignoreDom"></div>
    </div>
  </div>
</template>
<script setup>
import { ClickOutside as vClickOutside } from "element-plus";
import { ref } from "vue";
var ignoreDom = ref()
const outsideClick = (e) => {
  console.log('点击的是其他的元素,不是自身')
}
</script>
<style lang="css" scoped>
#bigDom {
  width: 500px;
  height: 600px;
  border: 1px solid black;
}
.smallDom {
  width: 100%;
  height: 200px;
  border: 1px solid red;
}
</style>

3、遇到的问题,不能添加多个忽略Dom

        但是这里有个问题,就是这个元素只能添加一个,如果我还有一个元素,也想添加到这里的忽略dom元素,不生效;(如果大家知道有什么方法,也可以与博主交流)

<!--此代码不生效-->
<div class="smallDom" v-click-outside:[ignoreDom,ignoreDom2]="outsideClick">里面</div>

三、添加多个忽略DOM

1、通过v-click-outside的$event解决忽略多个Dom

        因为可以获取到点击的事件的$event,所以可以用来判断是不是需要执行outsideClick中的内容。查看$event的内容;利用当前点击的target确认是不是在忽略的Dom元素内,在判断是不是需要执行对应的方法;

        这里用到一个js的contains的方法,用来判断,一个元素是否包含在另一个元素中。

2、完整示例代码

<template>
  <div id="test">
    <div id="bigDom">
      <div class="smallDom" v-click-outside="outsideClick">里面</div>
      <div class="smallDom" ref="ignoreDom"><p>ignoreDom的子元素</p></div>
      <div class="smallDom" ref="ignoreDom2"><p>ignoreDom2的子元素</p><p>ignoreDom2的子元素</p></div>
    </div>
  </div>
</template>
<script setup>
import { ClickOutside as vClickOutside } from "element-plus";
import { ref, onMounted } from "vue";
var ignoreDom =ref(),ignoreDom2 = ref();
const outsideClick = (e) => {
  console.log(e);
  if (
    ignoreDom.value.contains(e.target) ||
    ignoreDom2.value.contains(e.target)
  ) {
    console.log("点击的是忽略的元素,或其子元素");
  } else {
    console.log("点击的是其他的元素");
  }
};
</script>
<style lang="css" scoped>
#bigDom {
  width: 500px;
  height: 600px;
  border: 1px solid black;
}
.smallDom {
  width: 100%;
  height: 200px;
  border: 1px solid red;
}
</style>

以上就能完美的解决点击其他地方关闭弹窗,并且添加多个忽略Dom的完整功能;

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改 Element 分页样式可以通过覆盖 Element 的 CSS 样式来实现。具体步骤如下: 1. 找到 Element 分页组件的 CSS 类名,例如默认分页样式的类名是 `.el-pagination`。 2. 在你的项目中创建一个新的 CSS 文件,例如 `custom.css`。 3. 在 `custom.css` 中定义新的样式,覆盖 Element 的默认样式。例如,要修改分页中每个页码之间的间距,可以添加以下样式: ``` .el-pagination .number { margin-right: 10px; } ``` 这将使每个页码之间的间距变为 10px。 4. 在你的项目中引入 `custom.css` 文件,例如在 HTML 文件中添加以下代码: ``` <link rel="stylesheet" href="path/to/custom.css"> ``` 这样就可以使用自定义的分页样式了。 基于 Element 封装可拖动放大缩小的弹窗,可以使用 Element UI 提供的 Dialog 组件,并结合 CSS 样式和 JavaScript 代码实现。具体步骤如下: 1. 在 HTML 文件中引入 Element UI 和你的自定义 CSS 文件和 JavaScript 文件。例如: ``` <link rel="stylesheet" href="path/to/element-ui.css"> <link rel="stylesheet" href="path/to/custom.css"> <script src="path/to/vue.js"></script> <script src="path/to/element-ui.js"></script> <script src="path/to/custom.js"></script> ``` 2. 在 JavaScript 文件中封装可拖动放大缩小的弹窗组件。以下是一个示例代码: ``` Vue.component('draggable-dialog', { template: ` <el-dialog :visible.sync="visible" :title="title" :width="width" :height="height"> <div :style="getContainerStyle()" @mousedown="startDrag" @mouseup="stopDrag"> <slot></slot> </div> <div class="resize-handle" @mousedown="startResize"></div> </el-dialog> `, props: { title: { type: String, default: '' }, width: { type: String, default: '50%' }, height: { type: String, default: '50%' } }, data() { return { visible: false, dragging: false, resizing: false, lastX: 0, lastY: 0, startX: 0, startY: 0, startWidth: 0, startHeight: 0 } }, methods: { startDrag(e) { this.dragging = true; this.lastX = e.clientX; this.lastY = e.clientY; }, stopDrag() { this.dragging = false; }, startResize(e) { this.resizing = true; this.startX = e.clientX; this.startY = e.clientY; this.startWidth = parseInt(this.width); this.startHeight = parseInt(this.height); }, stopResize() { this.resizing = false; }, getContainerStyle() { let style = { cursor: 'move' }; if (this.dragging) { style.left = (e.clientX - this.lastX) + 'px'; style.top = (e.clientY - this.lastY) + 'px'; } if (this.resizing) { let dx = e.clientX - this.startX; let dy = e.clientY - this.startY; this.width = (this.startWidth + dx) + 'px'; this.height = (this.startHeight + dy) + 'px'; } return style; } } }); ``` 3. 在 HTML 文件中使用自定义的弹窗组件。例如: ``` <draggable-dialog :visible="dialogVisible" :title="dialogTitle" :width="dialogWidth" :height="dialogHeight"> <p>这是一个可以拖动和缩放的弹窗。</p> </draggable-dialog> ``` 这样就可以使用自定义的可拖动放大缩小的弹窗组件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值