👏前几天在某短视频平台刷到一个类似的效果,觉得蛮好玩的,将它应用到你的小程序吧~
🍟文末分享源代码。记得点赞+关注+收藏!

可参考文章:微信小程序引入外部icon(阿里巴巴矢量图标)
注:生成彩色的图标,需在项目设置中勾选彩色哦~

1️⃣将菜单基于圆环布局,假设此圆只有一个菜单,让它定位到下图黄色菜单所示位置
注意:transform执行顺序从最外面字段开始~


2️⃣ rotate角度的获取:一个圆为360deg,将其等分,2个菜单偏移角度为180deg,4个菜单偏移角度90deg,以此类推可以得到:
rotate角度为: 360deog/菜单的个数

3️⃣rotate旋转带动子元素图标的转动,将子元素设置反方向的转动

transition 属性设置元素当过渡效果。注:始终指定transition-duration属性,否则持续时间为0,transition不会有任何效果。
| 函数 | 描述 |
|---|---|
| translateX(n) | 定义 2D 转换,沿着 X 轴移动元素。 |
| scale(x,y) | 定义 2D 缩放转换,改变元素的宽度和高度。 |
1️⃣:定义菜单显示与否字段show_menu(默认false),当前所选菜单索引currIndex(默认’ ')
2️⃣:画一个盒子包括以下内容,默认设置属性为:
opacity: 0;
transform: scale(0);
visibility: hidden;
transition: all 0.5s;

3️⃣:画一个盒子元素,里面放一个可爱的图标,盒子设置伪元素 “点我吧”,当show_menu为true,为该盒子添加激活样式,即伪元素opacity设置为0

4️⃣:当show_menu为true,设置圆形菜单scale(1);opacity:1; visibility: visible;计算菜单个数,设置rotate值,并调整合适的translateX偏移


--n:{{index}};//index为菜单当前索引
--deg:{{360/ menu.length}}deg;//menu为菜单列表
transform: rotate(calc(var(--deg) * var(--n))) translateX(-140rpx);
5️⃣:设置选中菜单样式

<view class="menu-box-active" style="--n:{{currIndex}};--deg:{{360/ menu.length}}deg"</view>
transform: rotate(calc(var(--deg) * var(--n))) translateX(-200rpx);
opacity: 1;
visibility: visible;
<view style="--n:{{index}};--deg:{{360/ menu.length}}deg" class="menu-box-item {{currIndex===index && 'active'}}" catchtap="clickActive" data-index="{{index}}">
<icon class="iconfont icon {{item.icon}}" style="--deg:{{-360/ menu.length}}deg"></icon>
</view>
.menu-box-item.active {
transform: rotate(calc(var(--deg) * var(--n))) translateX(-200rpx);
}
.menu-box-item.active icon {
animation: scale 1s ease-in-out;
}
@keyframes scale {
100% {
transform: scale(1.9);
}
}
<view class="container">
<view class="menu-box {{show_menu && 'active'}}">
<block wx:for="{{menu}}" wx:key="menu">
<view style="--n:{{index}};--deg:{{360/ menu.length}}deg" class="menu-box-item {{currIndex===index && 'active'}}" catchtap="clickActive" data-index="{{index}}">
<icon class="iconfont icon {{item.icon}}" style="--deg:{{-360/ menu.length}}deg"></icon>
</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">
<icon class="iconfont icon {{menu_add}}"></icon>
</view>
</view>
@import "../utils/icon-font.wxss";
page {
--bg: pink;
background: var(--bg);
height: 100%;
display: flex;
align-items: center;
justify-content: center;
--active: orange;
--bgcolor: rgb(190, 127, 67);
}
/* 圆形菜单 */
.container {
width: 400rpx;
height: 400rpx;
position: relative;
}
.menu-box {
width: 400rpx;
height: 400rpx;
position: relative;
opacity: 0;
transform: scale(0);
visibility: hidden;
transition: all 0.5s;
}
/*filter(滤镜)修饰父元素背景,影响子元素问题解决 */
.menu-box::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: var(--bgcolor);
border-radius: 50%;
filter: drop-shadow(0px 0px 8px var(--active));
-webkit-filter: drop-shadow(0px 0px 8px var(--active));
}
.menu-box.active {
transform: scale(1);
opacity: 1;
visibility: visible;
}
.icon {
font-size: 56rpx;
transition: all 0.5s;
}
/* 点我吧 */
.menu-add-box {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.5s;
position: absolute;
top: calc(50% - 60rpx);
left: calc(50% - 60rpx);
background: var(--bg);
}
.menu-add-box::after {
content: '^点我吧^';
position: absolute;
bottom: -20rpx;
font-size: 22rpx;
color: #222;
font-weight: bold;
font-style: italic;
transition: all .5s;
opacity: 1;
}
.menu-add-box.active::after {
font-size: 0rpx;
opacity: 0;
}
.menu-add-box icon {
transform: scale(1.5);
}
.menu-add-box.active icon {
transform: rotate(135deg);
}
/* 每一项菜单 */
.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 0.5s;
transform: rotate(calc(var(--deg) * var(--n))) translateX(-140rpx);
}
.menu-box-item icon {
transform: rotate(calc(var(--deg) * var(--n)));
transition: all 0.5s;
}
.menu-box-item.active {
transform: rotate(calc(var(--deg) * var(--n))) translateX(-200rpx);
}
.menu-box-item.active icon {
animation: scale 1s ease-in-out;
}
@keyframes scale {
100% {
transform: scale(1.9);
}
}
/* 选中的背景框 */
.menu-box-active {
position: absolute;
width: 100rpx;
height: 100rpx;
background: var(--active);
box-shadow: 0 0 0 10rpx var(--bg);
border-radius: 50%;
pointer-events: none;
transition: all 0.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 {
transform: rotate(calc(var(--deg) * var(--n))) translateX(-200rpx);
opacity: 1;
visibility: visible;
}
Page({
data: {
menu_add: "icon-susumakalong",
menu: [
{
icon: "icon-susushutiao",
name: "薯条",
},
{
icon: "icon-susutiantong",
name: "甜筒",
},
{
icon: "icon-susutongluoshao",
name: "铜锣烧",
},
{
icon: "icon-susuxiaoxiongruantang-46",
name: "小熊软糖",
},
{
icon: "icon-susushiwutubiao-49",
name: "提拉米苏",
},
{
icon: "icon-susunailao",
name: "奶酪",
},
{
icon: "icon-susuhanbao",
name: "汉堡",
},
{
icon: "icon-susupaofu-53",
name: "泡芙",
},
],
show_menu: false,
currIndex: "",
},
showMenu() {
let { show_menu } = this.data;
this.setData({
show_menu: !show_menu,
currIndex: "",
});
},
clickActive(e) {
let { index } = e.currentTarget.dataset;
if (this.data.currIndex === index || index === undefined) return false;
this.setData({
currIndex: index,
});
},
});
1️⃣:微信小程序引入外部icon(阿里巴巴矢量图标)
2️⃣:CSS3 transition 属性
3️⃣:CSS3 2D 转换
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg