Skip to content

用于包裹页面内容

  • 请注意:popup 的 reference 插槽只能有一个根节点,否则只渲染第一个节点

演示

使用方式:
popup的使用可以用传统插槽方式和虚拟元素触发
<template>
  <div class="row">
    <cl-popup content="我是最普通的调用方式">
      <template #reference>
        <cl-button>普通用法</cl-button>
      </template>
    </cl-popup>
    <cl-popup
      :virtualRef="buttonRef"
      content="虚拟元素触发,这个功能就很适合使用在触发元素和展示内容元素是分开的场景"
    >
    </cl-popup>
    <cl-button ref="buttonRef">virtualRef用法</cl-button>
  </div>
</template>

<script setup lang="ts">
import { ComponentPublicInstance, ref } from 'vue'
const buttonRef = ref<ComponentPublicInstance<HTMLElement> | null>(null)
</script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
主题
属性 effect:dark、light;默认是 light
<template>
  <div class="row">
    <cl-popup content="light">
      <template #reference>
        <cl-button>light</cl-button>
      </template>
    </cl-popup>
    <cl-popup effect="dark" content="dark">
      <template #reference>
        <cl-button>dark</cl-button>
      </template>
    </cl-popup>
  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
不同方向弹出
方向:top、left、right、bottom;是弹出泡出现在目标元素的哪边对齐:start、 center、 end;
<template>
  <div class="row">
    <cl-popup placement="top-start">
      <template #content> 上 - 左 </template>
      <template #reference>
        <cl-button>上 - 左</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="top-center">
      <template #content> 上 - 中 </template>
      <template #reference>
        <cl-button>上 - 中</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="top-end">
      <template #content> 上 - 右 </template>
      <template #reference>
        <cl-button>上 - 右</cl-button>
      </template>
    </cl-popup>
  </div>

  <div class="row">
    <cl-popup placement="left-start">
      <template #content> 左 - 上 </template>
      <template #reference>
        <cl-button>左 - 上</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="left-center">
      <template #content> 左 - 中 </template>
      <template #reference> <cl-button>左 - 中</cl-button> </template>
    </cl-popup>

    <cl-popup placement="left-end">
      <template #content> 左 - 下 </template>
      <template #reference>
        <cl-button>左 - 下</cl-button>
      </template>
    </cl-popup>
  </div>

  <div class="row">
    <cl-popup placement="right-start">
      <template #content> 右 - 上 </template>
      <template #reference>
        <cl-button>右 - 上</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="right-center">
      <template #content> 右 - 中 </template>
      <template #reference>
        <cl-button>右 - 中</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="right-end">
      <template #content> 右 - 下 </template>
      <template #reference>
        <cl-button>右 - 下</cl-button>
      </template>
    </cl-popup>
  </div>

  <div class="row">
    <cl-popup placement="bottom-start">
      <template #content> 下 - 左 </template>
      <template #reference>
        <cl-button>下 - 左</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="bottom-center">
      <template #content> 下 - 中 </template>
      <template #reference>
        <cl-button>下 - 中</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="bottom-end">
      <template #content> 下 - 右 </template>
      <template #reference>
        <cl-button>下 - 右</cl-button>
      </template>
    </cl-popup>
  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
【不处理超出】我是长文本,很长的文本,非常长长长长长长长长长。

【超出提示】我是长文本,很长的文本,非常长长长长长长长长长。

超出截断
txtOverLine:最大行数,默认值 0 不限制超出,若设置,则超出才显示 popup,不超出不显示;
<template>
  <cl-popup content="我是长文本,很长的文本,非常长长长长长长长长长">
    <template #reference> 【不处理超出】我是长文本,很长的文本,非常长长长长长长长长长。 </template>
  </cl-popup>
  <cl-popup content="【超出提示】我是长文本,很长的文本,非常长长长长长长长长长。" :txtOverLine="1">
    <template #reference>
      <p style="max-width: 300px">【超出提示】我是长文本,很长的文本,非常长长长长长长长长长。</p>
    </template>
  </cl-popup>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
触发方式
提供三种触发方式:hover、click、manual,manual由开发者自行控制pop显示隐藏状态,结合v-model使用,组件内部不提供事件
<template>
  <div class="row">
    <cl-popup content="hover">
      <template #reference>
        <cl-button>hover</cl-button>
      </template>
    </cl-popup>
    <cl-popup content="click" trigger="click">
      <template #reference>
        <cl-button>click</cl-button>
      </template>
    </cl-popup>
    <cl-popup content="munual" trigger="manual" v-model="show">
      <template #reference>
        <cl-button @click="show = !show">manual</cl-button>
      </template>
    </cl-popup>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const show = ref(false)
