uniapp 类似popover气泡下拉框组件

需要实现一个app端类似于elementUI上popover组件的下拉效果,发现uniapp和uview没找到合适的

以下组件仅测试过app,且细节处需要自行调整

描述: 点击更多按钮后弹出下拉框,点击其他区域会关闭下拉框

效果:

组件:

javascript 复制代码
<!-- 下拉菜单组件 -->
<template>
  <view class="custom-picker">
    <view class="picker-header" @click="togglePicker">
      更多
      <text class="arrow" :class="{ 'arrow-up': showPicker }"></text>
    </view>
    <view v-if="showPicker" class="picker-options">
      <view
        v-for="(item, index) in items"
        :key="index"
        @click="selectItem(item)"
        >{{ item.label }}</view
      >
    </view>
    <!-- 遮罩层,用于点击关闭 -->
    <view
      v-if="showPicker"
      class="mask"
      @click="closePicker"
      catchtouchmove
    ></view>
  </view>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      showPicker: false,
      selectedItem: '',
    }
  },
  methods: {
    togglePicker() {
      this.showPicker = !this.showPicker
    },
    closePicker() {
      this.showPicker = false
    },
    selectItem(item) {
      this.selectedItem = item
      this.showPicker = false
      this.$emit('change', item)
    },
  },
}
</script>

<style scoped>
.custom-picker {
  position: relative;
  z-index: 100;
}
.picker-header {
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}
.picker-options {
  position: absolute;
  width: 200rpx;
  top: 60rpx;
  left: -74rpx;
  border: 1px solid #ccc;
  border-radius: 5px;
  background-color: #fff;
  z-index: 101;
  color: #333;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
.picker-options view {
  padding: 10px;
  border-bottom: 1px solid #eee;
}
.picker-options view:last-child {
  border-bottom: none;
}
.arrow {
  margin-left: 8rpx;
  width: 0;
  height: 0;
  border-left: 12rpx solid transparent;
  border-right: 12rpx solid transparent;
  border-top: 16rpx solid #ffffff;
  transition: transform 0.3s;
  position: relative;
  top: 2rpx;
}
.arrow-up {
  transform: rotate(180deg);
  top: -2rpx;
}
.mask {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 99;
  background-color: transparent;
}
</style>

调用

javascript 复制代码
 <custom-picker :items="items" @change="onCustomPickerChange"></custom-picker>

 items: [
        { label: '删除' },
        { label: '详情' },
        { label: '停用' },
      ],

 onCustomPickerChange(e) {
      console.log(e)
    },
相关推荐
We་ct1 天前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
wefly20171 天前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
C澒1 天前
微前端容器标准化 —— 公共能力篇:通用打印
前端·架构
德育处主任Pro1 天前
前端元素转图片,dom-to-image-more入门教程
前端·javascript·vue.js
木斯佳1 天前
前端八股文面经大全:小红书前端一二面OC(下)·(2026-03-17)·面经深度解析
前端·vue3·proxy·八股·响应式
陈天伟教授1 天前
人工智能应用- 预测新冠病毒传染性:04. 中国:强力措施遏制疫情
前端·人工智能·安全·xss·csrf
zayzy1 天前
前端八股总结
开发语言·前端·javascript
今天减肥吗1 天前
前端面试题
开发语言·前端·javascript
Rabbit_QL1 天前
【前端UI行话】前端 UI 术语速查表
前端·ui·状态模式
小码哥_常1 天前
一文带你吃透Android BLE蓝牙开发全流程
前端