清凉一夏小风扇-React版

news/2024/10/18 1:38:15/

这里写目录标题

    • 前言
  • 一、效果
  • 二、代码分享
  • 三、总结

前言

本片文章主要是做一个小练习,通过react来制作一个风扇练习css动画。
vue3实现部分看这里–>

一、效果

在这里插入图片描述

二、代码分享

1、主体框架
“react”: “^18.2.0”
“sass”: “^1.62.1”

2、主要技术点
使用事件代理实现绑定多个方法。
使用animation实现动画效果

动态绑定动画样式

3、代码解析
页面结构:

  • 结构比较简单,主要是一个容器content,圆心circle,圆盘底座base,扇叶列表容器item-list,扇叶item
  • 按钮列表容器btn-list,按钮button
<div className="content"><div className="circle"></div><div className="base"  style={{ animation: `shakeHead linear ${shakeValue}s infinite alternate` }}><div className="item-list">{itemList.map((item) => {return (<div key={item.id} className="item" style={{ animation: item.animation }}></div>)})}</div></div><div className="btn-list" onClick={(event) => onChangeSpeed(event.target.dataset)}>{btnList.map((item) => {return (<button key={item.id} data-speedchange={item.dataSpeedchange} data-action={item.dataAction}>{item.btnName}</button>)})}</div>
</div>

代理方法处理:

  • 我们知道事件代理的实现技巧,也知道他的好处,但这里使用事件代理只是为了学习,毕竟现在的电脑配置,这些按钮绑定方法所使用的小号可以忽略不计。
  • 事件代理通过利用事件冒泡机制,将事件处理程序委托给父元素处理,从而避免了在子元素上单独绑定事件处理程序的麻烦
  • 通过元素所绑定的dataset来获取不同的action和参数。
const [speed, setSpeed] = useState(0)
const [shakeValue, setShakeValue] = useState(0)
const onChangeSpeed = (value) => {console.log(value)let { action, speedchange } = valueswitch (action) {case 'open':speedchange = speed ? speed : speedchangesetSpeed(speedchange)break;case 'close':speedchange = 0setSpeed(speedchange)setShakeValue(speedchange)break;case 'change':speedchange = speed ? speedchange : 0setSpeed(speedchange)break;case 'shake':if (speed && shakeValue) {setShakeValue(0)} else if (speed) {setShakeValue(speedchange)}break;default:break;}
}

数据配置:
这里主要是为了配置dataset用的参数配置

const btnList = [{id: 1,dataSpeedchange: '3',dataAction: 'change',btnName: '1'},{id: 2,dataSpeedchange: '2',dataAction: 'change',btnName: '2'},{id: 3,dataSpeedchange: '1',dataAction: 'change',btnName: '3'},{id: 4,dataSpeedchange: '3',dataAction: 'open',btnName: 'open'},{id: 5,dataSpeedchange: '0',dataAction: 'close',btnName: 'close'},{id: 6,dataSpeedchange: '7',dataAction: 'shake',btnName: 'shake'},
]
const itemList = [{id: 1,animation: `identifier reverse linear ${speed}s infinite`},{id: 2,animation: `identifier reverse linear ${speed}s infinite`},{id: 3,animation: `identifier reverse linear ${speed}s infinite`},{id: 4,animation: `identifier reverse linear ${speed}s infinite`}
]

动画效果实现:
1、扇叶转动比较简单直接用transform: rotateZ(-360deg);这个就可以实现。
2、相对复杂一点的是摇头的效果,3d动画效果,所以需要用到3d属性rotate3d
3、主要keyframes动画

@keyframes identifier {to {transform: rotateZ(-360deg);}
}@keyframes shakeHead {0% {transform: rotate3d(0, 1, 0, 45deg);}50% {transform: rotate3d(0, -1, 0, 45deg);}100% {transform: rotate3d(0, 1, 0, 45deg);}
}

这里说说摇头的动画
0,1,0表示y轴的正方向旋转
0,-1,0表示y轴的负方向旋转
最后的0,1,0恢复。

三、总结

总体来说,实现还是比较简单,实现的关键还是动画部分。


http://www.ppmy.cn/news/107285.html

相关文章

< 免费体验ChatGPT:免费且好用,不用使用 “ 魔法 ”,一款功能强大且轻便的插件!webTab! >

免费且好用&#xff0c;不用使用 “ 魔法 ”&#xff0c;一款功能强大且轻便的插件&#xff01;webTab&#xff01; &#x1f449; 前言&#x1f449; 功能演示图&#x1f449; 使用经验分享&#x1f449; 如何安装webTab插件呢&#xff1f;往期内容 &#x1f4a8; tips&#x…

Android bitmap保姆级教学

1. 认识Bitmap Bitmap是一个final类&#xff0c;因此不能被继承。Bitmap只有一个构造方法&#xff0c;且该构造方法是没有任何访问权限修饰符修饰&#xff0c;也就是说该构造方法是friendly&#xff0c;但是谷歌称Bitmap的构造方法是private&#xff08;私有的&#xff09;&am…

通过 Wacom 的 Project Mercury 提高远程办公效率

过去几年中&#xff0c;我们的工作方式发生了翻天覆地的变化。疫情加快了对远程办公和协作的采纳&#xff0c;导致人们更加依赖技术来联系团队和提高工作效率。 但是&#xff0c;那些依靠专门硬件和软件来完成工作的创作者呢&#xff1f;艺术家、设计师和开发人员需要使用专门…

基于matlab使用差分波束成形技术形成线性差分麦克风阵列

一、前言 本示例展示了差分波束成形的基本概念&#xff0c;以及如何使用该技术形成线性差分麦克风阵列。 二、加法与差分麦克风阵列 麦克风阵列已部署在许多音频应用中。根据布局的不同&#xff0c;麦克风阵列可分为两大类&#xff1a;加法麦克风阵列和差分麦克风阵列。附加麦克…

ESXI7.0安装Windows Server 2008 R2

1&#xff1a;使用VC正常建立虚拟机&#xff0c;前四项根据自己的时间情况选择&#xff0c;兼容性用默认的ESXI7.0U2及更高版本。 2&#xff1a;客户机操作系统选择Windows,客户机操作系统版本选择我们想安装的Windows Server 2008 R2(64位&#xff09; 3&#xff1a;自定义硬件…

【Django】makemigrations 时出现 sqlite3.OperationalError: no such column: XXX

models文件修改后执行makemigrations报错&#xff1a; sqlite3.OperationalError: no such column: XXX但是数据库没问题&#xff0c;migrations文件也没问题 查看一下views等代码中有没有直接调model类的地方&#xff0c;如果有的话给注掉就好了 问题的原因是在初始化时候也…

STM32单片机语音识别家庭灯光控制系统

实践制作DIY- GC0132-语音识别家庭灯光控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别家庭灯光控制系统 二、功能介绍&#xff1a; STM32F103C系列最小系统板语音识别模块18650锂电池太阳能充电板LCD1602显示器4个LED灯板对应卧室、厨房、客厅、厕所…

Python编程语言简介

Python 是荷兰人 Guido van Rossum &#xff08;吉多范罗苏姆&#xff0c;中国程序员称其为“龟叔”&#xff09;在 1990 年初开发的一种解释型编程语言。 Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载&#xff0c;Python 语言是在圣诞节期间为了打发无聊的时间…