微信小程序【五】好玩的点击展开弹框功能

news2024/11/15 11:20:15

弹出效果

  • 步骤一、index.js
  • 步骤二、index.json
  • 步骤三、index.wxml
  • 步骤四、index.wxss

效果简述:恶搞的好玩点击效果,点击后展开
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

步骤一、index.js

Page({
  data: {
    isPlaying: true,
    animationClass: 'music-icon',
    show_menu: false, // 菜单是否激活
    show_popup: false, // 弹框是否显示
    popup_content: '', // 弹框内容
    // 菜单列表
    menu: [
      {
        icon: 'http://xxxx/organization.png', // 使用路径
        name: '组局(组橘)'
      },
      {
        icon: 'http://xxxx/calculator.png',
        name: '算钱'
      },

      {
        icon: 'http://xxxx/ball.png',
        name: '精灵球'
      },
      {
        icon: 'http://xxxx/competition.png',
        name: '比赛'
      },
      {
        icon: 'http://xxxx/eat.png',
        name: '夜宵',
        url: '/pages/supper/supper'
      },
      {
        icon: 'ai.png',
        name: 'AI'
      },
    ],
    currIndex: '', // 当前选中菜单索引,默认为空,无选中
    menu_add: 'http://xxxx/sunbawang.png' // 中间点击图标
  },
  // 菜单点击事件
  clickActive(e) {
    let { index } = e.currentTarget.dataset;
    if (this.data.currIndex === index || index === undefined) return;
    this.setData({
      currIndex: index,
      show_popup: true,
      popup_content: this.data.menu[index].name
    });
  },
  // 点击按钮事件
  showMenu() {
    let { show_menu } = this.data;
    this.setData({
      show_menu: !show_menu,
      currIndex: ''
    });
  },
  // 隐藏弹框
  hidePopup() {
    this.setData({
      show_popup: false
    });
  },
  // 阻止事件冒泡
  stopPropagation() {}
});


步骤二、index.json

{
  "component": true,

  "usingComponents": {
    "navigation-bar": "/components/navigation-bar/navigation-bar"
    
  },
  "navigationBarTextStyle": "white",
  "navigationBarBackgroundColor": "#ffc0cb",
  "navigationBarTitleText": "圆形菜单弹出选中动画"
  
}


步骤三、index.wxml

<!-- pages/cssCase/circleMenu/index.wxml -->
<view class="container">
  <view class="content"></view>
</view>

<view class="menu_container">
  <view class="menu-box {{show_menu ? 'active' : ''}}">
    <block wx:for="{{menu}}" wx:key="index" wx:for-item="item" wx:for-index="index">
      <view class="menu-box-item {{currIndex === index ? 'active' : ''}}" style="--n:{{index}};--deg:{{360/menu.length}}deg" data-index="{{index}}" catchtap="clickActive">
        <image class="icon" src="{{item.icon}}" style="--deg:{{-360/menu.length}}deg" />
      </view>
    </block>
    <view class="menu-box-active" style="--n:{{currIndex}};--deg:{{360/menu.length}}deg"></view>
  </view>
  <view class="menu-add-box {{show_menu ? 'active' : ''}}" catchtap="showMenu">
    <image class="icon" src="{{menu_add}}" />
  </view>
</view>

<!-- 弹框 -->
<view class="popup {{show_popup ? 'show' : ''}}" catchtap="hidePopup">
  <view class="popup-content" catchtap="stopPropagation">
    <text>{{popup_content}}</text>
    <!-- 这里可以添加更多的文字、图片等内容 -->
  </view>
</view>

步骤四、index.wxss

/* pages/cssCase/circleMenu/index.wxss */

page {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  --active: orange; /* 选中菜单背景色 */
  --bgcolor: rgb(185, 239, 247); /* 圆盘背景色 */
}

.container {
  background-image: url('http://xxxx/active_bg.png');
  background-size: cover;
  height: 100vh;
  width: 100vw;
  position: relative;
}

