微信小程序实现气泡弹出框

这个组件可以实现
引用别人的组件,上面github可以很好的实现气泡弹窗效果

在这里插入图片描述

  <view style="margin-top: 200rpx;" class="hello">
    <view>	
      <!-- 以下style样式均为实现动画效果 -->
      <view bindtap="show" class="timePicker" style="position:relative" >
        第一列
      </view>
      <!-- style 其中40*4 40为列表格的固定高度,单位为px,4为列表格数量 -->
      <view class="box" style="height:{{show?40*4:'0'}}px; position: absolute; ">
        <!-- 展示行 -->
          <view class="box-in" bindtap="he">编辑</view>
          <view class="box-in">删除</view>
          <view class="box-in">详情</view>
      </view>

    </view>
    <view>hello你认为呢</view>

  </view>

show:function(){
//如果show值为true,则更改为false 反之设置true
if(this.data.show){
this.setData({
show:false
})
}else{
this.setData({
show:true
})
}
},

he(){
console.log(“sadasdd”)
this.setData({
show:!this.show
})
wx.navigateTo({
url: ‘/pages/test1/index’,
})
},

在这里插入图片描述

<view style="margin-top: 200rpx;" class="hello">
    <view>
      <!-- 以下style样式均为实现动画效果 -->
      <view bindtap="show" class="timePicker" style="position:relative">
        第一列
      </view>
      <!-- style 其中40*4 40为列表格的固定高度,单位为px,4为列表格数量 -->


    </view>
    <view style="position: relative;">
      <view class="sanjiaoxing" wx:if="{{show}}" style="position: absolute; left: 60rpx;"></view>
      <view class="box" style="height:{{show?40*4:'0'}}px; position: absolute;top: 20rpx; border-radius: 10rpx;">
        <view class="box-in" bindtap="he">编辑</view>
        <view class="box-in">删除</view>
        <view class="box-in">详情</view>
      </view>


    </view>


    <view>hello你认为呢</view>

  </view>
.sanjiaoxing{
      /*宽高为0*/
      width: 0;
      height: 0;
      /*在三角形底边设置一个边界颜色/
      border-top: 20px solid red;
      /*其它3边设置相同颜色,*/
      border-left:10px solid transparent;
			border-right:10px solid transparent;
      border-bottom:10px solid #fff;
}

样式有点丑,要继续优化,可以引用对应的气泡类型的组件,可以更好的实现效果。

在这里插入图片描述

优化:

<!--components/tabchange/index.wxml-->
<view style="margin-top: 400rpx;" class="hello">
      <view style="position: relative;">
      <!-- 以下style样式均为实现动画效果 -->
      <view style="">
        <view class="bubble" style="position: absolute; top: -320rpx;" wx:if="{{show}}">
          <view class="box-in" bindtap="he">盘点</view>
          <view class="box-in" bindtap="del">盘点记录</view>
          <view class="box-in">含水量</view>
          <view class="box-in">含水量记录</view>
        </view>
        <view bindtap="show" style="position: absolute; width: 130rpx;text-align: center;">
          <!-- 图标 -->
          <van-icon name="more-o" size="20" />
        </view>
        <!-- 站行 -->
        <view style="width: 100%;height: 40rpx;"></view>
      </view>
    </view>
</view>

.bubble{
  width:190rpx;
  height:290rpx;
  background:#fff;
  border:1rpx solid #ddd;
  border-radius: 14rpx;
}

.bubble::after{
  content: '';
  position: absolute;
  left:50rpx;
  bottom:-32rpx;
  z-index: 2;
  width: 0;
  height: 0;
  border: 18rpx solid;
  border-color: rgb(211, 207, 207) transparent  transparent  transparent ;
}

