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)
    },
相关推荐
一只小风华~几秒前
BOM Cookie操作详解
开发语言·前端·javascript
xianxin_7 分钟前
HTML5 表单元素
前端
LaoZhangAI8 分钟前
ChatGPT 5发布日期揭秘:2025年8月上线,多模态推理能力全面升级
前端·后端
dingdong858648 分钟前
前端工程化2
前端
cvpv12 分钟前
我将封装史上最优雅的 Axios
前端
Undoom13 分钟前
体系化AI开发方案:豆包新模型矩阵与PromptPilot自动化调优平台深度解析
前端
李剑一15 分钟前
面试官:后端一次性返回给前端十万条数据,渲染这十万条数据怎么能保证不卡顿
前端·面试
xianxin_16 分钟前
HTML5 MathML
前端
小高00716 分钟前
⚡前端底层四连击:Event Loop → 渲染帧 → GC → AST,一篇打通任督二脉
前端·javascript·面试
xianxin_19 分钟前
HTML5 浏览器支持
前端