.menu_container {
  width: 400rpx;
  height: 400rpx;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.menu-box {
  width: 100%;
  height: 100%;
  position: relative;
  opacity: 0; /* 默认隐藏 */
  transform: scale(0);
  visibility: hidden;
  transition: all .5s;
}

.menu-box::after {
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  background-color: var(--bgcolor);
  border-radius: 50%;
  box-shadow: 0 0 8px var(--active); /* 添加投影 */
  transform: translate3d(0, 0, 0); /* 解决ios圆角不生效 */
}

.menu-box.active {
  transform: scale(1);
  opacity: 1;
  visibility: visible;
}

.menu-box-item {
  width: 80rpx;
  height: 80rpx;
  position: absolute;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  top: calc(50% - 40rpx);
  left: calc(50% - 40rpx);
  transition: all .5s; /* 添加过渡效果 */
  transform: rotate(calc(var(--deg) * var(--n))) translateX(-140rpx); /* 添加transform偏移 */
}

.menu-box-item .icon {
  width: 80rpx;
  height: 80rpx;
  background-size: cover;
  transition: all .5s; /* 添加过渡效果 */
  transform: rotate(calc(var(--deg) * var(--n)));
}

.menu-box-item.active {
  transform: rotate(calc(var(--deg) * var(--n))) translateX(-220rpx);
}

.menu-box-item.active .icon {
  transform: rotate(calc(var(--deg) * var(--n)));
}

@keyframes scale {
  100% {
    transform: scale(1.9);
  }
}

.menu-box-active {
  position: absolute;
  width: 100rpx;
  height: 100rpx;
  background-color: var(--active);
  box-shadow: 0 0 0 10rpx var(--bgcolor);
  border-radius: 50%;
  pointer-events: none;
  transition: all .5s;
  transform-origin: center;
  top: calc(50% - 50rpx);
  left: calc(50% - 50rpx);
  z-index: 1;
  opacity: 0; /* 默认隐藏 */
  visibility: hidden;
}

.menu-box-item.active ~ .menu-box-active {
  opacity: 1;
  visibility: visible;
  transform: rotate(calc(var(--deg) * var(--n))) translateX(-220rpx);
}

.menu-add-box {
  width: 120rpx;
  height: 120rpx;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  position: absolute;
  left: calc(50% - 60rpx);
  top: calc(50% - 60rpx);
   /* 霸王色 */
  background-color: rgb(255, 255, 255);
  transition: all .5s;
}

.menu-add-box::after {
  content: '你想说的话';
  position: absolute;
  bottom: -38rpx;
  font-size: 32rpx;
  color: #222;
  font-weight: bold;
  transition: all .5s;
  opacity: 1;
}

.menu-add-box .icon {
  width: 56rpx;
  height: 56rpx;
  background-size: cover;
  transform: scale(1.5);
}

.menu-add-box.active::after {
  font-size: 0;
  opacity: 0;
}

.menu-add-box.active .icon {
  transform: rotate(135deg);
}

/* 弹框样式 */
.popup {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  transition: all 0.3s;
  }
  
  .popup.show {
  opacity: 1;
  visibility: visible;
  }
  
  .popup-content {
  background-color: rgba(255, 255, 255, 0.8);
  border-radius: 8px;
  padding: 20px;
  max-width: 90%;
  text-align: center;
  width: 700rpx;
  height: 1000rpx;
  }


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

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

相关文章

异构算力的调度策略解析与实现

随着云计算、大数据和人工智能技术的飞速发展&#xff0c;异构算力调度成为了一个日益重要的课题。异构算力调度是指针对不同类型的计算资源&#xff08;如CPU、GPU、FPGA等&#xff09;进行合理分配与调度&#xff0c;以提高计算资源的利用率、降低功耗并加速任务执行。本文将…

浮点数的二进制表示

浮点数的二进制表示 浮点数在C/C中对应 float 和 double 类型&#xff0c;我们有必要知道浮点数在计算机中实际存储方式。 IEEE754规定&#xff1a; 单精度浮点数字长32位&#xff0c;尾数长度23&#xff0c;指数长度8,指数偏移量127&#xff1b;双精度浮点数字长64位&#xf…

Yarn UI 时间问题,相差8小时

位置 $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-common-2.6.1.jar 查看 jar tf hadoop-yarn-common-2.6.1.jar |grep yarn.dt.plugins.js webapps/static/yarn.dt.plugins.js 解压 jar -xvf hadoop-yarn-common-2.6.1.jar webapps/static/yarn.dt.plugins.js inflated: we…

mybatis-plus中出现Field ‘id‘ doesn‘t have a default value问题解决方法

问题分析&#xff1a; 出现这个原因&#xff0c;主要是因为mybatis-plus自身查询的特性&#xff0c;因为查询都是它自己内部设定好的参数&#xff0c;一般为了简便&#xff0c;都会默认自己底层的数据库对应的主键id字段是自增的&#xff0c;也就是mybatis-plus认为不需要id,每…

【Git】.gitignore全局配置与忽略匹配规则详解

设置全局配置 1&#xff09;在C:/Users/用户名/目录下创建.gitignore文件&#xff0c;在里面添加忽略规则。 如何创建 .gitignore 文件&#xff1f; 新建一个.txt文件&#xff0c;重命名&#xff08;包括后缀.txt&#xff09;为 .gitignore 即可。 2&#xff09;将.gitignore设…

Eagle平替?免费超强的素材管理神器!支持多级标签,满足素材快速收集!

作为设计师&#xff0c;你是不是下载了很多类型的素材资源&#xff0c;然而要每次使用的时候&#xff0c;还要通过文件夹一级一级去翻找&#xff0c;非常麻烦&#xff01;还好我找到了一款好用的素材管家神器—千鹿设计助手&#xff0c;如果你之前有用过Eagle或者BillFish的话&…

华为od机试真题:求字符串所有整数最小和(Python)

2024华为OD机试&#xff08;C卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 1.输入字符串s输出s中包含所有整数的最小和&#xff0c;说明&#xff1a;1字符串s只包含a~z,A~Z,,-&#xff0c; 2.合法的整数包括正整数&#xff0c;一个或者多个0-9组成&…

归并排序 python C C++ 图解 代码 及解析

一&#xff0c;概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分治法(Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff…

大厂linux面试题攻略三之Shell编程

一、Shell编程文本截取类 1.有一个b.txt文本(内容如下)&#xff0c;要求将所有域名截取出来&#xff0c;并统计重复域名出现的次数 http://www.baidu.com/index.html https://www.atguigu. com/index.html http://www.sina.com.cn/1024.html …

二百四十八、Linux——删除/etc/.sudoers文件进程或修改/etc/.sudoers文件内容

一、目的 安装国产化数据库OceanBase的时候&#xff0c;需要创建用户&#xff0c;并在/etc/.sudoers文件中赋予用户root权限 二、删除/etc/.sudoers文件进程 1 报错 W10: Warning: Changing a readonly file E325: ATTENTION Found a swap file by the name "/etc/.su…

二叉树的性质证明

文章目录 二叉树的概念二叉树的性质1. 若规定根结点的层数为1&#xff0c;则一棵非空二叉树的第i层上最多有 2 i − 1 2^{i-1} 2i−1 个结点.2. 若规定根结点的层数为1&#xff0c;则深度为h的二叉树的最大结点数是 2 h − 1 2^h-1 2h−1.3. 对任何一棵二叉树, 如果度为0其叶结…

C++:函数模板与类模板详解

1.函数模板 在构造函数的时候&#xff0c;我们常常会考虑传入的参数的数据类型&#xff0c;比如我们写一个大小比较的函数mycmp(class1 a,class1 b)&#xff0c;则可以写出class1为int,float,double,string等各个种类的mycmp函数&#xff0c;这样会很麻烦&#xff0c;且当我们…

hot100-7-链表1

160相交链表 206反转链表 234回文链表 可以反转后半部分链表或者反转全部链表&#xff0c;然后对比输出 141环形链表 142环形链表2

大模型RAG入门及实践

前言 在大语言模型&#xff08;LLM&#xff09;飞速发展的今天&#xff0c;LLMs 正不断地充实和改进我们周边的各种工具和应用。如果说现在基于 LLM 最火热的应用技术是什么&#xff0c;检索增强生成&#xff08;RAG&#xff0c;Retrieval Augmented Generation&#xff09;技…

【JVM】JVM的组成与执行流程

JVM 由哪些部分组成&#xff0c;运行流程是什么&#xff1f; JVM 是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM的组成 我…

redis集群 高可用

目录 主从复制 主从复制的流程 部署主从复制 步骤 哨兵模式 数据流向 步骤 故障恢复 cluster集群 数据流向 步骤 redis集群的三种模式&#xff1a; 主从复制 奇数台 1主2从 哨兵模式 奇数台 1主2从 cluster 集群 6 台 主从复制 原理&#xff1a;主可以…

(四)延时任务篇——redisson实现延迟任务实战

前言 上一节内容中介绍了如何使用redis的zset结构实现延迟任务的实战内容&#xff0c;从使用角度来说还是略显繁琐&#xff0c;而且定时任务的方式扫描redis获取过去的任务也会存在任务空转的问题。在此基础上&#xff0c;我们可以使用redisson的阻塞队列&#xff0c;完成延迟…

探索 Python 的新世界:funcy 库的神奇之旅

文章目录 探索 Python 的新世界&#xff1a;funcy 库的神奇之旅背景&#xff1a;为何 funcy 如此迷人&#xff1f;简介&#xff1a;funcy 库是什么&#xff1f;安装&#xff1a;如何将 funcy 纳入你的项目&#xff1f;功能&#xff1a;funcy 的五大法宝应用&#xff1a;funcy 在…

图方法与机器学习实战:从理论到应用的全景指南

《动手学图机器学习》并不是一本纯粹介绍图机器学习理论的著作&#xff0c;Alessandro Negro 博士作为科学家和 Reco4 公司的 CEO&#xff0c;长期维护图数据源的推荐系统。他结合机器学习工程和图机器学习方法&#xff0c;通过推荐引擎、欺诈检测和知识图谱等案例&#xff0c;…