.box{
  width:30%;
  overflow: hidden;
  background-color: #fff;
  box-shadow: 0 0 15rpx black
}
.box-in{
  display: flex;
  align-items: center;
  height:70rpx;
  padding-left: 10rpx;
  border-bottom: #E5E5E5 1rpx solid;
  z-index: 99;
}
{
  "component": true,
  "usingComponents": {
    "van-icon": "@vant/weapp/icon/index"
  }
}
// components/common/son-home-info-template/index.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    //是否是仓库管理
    isBinManage: {
      type: Boolean,
      value: false
    },
    dataItem: {},
    navTitle: {
      type: String,
      value: ""
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
     show:false
  },

  /**
   * 组件的方法列表
   */
  methods: {
    he(){
      this.setData({
        show:!this.data.show
      })
      wx.showToast({
        title: '点击了盘点',
        icon:'none'
      })
    },
    show:function(){
      //如果show值为true,则更改为false  反之设置true
      if(this.data.show){
        this.setData({
          show:false
        })
      }else{
        this.setData({
          show:true
        })
      }
    },
  },
  lifetimes: {
    ready() {
      this.setData({
        dataItem: this.properties.dataItem
      })
    }
  }
})
### 微信小程序实现弹出框组件的示例与教程 #### 1. 自定义窗组件基础 通过创建一个简单的自定义窗组件,可以满足在页面中点击按钮触发显示窗的需求。这种窗可以根据具体业务场景调整样式和内容[^1]。 以下是基于微信小程序架的一个简单窗组件示例: ```javascript // components/popup/index.js Component({ properties: { showPopup: { type: Boolean, value: false } }, methods: { onClose() { this.triggerEvent('closepopup'); } } }); ``` ```html <!-- components/popup/index.wxml --> <view class="popup-overlay" hidden="{{!showPopup}}"> <view class="popup-content"> <text>这是窗的内容</text> <button bindtap="onClose">关闭</button> </view> </view> ``` ```css /* components/popup/index.wxss */ .popup-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center; } .popup-content { background-color: white; padding: 20px; border-radius: 8px; } ``` 此代码片段展示了一个基本的窗逻辑,其中 `properties` 定义了控制窗显隐的状态变量 `showPopup`,并通过事件机制通知父级组件更新状态。 --- #### 2. 使用 UniApp-Vue3 构建更复杂的出选择器 如果希望构建更加复杂的功能型弹出框(如选项选择),可以借助 **UniApp** 和 **Vue3** 的能力开发跨平台兼容的选择器组件。例如,`wo-pop-selector` 是一款支持 H5 和微信小程序出选择组件[^2]。 以下是一个简化版的 Vue3 风格实现思路: ```vue <template> <view v-if="visible" class="pop-selector"> <view class="selector-mask" @click="handleClose"></view> <view class="selector-container"> <picker mode="selector" :range="options" @change="handleChange">{{ selected }}</picker> </view> </view> </template> <script setup> import { ref } from 'vue'; const visible = ref(false); const options = ['选项一', '选项二', '选项三']; const selected = ref(''); function openSelector() { visible.value = true; } function handleClose() { visible.value = false; } function handleChange(e) { const index = e.detail.value; selected.value = options[index]; } </script> <style scoped> .pop-selector { position: relative; } .selector-mask { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; background-color: rgba(0, 0, 0, 0.7); } .selector-container { margin-top: 20px; text-align: center; } </style> ``` 上述代码展示了如何利用 Vue3 的响应式特性快速搭建一个带有遮罩层的下拉选择器。 --- #### 3. 气泡菜单组件的应用 对于某些特定场景下的交互设计,比如模仿微信消息界面中的气泡菜单功能,则可以通过监听目标元素的位置动态渲染气泡菜单位置[^3]。 下面提供一段核心逻辑作为参考: ```javascript Page({ data: { menuVisible: false, menuPosition: {} }, toggleMenu(event) { const rect = event.currentTarget.getBoundingClientRect(); this.setData({ menuVisible: !this.data.menuVisible, menuPosition: { x: rect.left + rect.width / 2, y: rect.top - 50 } }); }, hideMenu() { this.setData({ menuVisible: false }); } }); ``` ```html <button catchtap="toggleMenu">点击显示菜单</button> <view wx:if="{{menuVisible}}" style="position:absolute;transform:translateX({{menuPosition.x}}px); translateY({{menuPosition.y}}px)"> <!-- 菜单项 --> </view> ``` 该方法适用于需要精准定位的小范围操作提示或快捷工具栏的设计需求。 --- #### 总结 无论是基础窗还是高级交互组件,在微信小程序生态内均有成熟的解决方案可供借鉴。开发者可根据项目实际情况灵活选用原生 API 或第三方库完成所需功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值