</script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
延迟时间
trigger:hover 模式提供两种延迟,延迟出现 openDelay、延迟隐藏 closeDelay;默认 100ms。openDelay:0 立即出现(注意这会在 reference 多且密时,只要你稍稍动动鼠标,就会满屏的泡,closeDelay:0 立即隐藏(注意需要预留用户鼠标移入弹出泡的时间,除非你不需要 enterable)
<template>
  <div class="row">
    <cl-popup :openDelay="0" content="我是立即出现', openDelay: 0">
      <template #reference>
        <cl-button>立即出现</cl-button>
      </template>
    </cl-popup>
    <cl-popup :closeDelay="0" content="我是立即隐藏', closeDelay: 0">
      <cl-button>立即隐藏</cl-button>
      <template #reference>
        <cl-button>立即隐藏</cl-button>
      </template>
    </cl-popup>
  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
偏移
offset 设置泡在上下左右四个方向上的偏移,可以为负值。默认单位:px,不支持 vh、vw、%,popup 上方弹出,left 值减 offset;popup 下方弹出,left 值加 offset;popup 左侧弹出,top 值减 offset;popup 右侧弹出,top 值加 offset;
<template>
  <div class="row">
    <cl-popup placement="top-center" :offset="20" content="top-center">
      <template #reference>
        <cl-button>top-center</cl-button>
      </template>
    </cl-popup>
    <cl-popup placement="bottom-center" :offset="20" content="bottom-center">
      <template #reference>
        <cl-button>bottom-center</cl-button>
      </template>
    </cl-popup>

    <cl-popup placement="left-center" :offset="20" content="left-center">
      <template #reference>
        <cl-button>left-center</cl-button>
      </template>
    </cl-popup>
    <cl-popup placement="right-center" :offset="20" content="right-center">
      <template #reference>
        <cl-button>right-center</cl-button>
      </template>
    </cl-popup>
  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
箭头设置
visible-arrow 设置显示隐藏箭头;arrow-offset 设置箭头的位置,默认值 0,单位px;【不设置值】箭头始终显示在中间,优先显示在 reference 元素中间,其次是泡中间。设置值】任何情况下都显示在设置的位置。设置的值超出极限,会显示为【不设置值】的效果
<template>
  <div class="row">
    <cl-popup placement="top-center" content="top-center">
      <template #reference>
        <cl-button>arrow-offset:0</cl-button>
      </template>
    </cl-popup>
    <cl-popup placement="top-center" :arrow-offset="5" content="top-center">
      <template #reference>
        <cl-button>arrow-offset:5</cl-button>
      </template>
    </cl-popup>
    <cl-popup placement="top-center" :arrow-offset="500" content="top-center">
      <template #reference>
        <cl-button>arrow-offset:500</cl-button>
      </template>
    </cl-popup>
    <cl-popup placement="top-center" :visible-arrow="false" content="top-center">
      <template #reference>
        <cl-button>隐藏箭头</cl-button>
      </template>
    </cl-popup>
  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>
初始状态
v-model / value:可以设置 pop 初始是否显示。默认隐藏,不创建pop,disabled:是否不能激活弹出信息
<template>
  <div class="row">
    <cl-popup :modelValue="true" content="top-center">
      <template #reference>
        <cl-button>初始显示,状态可用</cl-button>
      </template>
    </cl-popup>
    <cl-popup :modelValue="true" disabled content="top-center">
      <template #reference>
        <cl-button>初始显示,状态不可用</cl-button>
      </template>
    </cl-popup>
    <cl-popup disabled content="top-center">
      <template #reference>
        <cl-button>初始隐藏,状态不可用</cl-button>
      </template>
    </cl-popup>
  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
@import './popup-demo.scss';
</style>

input 参数描述

参数描述类型可选值默认值
v-model / value默认状态是否可见Boolean-false
disabledpop 是否可用Boolean-false
effect主题Stringdark lightdark
trigger触发方式Stringclick hover manualhover
placement出现位置String-top-center
content内容string--
txtOverLine超出最大行数Number-0
preRender是否需要预渲染Boolean-false
enterable鼠标是否可进入到泡中Boolean-true
popupClass自定义 pop 样式String--
offset泡偏移量(px)Number-0
visibleArrow是否显示箭头Boolean-true
arrowOffset箭头偏移Number-0
openDelay延迟出现(hover 触发)Number-100 ms
closeDelay延迟隐藏(hover 触发)Number-100 ms
animated淡入动画Boolean-true
virtualRef虚拟触发的元素ComponentPublicInstance<HTMLElement>| <HTMLElement>-null
outsideAutoCloseWithManual手动触发模式下,是否点击内容外自动关闭boolean-false
参数描述
content内容
reference触发 popup 显示的 元素 ,popup 的 reference 插槽只能有一个根节点,否则只渲染第一个节点