微信小程序开发--点击圆圈小问号弹注解tip 点击其他区域关闭(组件 w-tip 弹框在小圆圈的 上下左右 可以自己控制 )

news2024/12/24 8:45:21

引言

在微信小程序开发中,实现用户交互的多样性是提升用户体验的关键之一。本文将详细介绍如何在微信小程序中实现点击圆圈小问号弹出注解(Tip)的功能。这种功能常见于帮助信息、提示说明等场景,能够为用户提供即时的帮助和反馈。

功能实现步骤

1. 界面效果图

2. 如何实现

先说思路 再谈实现 

主要思路 是在最外层view添加点击事件,用来关闭提示框,点击小圆圈问号 在组件执行显示消息框 并在执行前抛出一个方法 关闭其他的w-tip组件(可能有多个tip组件 效果就是 点击其中一个 关闭其他已经点开的) 主要用到事件冒泡和事件捕获(按钮)控件呢 就是以小圆圈为中心 弹消息框 主要是样式

我把他封成微信小程序组件了  下面是使用方法

使用控件的地方

wxml

<view bindtap="handleTap"> 
       <view>
          <text > 订单({{item.orderQuantity}}单)</text>
          <dk-tip id="dk-tip1" Down="{{true}}" Right="{{true}}"
               tipContent='数据来源:销售订单'
              bind:clickTip="handleTap"></dk-tip>
       </view>

 </view>

js 

  /**
   * @desc : 关闭所有的tip
   * @date : 
   * @author : 
   */
    handleTap(){
      this.selectComponent('#dk-tip1').setShowTipFlag(false)
      this.selectComponent('#dk-tip2').setShowTipFlag(false)
      this.selectComponent('#dk-tip3').setShowTipFlag(false)
      this.selectComponent('#dk-tip4').setShowTipFlag(false)
    },
    

handleTap 就是全局 监听  关闭 所有tip组件

组件代码(就是以小圆圈为中心 弹消息框 主要是样式)

wxml:

<!-- 显示 tip 文字 -->
<view class="tipLayout">
  <!-- 上右弹框 -->
  <view wx:if="{{showTip && Up && Right}}" class="tipUpRight" >
    <text>{{tipContent}}</text>
  </view>
  <!-- 上左弹框 -->
  <view wx:if="{{showTip && Up && Left}}" class="tipUpLeft" >
    <text>{{tipContent}}</text>
  </view>
  <!-- 带问号的小圆圈 -->
  <view class="container">
    <van-icon name="question-o" size="30rpx" catchtap="showTip" /> <!-- 添加size属性以控制图标大小(可选) -->
  </view>
  <!-- 下右弹框 -->
  <view wx:if="{{showTip&&Down&&Right}}" class="tipDownRight" >
    <text> {{tipContent}}</text>
  </view>
  <!-- 下左弹框 -->
  <view wx:if="{{showTip&&Down&&Left}}" class="tipDownLeft" >
    <text> {{tipContent}}</text>
  </view>
</view>

js

 
Component({

  /**
   * 组件的属性列表
   */
  properties: {
    showTip: { //是否显示tip
      type: Boolean,
      value: false
    },
    Up: { //显示的方位 上
      type: Boolean,
      value: false
    },
    Down: { //显示的方位 下
      type: Boolean,
      value: false
    },
    Left: { //显示的方位 左
      type: Boolean,
      value: false
    },
    Right: { //显示的方位 右
      type: Boolean,
      value: false
    },
    showTip: { //是否显示tip
      type: Boolean,
      value: false
    },
    tipContent: { //tip显示的内容
      type: String,
      value: ""
    },
  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {
    /**
     * @desc   : 显示tip
     * @author : 
     * @date   : 2024/4/25 11:46
     */
    showTip(e) {
      this.triggerEvent('clickTip', {    })
      this.setData({
        showTip: true
      })
    },
    setShowTipFlag(flag) {
      this.setData({
        showTip: flag
      })
    },
  }
})

css:

.tipDownRight {
  min-height: 80rpx;
  color: white;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  padding: 8rpx 16rpx;
  background: rgba(0, 0, 0, 0.7);
  position: absolute; 
  /* 使用百分比或负值rpx,确保它完全在图标上方 */
  transform: translateY(70%);
  /* 另一个选项,使用transform以确保更精确的控制 */
  left: 0;
  /* 如果需要,可以调整或移除 */
  border-radius: 12rpx;
  width: max-content;
}

.tipDownRight:after {
  content: "\00a0";
  width: 0;
  height: 0;
  display: block;
  border-style: solid;
  border-width: 8rpx;
  border-color: transparent transparent rgba(0, 0, 0, 0.7) transparent;
  position: absolute;
  z-index: 1;
  top: -14rpx;
  left: 10rpx;
}

.tipDownLeft {
  min-height: 80rpx;
  color: white;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  padding: 8rpx 16rpx;
  background: rgba(0, 0, 0, 0.7);
  position: absolute; 
  /* 使用百分比或负值rpx,确保它完全在图标上方 */
  transform: translateY(70%);
  /* 另一个选项,使用transform以确保更精确的控制 */
  right: 0;
  /* 如果需要,可以调整或移除 */
  border-radius: 12rpx;
  width: max-content;
}

.tipDownLeft:after {
  content: "\00a0";
  width: 0;
  height: 0;
  display: block;
  border-style: solid;
  border-width: 8rpx;
  border-color: transparent transparent rgba(0, 0, 0, 0.7) transparent;
  position: absolute;
  z-index: 1;
  top: -14rpx;
  right: 10rpx;
}

.tipUpRight {
  min-height: 80rpx;
  color: white;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  padding: 8rpx 16rpx;
  background: rgba(0, 0, 0, 0.7);
  position: absolute;
  top: -50%;
  /* 使用百分比或负值rpx,确保它完全在图标上方 */
  transform: translateY(-100%);
  /* 另一个选项,使用transform以确保更精确的控制 */
  left: 0;
  /* 如果需要,可以调整或移除 */
  border-radius: 12rpx;
  width: max-content;
}

.tipUpRight:after {
  content: "\00a0";
  width: 0;
  height: 0;
  display: block;
  border-style: solid;
  border-width: 8rpx;
  border-color: rgba(0, 0, 0, 0.7) transparent transparent transparent; 
  position: absolute;
  z-index: 1;
  bottom: -14rpx;
  left: 10rpx;
}

.tipUpLeft {
  min-height: 80rpx;
  color: white;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  padding: 8rpx 16rpx;
  background: rgba(0, 0, 0, 0.7);
  position: absolute;
  top: -50%;
  /* 使用百分比或负值rpx,确保它完全在图标上方 */
  transform: translateY(-100%);
  /* 另一个选项,使用transform以确保更精确的控制 */
  right: 0;
  /* 如果需要,可以调整或移除 */
  border-radius: 12rpx;
  width: max-content;
}

.tipUpLeft:after {
  content: "\00a0";
  width: 0;
  height: 0;
  display: block;
  border-style: solid;
  border-width: 8rpx;
  border-color: rgba(0, 0, 0, 0.7) transparent transparent transparent; 
  position: absolute;
  z-index: 1;
  bottom: -14rpx;
  right: 10rpx;  
}

.container {
  display: flex;
  align-items: center;
  justify-content: center;
}

.tipLayout {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
  /* 或其他适当的高度 */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思25天学习打卡营第17天|LLM-基于MindSpore的GPT2文本摘要

打卡 目录 打卡 环境准备 准备阶段 数据加载与预处理 BertTokenizer 部分输出 模型构建 gpt2模型结构输出 训练流程 部分输出 部分输出2&#xff08;减少训练数据&#xff09; 推理流程 环境准备 pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspo…

两个数组的dp问题

目录 最长公共子序列 不相交的线 不同的子序列 通配符匹配 正则表达式匹配 交错字符串 两个字符串的最小ASCII删除和 最长重复子数组 声明&#xff1a;接下来主要使用动态规划来解决问题&#xff01;&#xff01;&#xff01; 最长公共子序列 题目 思路 根据经验题目…

项目笔记| 基于Arduino和IR2101的无刷直流电机控制器

本文介绍如何使用 Arduino UNO 板构建无传感器无刷直流 &#xff08;BLDC&#xff09; 电机控制器或简单的 ESC&#xff08;电子速度控制器&#xff09;。 无刷直流电机有两种类型&#xff1a;有传感器和无传感器。有感无刷直流电机内置3个霍尔效应传感器&#xff0c;这些传感…

宝塔SSL续签失败

我有2个网站a和b&#xff08;文字中用baidu.com替换我的域名&#xff09; b是要续签那个&#xff0c;但续签报错&#xff1a; nginx version: nginx/1.22.1 nginx: [emerg] host not found in upstream "github.com" in /www/server/panel/vhost/nginx/proxy/a.bai…

【Redis进阶】事务

1. Redis与MySQL的事务差别 相信一谈到事务&#xff0c;大家马上就能联想到MySQL的事务&#xff0c;其事务具有ACID四大特性&#xff0c;但是Redis的事务相比较于MySQL&#xff0c;那就是个"弟中弟"&#xff0c;下面我们就来简单对比两者的事务特性&#xff1a; 原…

用神经网络求解微分方程

微分方程是物理科学的主角之一&#xff0c;在工程、生物、经济甚至社会科学中都有广泛的应用。粗略地说&#xff0c;它们告诉我们一个量如何随时间变化&#xff08;或其他参数&#xff0c;但通常我们对时间变化感兴趣&#xff09;。我们可以了解人口、股票价格&#xff0c;甚至…

【Java面向对象】二进制I/O

文章目录 1.二进制文件2.二进制 I/O 类2.1 FileInputStream 和 FileOutputStream2.2 FilterInputStream和 FilterOutputStream2.3 DatalnputStream 和 DataOutputStream2.4 BufferedInputStream 和 BufferedOutputStream2.5 ObjectInputStream 和 ObjectOutputStream 2.6 Seria…

深入理解 Linux Zero-copy 原理与实现策略图解

用户态和内核态 一般来说&#xff0c;我们在编写程序操作 Linux I/O 之时十有八九是在用户空间和内核空间之间传输数据&#xff0c;因此有必要先了解一下 Linux 的用户态和内核态的概念。 从宏观上来看&#xff0c;Linux 操作系统的体系架构分为用户态和内核态&#xff08;或者…

昇思25天学习打卡营第24天|ResNet50迁移学习

课程打卡凭证 迁移学习 迁移学习是机器学习中一个重要的技术&#xff0c;通过在一个任务上训练的模型来改善在另一个相关任务上的表现。在深度学习中&#xff0c;迁移学习通常涉及在一个大型数据集&#xff08;如ImageNet&#xff09;上预训练的模型上进行微调&#xff0c;以便…

设计模式之策略模式_入门

前言 最近接触了优惠券相关的业务&#xff0c;如果是以前&#xff0c;我第一时间想到的就是if_else开始套&#xff0c;这样的话耦合度太高了&#xff0c;如果后期添加或者删除优惠券&#xff0c;必须直接修改业务代码&#xff0c;不符合开闭原则&#xff0c;这时候就可以选择我…

vue3.0学习笔记(一)——vue3简介与vite脚手架的使用

1. 为什么学vue3 Vue3现状&#xff1a; vue-next 2020年09月18日&#xff0c;正式发布vue3.0版本。但是由于刚发布周边生态不支持&#xff0c;大多数开发者处于观望。现在主流组件库都已经发布了支持vue3.0的版本&#xff0c;其他生态也在不断地完善中&#xff0c;这是趋势。…

Python | Leetcode Python题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; class Solution:def missingNumber(self, nums: List[int]) -> int:n len(nums)total n * (n 1) // 2arrSum sum(nums)return total - arrSum

Qt第十三章 目录和文件操作

目录和文件操作 文章目录 目录和文件操作设备I/O简介I/O设备的类型基本文件读写QFileQTemporaryFile 流操作QTextStreamQDataStream QFileInfoQDirQFileSystemWatcherQStandardPathsQSettings 设备I/O 简介 I/O设备的类型 基本文件读写 QFile QFile file("C:/Users/PV…

Cisco 路由重发布 —— 实现路由信息在不同路由域间的传递

一、技术背景 在实际的组网中&#xff0c;可能会遇到这样一个场景&#xff1a;在一个网络中同时存在两种或者两种以上的路由协议。例如客户的网络原先是纯 Cisco 的设备&#xff0c;使用 EIGRP 协议将网络的路由打通。但是后来网络扩容&#xff0c;增加了一批华为的设备&#…

HAL库源码移植与使用之低功耗模式

低功耗特性对用电池供电的产品&#xff1a; 更小电池体积&#xff08;降低了大小和成本&#xff09; 延长电池寿命 电磁干扰更小&#xff0c;提高无线通信质量 电源设计更简单&#xff0c;无需过多考虑散热问题 电源供电区分为&#xff1a; 分为VDD供电区…

平面五杆机构运动学仿真matlab simulink

1、内容简介 略 89-可以交流、咨询、答疑 2、内容说明 略 ] 以 MATLAB 程序设计语言为平台 , 以平面可调五杆机构为主要研究对象 , 给定机构的尺寸参数 , 列出所 要分析机构的闭环矢量方程 , 使用 MATLAB 软件中 SIMULINK 仿真工具 , 在 SIMULINK 模型窗口下建立数…

深入理解TensorFlow底层架构

目录 深入理解TensorFlow底层架构 一、概述 二、TensorFlow核心概念 计算图 张量 三、TensorFlow架构组件 前端 后端 四、分布式计算 集群管理 并行计算 五、性能优化 内存管理 XLA编译 六、总结与展望 深入理解TensorFlow底层架构 一、概述 TensorFlow是一个开…

从0开始的STM32HAL库学习8

PWM控制舵机 配置环境 1. 选择TIM2时钟 2.选择内部时钟模式&#xff0c;打开通道二 3.分频系数PSC:72-1 自动重装寄存器ARR:20000-1 输出比较寄存器 CCR:500~2500( 后面可调整 ) 脉冲选择500后期可以改 编辑代码 调用启动函数 HAL_TIM_PWM_Start(&htim2,TIM_CHANN…

一分钟图情论文:《智慧数据视角下古籍数字出版的创新路径》

由武汉大学的雷珏莹和王晓光合著的《智慧数据视角下古籍数字出版的创新路径研究》论文从智慧数据1的视角出发&#xff0c;探讨了我国古籍数字出版的现状及其发展瓶颈&#xff0c;提出了古籍数字出版在内容、形式、服务和技术四个方面的创新路径。 文中, 研究者首先详细分析了当…

使用Fiddler进行Android和IOS抓包

Android抓包 要使用Telerik Fiddler Classic捕获Android设备的网络流量&#xff0c;您需要执行以下步骤&#xff1a; 在Fiddler Classic上进行设置&#xff1a; 确保已安装并使用BouncyCastle作为证书生成器。较新的Android版本会拒绝有效期超过两年的证书&#xff0c;目前只…