首页 > 其他分享 >dialog弹窗实现(可添加在任意节点上)

dialog弹窗实现(可添加在任意节点上)

时间:2025-01-04 12:55:54浏览次数:1  
标签:styleObj ll height width dialog props 节点 弹窗

目录

dialog弹窗实现(可添加在任意节点上)

<template>
  <teleport v-if="modelValueHandler || lazyModelValueHandler" to=".ll-adapter">
    <transition name="ll-dialog-fade" appear>
      <div v-if="modelValueHandler" class="ll-dialog__overlay" :style="{zIndex}" @click="modelValueHandler=false">
        <div class="ll-dialog__body" :style="dialogStyle" @click.stop="()=>{}">
          <div class="ll-dialog__header">
            <div class="ll-dialog__title" :data-text="title">
              {{ title }}
              <img class="ll-dialog__close" src="@/assets/dashboard/dialog-close.png" alt=""
                   @click="modelValueHandler=false">
            </div>
          </div>
          <div class="ll-dialog__content">
            <slot></slot>
          </div>
        </div>
      </div>
    </transition>
  </teleport>
</template>

<script>
import { computed, defineComponent, watch, ref } from "vue";
import wideBg from '@/assets/dashboard/dialog-bg-wide.png'
import narrowBg from '@/assets/dashboard/dialog-bg.png'
import smallBg from '@/assets/dashboard/dialog-bg-small.png'

let zIndexGlobal = 2000

export default defineComponent({
  props: {
    modelValue: {
      type: Boolean,
      default: false
    },
    title: {
      type: String,
      default: '提示'
    },
    width: {
      type: String,
    },
    height: {
      type: String,
    },
    size: {
      type: String,
      default: 'small'
    }
  },
  emits: ['update:modelValue'],
  setup(props, context) {
    const modelValueHandler = computed({
      get() {
        return props.modelValue;
      },
      set(newValue) {
        context.emit("update:modelValue", newValue);
      },
    })
    const lazyModelValueHandler = ref(props.modelValue)
    let removeComponentTimer = 0
    const zIndex = ref(zIndexGlobal)
    watch(modelValueHandler, (newValue) => {
      clearTimeout(removeComponentTimer)
      if (newValue) {
        zIndex.value = zIndexGlobal++
        lazyModelValueHandler.value = true
      } else {
        removeComponentTimer = setTimeout(() => {
          lazyModelValueHandler.value = false
        }, 3000)
      }
    })
    const dialogStyle = computed(() => {
      const styleObj = {}
      if (props.size === 'wide') {
        styleObj.backgroundImage = `url("${wideBg}")`
        styleObj.width = '1631px'
        styleObj.height = '785px'
      } else if (props.size === 'narrow') {
        styleObj.backgroundImage = `url("${narrowBg}")`
        styleObj.width = '821px'
        styleObj.height = '955px'
      } else {
        styleObj.backgroundImage = `url("${smallBg}")`
        styleObj.width = '821px'
        styleObj.height = '645px'
      }
      if (props.width) {
        styleObj.width = props.width
      }
      if (props.height) {
        styleObj.height = props.height
      }
      return styleObj
    })
    return {
      modelValueHandler,
      lazyModelValueHandler,
      zIndex,
      dialogStyle,
    }
  }
})
</script>

<style scoped lang="scss">
.ll-dialog__overlay {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  overflow: auto;
  display: flex;
  justify-content: center;
  align-items: center;
  background: rgba(0, 0, 0, 0.5);
}

.ll-dialog__body {
  display: flex;
  flex-direction: column;
  background-repeat: no-repeat;
  background-size: 100% 100%;
}

.ll-dialog__header {
  padding: 20px 20px 10px 20px;
  margin-right: 16px;
}

.ll-dialog__title {
  position: relative;
  text-align: center;
  color: #ffffff;
  font-size: 28px;
  font-weight: 600;
  letter-spacing: 5px;
  line-height: 60px;
}

