清凉一夏小风扇-React版

news/2024/7/15 18:59:15 标签: react.js, javascript, 前端框架

这里写目录标题

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

前言

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

一、效果

在这里插入图片描述

二、代码分享

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

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

动态绑定动画样式

3、代码解析
页面结构:

  • 结构比较简单,主要是一个容器content,圆心circle,圆盘底座base,扇叶列表容器item-list,扇叶item
  • 按钮列表容器btn-list,按钮button
javascript"><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和参数。
javascript">const [speed, setSpeed] = useState(0)
const [shakeValue, setShakeValue] = useState(0)
const onChangeSpeed = (value) => {
  console.log(value)
  let { action, speedchange } = value
  switch (action) {
    case 'open':
      speedchange = speed ? speed : speedchange
      setSpeed(speedchange)
      break;
    case 'close':
      speedchange = 0
      setSpeed(speedchange)
      setShakeValue(speedchange)
      break;
    case 'change':
      speedchange = speed ? speedchange : 0
      setSpeed(speedchange)
      break;
    case 'shake':
      if (speed && shakeValue) {
        setShakeValue(0)
      } else if (speed) {
        setShakeValue(speedchange)
      }
      break;
    default:
      break;
  }
}

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

javascript">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.niftyadmin.cn/n/377051.html

相关文章

SylixOS vutex

vutex 概念 SylixOS 引入了与 Linux futex 类似的用户快速锁 vutex&#xff08;vitual user mutex&#xff09;&#xff08;SylixOS 习惯称为“等待变量锁”&#xff09;&#xff1b;vutex 包括两个操作&#xff1a;pend 和 post&#xff0c;pend 操作用于等待期望值得到满足&…

python基础知识(四):input语句、if语句和pass语句

目录 1. input语句2. 强制转换3. if语句4. pass语句 1. input语句 input语句是程序获取从键盘输入的内容&#xff0c;会把输入的内容自动转换成字符串。 使用方法: 变量名 input(“提示语”) 例如 language input("你最爱什么语言?") print(language)这两行代码…

Docker应用部署之Nginx

部署nginx 要求&#xff1a;在docker容器中部署nginx&#xff0c;并通过外部机器访问nginx 步骤&#xff1a; 1.搜索nginx镜像 docker search nginx 2.拉取nginx镜像 docker pull nginx 3.创建容器 #在root目录下创建nginx目录用于存放nginx项目 mkdir ~/nginx cd ~/ng…

“ 最近 ” ,准备跳槽的可以看看

前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在已经12月了&#xff0c;具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也…

Java学习笔记22——异常

异常 异常异常的概述JVM处理异常的默认方案异常处理Throwable的成员方法编译时异常和运行时异常的区别异常处理throws自定义异常 异常 异常的概述 Throwable是所有异常和错误的超类 error表示严重的问题&#xff0c;合理的程序不应该试图捕获 Exception表示合理的应用想要捕…

阿里巴巴淘天集团后端暑期实习面经

目录 1.面向对象三大特性2.重写和重载3.protected 关键字和 default 关键字的作用范围4.栈帧中有哪些东西&#xff1f;5.堆中有哪些区域&#xff1f;6.new 一个对象存放在哪里&#xff1f;7.CMS 收集器回收阶段8.CMS 收集器回收过程哪些需要暂停线程&#xff1f;9.HashMap JDK …

javaWeb ssh微博系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh微博系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开 发。开发环境为TOMCAT7.0,Myecli…

matlab读取csv文件csvread()

matlab读取csv文件csvread() csvread()有三种使用方法 方式1 M csvread(filename);直接输入文件名&#xff0c;将数据读到矩阵M中&#xff0c;要求csv文件中只能包含数字 方式2 M csvread(filename,row,col);除了文件名&#xff0c;还指定了开始读取位置的行号(row)和列号(…