vue3公共弹窗封装

1.在app.vue中引入

<router-view><router-view>
  <!-- 一级弹窗 -->
 <PopIndexView v-if="store.show" :name="store.name"></PopIndexView>
   <!-- 二级弹窗 -->
  <PopIndexView v-if="store.subShow" :name="store.subname"></PopIndexView>
  <script setup lang="ts">
	import { popone } from "@/stores/popup";
	const store = popone();
</script>

2.公用蒙层

<!-- 弹窗蒙层 -->
<template>
  <div class="popup">
    <Component :is="name"></Component>
  </div>
</template>

<script setup>
defineProps({ name: Object });
</script>
<style lang="less" scoped>
.popup {
  position: fixed;
  top: 0;
  height: 0;
  width: 100vw;
  height: 100vh;
  z-index: 100;
  background-color: rgba(210, 228, 255, 0.4);
  backdrop-filter: blur(2.13px);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 200;
}
</style>

3.popup.css 弹窗动效 assets>css>pop.css

@keyframes bounce-in {
  0% {
    height: 1px;
    transform: scaleX(0) scaleY(0);
  }
  60% {
    height: 1px;
    transform: scaleX(1);
  }
  100% {
    transform: scaleX(1) scaleY(1);
  }
}
@keyframes bounce-out {
  0% {
    transform: scaleX(1) scaleY(1);
  }
  40% {
    height: 1px;
    transform: scaleX(1);
  }
  100% {
    height: 1px;
    transform: scaleX(0) scaleY(0);
  }
}

.popup-in {
  animation: bounce-in 0.8s ease;
}

.popup-out {
  animation: bounce-out 0.8s ease;
}


main.ts引入
import "@/assets/styles/pop.css"; //弹窗动效

4 store(pinia)中新建 popup.js(一级弹窗) 和subpopup.js (二级弹窗)

import { defineStore } from "pinia";

export const popone = defineStore("content", {
  state: () => {
    return {
      show: false, // 一级弹窗显隐
      name: "", // 弹窗组件名称
      title: "", // 弹窗标题
      className: "popup-in", // 特效类名
      checkInfo: null, // 检查分析信息
      url: null, // 请求地址
      params: {}, // 请求参数
      tags: [], // 弹窗表头
      dataList: null, // 弹窗数据
      colors: {}, // 颜色
      font: "", // 颜色匹配关键字
      spinning: true, // 数据加载状态
      total: 0, // 分页的总数
      order: false, // 是否展示序号
    };
  },
});

5打开一级弹窗

 @click="showDialog(num)"
 import PopSaleDetail from "@/components/pop/SaleDetail.vue";  //引入弹窗组件
 import { popone } from "@/stores/popup";
 // 查看详情 弹窗
const store = popone();
const showDialog = (val) => {
  if (val == 1) {
    store.show = true;
    store.title = "销售明细详情";
    store.name = PopSaleDetail;
    //控制打开动效
     setTimeout(() => {  
      store.className = "popup-in";
    }, 700);
  } else if (val == 2) {
    store.show = true;
    store.title = "放伞人排行榜详情";
    store.name = PopvideoPop;
     //控制打开动效
     setTimeout(() => {  
      store.className = "popup-in";
    }, 700);
  }
};

6 关闭弹窗

// 弹窗动效
import { popone } from "@/stores/popup";
const store = popone();
const className = ref(store.className);
const close = () => {
  // store.className = "popup-out";
  className.value = "popup-out";
  setTimeout(() => {
    store.show = false;
  }, 600);
};
//关闭弹窗  you动效
const colse = () => {
  className.value = "popup-out";

  setTimeout(() => {
    store.shows = false;
  }, 700);
};

7.弹窗css

  <div class="Sale-Detail-pop" :class="className">
    <div class="Sale-Detail-pop-container">
    </div>
  </div>
  <script>
	// 弹窗动效
	import { popone } from "@/stores/popup";
	const store = popone();
	const className = ref(store.className);
  </script>


<style lang="less" scoped>
.Sale-Detail-pop {
  width: 76.6875rem;
  height: 54rem;
  overflow: hidden;

  &-container {
    width: 100%;
    height: 100%;
    background: #ffffff;
    border-radius: 0.6875rem;
    border: 0.0625rem solid #a0cafe;
    padding: 2.5rem 2.6875rem 2rem 2.6875rem;
    box-sizing: border-box;
    position: relative;
    overflow: hidden;
  }
 }
</style>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是最新版本的Vue.js框架,它具有更强大的功能和性能优化,可以实现可拖动弹窗封装。 首先,我们可以利用Vue3的自定义指令来实现拖动效果。首先在弹窗组件中添加一个容器元素,用来表示弹窗的位置和大小。然后,在该容器元素上添加一个自定义指令,比如"v-draggable"。在该自定义指令中,我们可以通过监听鼠标事件来实现拖动功能。当鼠标按下时,记录当前鼠标的位置坐标,并监听鼠标移动事件,不断地更新弹窗容器的位置坐标。最后,在鼠标松开的时候,停止拖动。 接下来,我们可以为弹窗组件添加一些控制按钮,比如关闭按钮和最小化按钮。这些按钮可以通过Vue3的事件绑定来实现对应的功能。例如,点击关闭按钮后,可以通过触发一个"close"事件来关闭弹窗。 此外,我们还可以利用Vue3的响应式数据和计算属性来实现弹窗的位置和大小自动调整。通过监听窗口大小变化的事件,并实时更新弹窗容器的位置和大小,使之适应不同的显示设备和分辨率。 最后,为了防止拖动时超出边界的情况,我们可以在自定义指令中添加一些边界限制的判断逻辑,以确保弹窗不会超出容器范围。 综上所述,通过Vue3的自定义指令、事件绑定、响应式数据和计算属性,我们可以很方便地封装一个可拖动的弹窗组件,并且可以根据需要添加其他功能和样式,以满足不同的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值