.ll-dialog__title::after {
  content: attr(data-text);
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  color: #afe8ff;
  mask: linear-gradient(to bottom, #000000, rgba(0, 0, 0, 0));
}

.ll-dialog__close {
  position: absolute;
  right: -15px;
  top: 5px;
  cursor: pointer;
  z-index: 1;
}

.ll-dialog__content {
  flex: 1;
  height: 0;
  padding: 30px 20px;
}

.ll-dialog-fade-enter-active {
  animation: ll-dialog-fade 0.3s ease;
}

.ll-dialog-fade-leave-active {
  animation: ll-dialog-fade 0.3s ease reverse;
}

@keyframes ll-dialog-fade {
  0% {
    opacity: 0;
    transform: translateY(-20px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
</style>

标签:styleObj,ll,height,width,dialog,props,节点,弹窗
From: https://www.cnblogs.com/linding/p/18651766

相关文章

  • 24 两两交换链表中的节点
    思路简单,但是操作的时候还是要注意细节,特别是某些结点的next指针变化需要格外关注,报了很多次错。因为没注意到:每次替换两个结点后,应该让当前的后面的结点指向下两个结点的靠后一点的结点。主要还是画完图后没有走一遍链表classSolution{public:ListNode*swapPairs(List......
  • 数据链路层是OSI模型的第二层,负责在相邻节点间传输数据
    数据链路层是OSI模型的第二层,负责在相邻节点间传输数据。在这一层中,数据以帧(Frame)的形式进行封装和传输。帧是数据链路层的基本传输单位,它不仅包括实际要传输的数据,还包括控制信息,如源地址、目的地址、错误检测码等。这些控制信息帮助接收方正确解读数据,并进行必要的错误处......
  • 单链表的一些操作(c语言):插入头节点、尾节点、删除某个节点
    #include<stdio.h>#include<stdlib.h>structNode{  intdata;  structNode*Next;  /*data*/};typedefstructNodenode;node*Link;// 创建一个新的节点node*CreateNewNode(intdata){  node*NewNode=(node*)malloc(sizeof(node......
  • 链表操作<下>节点的删除和销毁
    注意点:1:悬空指针的处理,释放后如果要再次使用要对其指为空指针2:数据;排序可以用到冒泡排序的方法来解决/用于判断该链表是否为空boolempty(Node*list){returnlist==NULL;//链表不存再就会执行true,否则false;}voidshowList(Node*head){if(empty(h......
  • opencv FileStorage file怎么判断某个节点名字是否存在
    在OpenCV中,使用FileStorage读取文件时,可以通过检查节点是否存在来判断某个节点名字是否存在。可以使用FileNode::empty()方法来实现这一点。示例代码以下是一个示例,展示如何判断某个节点名字是否存在:#include<opencv2/opencv.hpp>#include<iostream>intmain(){......
  • 链表算法篇——链接彼岸,流离节点的相遇之诗(上)
    文章目录前言第一章:链表的意境——节点的孤岛与连接的艺术第二章:链表算法的流动美学第三章:两数相加3.1题目链接:https://leetcode.cn/problems/add-two-numbers/description/3.2题目分析:3.3思路讲解:3.4代码实现:第四章:两两交换链表中的节点4.1题目链接:https://leetc......
  • DOM节点至少包含哪些属性?
    DOM节点至少包含以下三个基本属性:nodeName:节点的名称。这个属性是只读的,它表示节点的名字或类型。对于元素节点,nodeName的值与标签名相同;对于属性节点,它是属性的名称;文本节点的nodeName永远是“#text”;而文档节点的nodeName则是“#document”。nodeValue:节点的值。这个属性......
  • 如何获取元素中最后一个子节点?
    在前端开发中,你可以使用JavaScript来获取元素中的最后一个子节点。这里有两种常用的方法:使用lastChild属性,或者使用children属性配合数组索引。1.使用lastChild属性lastChild属性返回当前节点的最后一个子节点。这个子节点可能是元素节点,也可能是文本节点或注释节点。如果你只......
  • 写一个方法获取页面中所有类型的节点数
    在前端开发中,你可以使用JavaScript的DOMAPI来获取页面中所有类型的节点数。下面是一个示例方法,它使用递归函数来遍历DOM树并计算不同类型的节点数量:functiongetNodeTypeCounts(){constcounts={ELEMENT_NODE:0,ATTRIBUTE_NODE:0,TEXT_NODE:0,CDAT......
  • 如何获取元素的兄弟节点?
    在前端开发中,获取元素的兄弟节点可以通过JavaScript的DOMAPI来实现。以下是一些示例:获取下一个兄弟节点你可以使用nextSibling属性来获取元素的下一个兄弟节点。但请注意,nextSibling会返回下一个兄弟节点,无论它是元素节点还是文本节点(例如,空格或换行符)。如果你只关心元素节......