Popover 弹出层
基本用法
查看示例
vue
<template>
<yy-popover trigger="hover">
<template #trigger>
<yy-button>悬浮</yy-button>
</template>
<div>这是弹出内容</div>
</yy-popover>
</template>
触发方式
查看示例
vue
<script setup lang="ts">
import { ref } from 'vue'
const show = ref(false)
</script>
<template>
<yy-flex>
<yy-popover trigger="click">
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>点击触发</div>
</yy-popover>
<yy-popover trigger="hover">
<template #trigger>
<yy-button>悬浮</yy-button>
</template>
<div>悬浮触发</div>
</yy-popover>
<yy-popover trigger="focus">
<template #trigger>
<yy-button>聚焦</yy-button>
</template>
<div>聚焦触发</div>
</yy-popover>
<yy-popover trigger="manual" :show-popover="show">
<template #trigger>
<yy-checkbox v-model="show" label="选中我触发" />
</template>
<div>手动触发</div>
</yy-popover>
</yy-flex>
</template>
查看示例
vue
<template>
<yy-popover trigger="hover" :keep-alive-on-hover="false">
<template #trigger>
<yy-button>悬浮</yy-button>
</template>
<div>移入我我还是会隐藏</div>
</yy-popover>
</template>
弹出位置
查看示例
vue
<script setup lang="ts">
import { flexCenter } from 'yy-craft'
const allPlacement = [
'top-start',
'top',
'top-end',
'left-start',
'', // 不渲染
'right-start',
'left',
'', // 不渲染
'right',
'left-end',
'', // 不渲染
'right-end',
'bottom-start',
'bottom',
'bottom-end',
] as const
</script>
<template>
<div :style="flexCenter()">
<yy-grid cols="3" :gap="10" :style="{ width: '60%' }">
<yy-gi
v-for="item in allPlacement"
:key="item"
:style="{ display: 'flex', justifyContent: 'center' }"
>
<template v-if="item">
<yy-popover :placement="item" trigger="hover">
<template #trigger>
<yy-button>{{ item }}</yy-button>
</template>
<div>{{ item }}</div>
</yy-popover>
</template>
</yy-gi>
</yy-grid>
</div>
</template>
延迟触发与延时隐藏
查看示例
vue
<template>
<yy-popover trigger="hover" :delay="500" :duration="500">
<template #trigger>
<yy-button>延迟500ms触发, 延迟500ms隐藏</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
设置元素的挂载位置
查看示例
vue
<template>
<yy-popover :to="false">
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
设置包裹元素
查看示例
vue
<template>
<yy-popover
:to="false"
wrapper
wrapper-class="wrapper"
wrapper-style="border: 1px solid #ccc"
>
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
<style scoped>
.wrapper {
display: inline-flex;
border-radius: 10px;
padding: 10px;
}
</style>
内容宽度
查看示例
vue
<template>
<yy-popover width="trigger">
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
不要箭头
查看示例
vue
<template>
<yy-popover :show-arrow="false">
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
不要默认样式
查看示例
vue
<template>
<yy-popover raw>
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
内容类名和样式
查看示例
vue
<template>
<yy-popover
content-class="custom-content"
content-style="color: red; font-weight: bold;"
>
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
<style scoped>
.custom-content {
background-color: #f0f0f0;
padding: 10px;
border-radius: 4px;
}
</style>
箭头类名和样式
查看示例
vue
<template>
<yy-popover arrow-class="custom-class" arrow-style="background-color: red;">
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我是内容</div>
</yy-popover>
</template>
<style scoped>
.custom-class {
width: 20px;
height: 20px;
}
</style>
层级
查看示例
vue
<template>
<yy-popover :z-index="100">
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我的层级只有100</div>
</yy-popover>
</template>
吸附元素距离触发器的距离
查看示例
vue
<template>
<yy-popover :distance-from-trigger="20">
<template #trigger>
<yy-button>点我</yy-button>
</template>
<div>我距离触发器比较远</div>
</yy-popover>
</template>
手动控制位置
查看示例
vue
<script setup lang="ts">
import { ref } from 'vue'
const x = ref(0)
const y = ref(0)
const showPopover = ref(false)
function clickHandle(event: MouseEvent) {
x.value = event.clientX
y.value = event.clientY
showPopover.value = true
}
</script>
<template>
<yy-popover trigger="manual" :show-popover="showPopover" :x="x" :y="y">
<template #trigger>
<div
v-click-outside="() => (showPopover = false)"
:style="{
width: '100px',
height: '100px',
background: 'gray',
cursor: 'pointer',
}"
@click="clickHandle"
/>
</template>
<div>x: {{ x }}, y: {{ y }}</div>
</yy-popover>
</template>
Props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
trigger | 触发方式 | 'click' | 'hover' | 'focus' | 'manual' | 'click' |
placement | 弹出位置 | string | 'bottom' |
width | 内容宽度 width=trigger时内容宽度与触发器宽度一致 | number | string | 'trigger' | - |
showArrow | 是否显示箭头 | boolean | true |
raw | 是否去除默认样式 | boolean | - |
contentClass | 内容类名 | any | - |
contentStyle | 内容样式 | StyleValue | - |
arrowClass | 箭头类名 | any | - |
arrowStyle | 箭头样式 | StyleValue | - |
zIndex | 层级 | number | - |
distanceFromTrigger | 吸附元素距离触发器的距离 | number | 10 |
showPopover | 手动控制显示 | boolean | - |
keepAliveOnHover | 鼠标悬停在内容时不隐藏 (仅在 trigger=hover 时生效) | boolean | true |
delay | 延迟触发时间 (仅在 trigger=hover 时生效) | number | 100 |
duration | 延迟隐藏时间 (仅在 trigger=hover 时生效) | number | 200 |
to | 弹出层挂载位置 | string | RendererElement | boolean | 'body' |
wrapper | 是否使用包裹元素 | boolean | - |
wrapperClass | 包裹元素的类名 | string | - |
wrapperStyle | 包裹元素的样式 | StyleValue | - |
x | 手动控制位置x坐标 (仅在 trigger=manual 时生效) | number | - |
y | 手动控制位置y坐标 (仅在 trigger=manual 时生效) | number | - |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
show | 显示时触发 | - |
showed | 显示动画结束时触发 | - |
hide | 隐藏时触发 | - |
hid | 隐藏动画结束时触发 | - |
clickoutside | 点击内容区域外时触发 | - |
Slots
插槽名 | 说明 |
---|---|
trigger | 触发元素内容 |
default | 弹出层内容 |