效果图

核心思想:
通过设置列表项为相对布局,菜单为绝对布局,并利用正方形旋转实现小三角效果,根据点击位置动态调整菜单显示。
源码:直接能用
js
<template>
<view class="container">
<button @click="toggleMenu">点击显示气泡菜单</button>
<view v-if="isMenuVisible" class="bubble-menu" @click="closeMenu">
<view class="square"></view>
<view class="menu-item" @click.stop="handleMenuItemClick('item1')">菜单项 1</view>
<view class="menu-item" @click.stop="handleMenuItemClick('item2')">菜单项 2</view>
<view class="menu-item" @click.stop="handleMenuItemClick('item3')">菜单项 3</view>
</view>
</view>
</template>
<script setup>
const isMenuVisible = ref(true)
const toggleMenu = () => {
isMenuVisible.value = !isMenuVisible.value
}
const closeMenu = () => {
isMenuVisible.value = false
}
const handleMenuItemClick = item => {
console.log(`点击了 ${item}`)
closeMenu() // 点击后关闭菜单
}
</script>
<style lang="scss" scoped>
.container {
position: relative;
padding: 20px;
}
.bubble-menu {
position: absolute;
top: 50px; /* 根据需要调整 */
left: 0;
background: white;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
z-index: 1000;
padding: 10px;
}
.square {
position: absolute;
top: -10px; /* 三角形位置调整 */
left: 10px; /* 三角形位置调整 */
width: 30rpx;
height: 30rpx;
border: 1px solid #ccc;
border-bottom-color: transparent;
border-right-color: transparent;
transform: rotate(45deg);
background: #ffffff;
}
.menu-item {
padding: 10px 20px;
cursor: pointer;
}
.menu-item:hover {
background-color: #f0f0f0;
}
</style>