29 旋转工具箱

效果演示

实现了一个菜单按钮的动画效果,当鼠标悬停在菜单按钮上时,菜单按钮会旋转315度,菜单按钮旋转的同时,菜单按钮旋转的8个小圆圈也会依次旋转360度,并且每个小圆圈的旋转方向和菜单按钮的旋转方向相反,当鼠标悬停在某个小圆圈上时,该小圆圈的旋转方向会变为顺时针旋转360度。整个效果看起来像是一只小鸟在飞翔,菜单按钮像是它的翅膀,菜单按钮旋转的同时,小圆圈也在飞翔。此外,这段代码还定义了一些自定义的图标,并使用了阿里巴巴的图标库。

Code

html 复制代码
<div class="menu">
    <div class="btn"><i class="iconfont icon-add"></i></div>
    <span style="--i: 0;"><i class="iconfont icon-home"></i></span>
    <span style="--i: 1;"><i class="iconfont icon-more"></i></span>
    <span style="--i: 2;"><i class="iconfont icon-gift"></i></span>
    <span style="--i: 3;"><i class="iconfont icon-setting"></i></span>
    <span style="--i: 4;"><i class="iconfont icon-message"></i></span>
    <span style="--i: 5;"><i class="iconfont icon-cart"></i></span>
    <span style="--i: 6;"><i class="iconfont icon-money"></i></span>
    <span style="--i: 7;"><i class="iconfont icon-star"></i></span>
</div>
css 复制代码
* {
    margin: 0;
    padding: 0;
    list-style: none;
}

body {
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #e8e8e8;
}

.menu {
    position: relative;
    width: 200px;
    height: 200px;
    display: flex;
    justify-content: center;
    align-items: center;
}

.btn {
    position: absolute;
    width: 60px;
    height: 60px;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #fff;
    border-radius: 50%;
    z-index: 1000;
    box-shadow: 0 3px 4px rgba(0, 0, 0, 0.15);
    cursor: pointer;
    transition: all 1.25s;
}

.btn i {
    font-size: 32px;
}

.menu span {
    position: absolute;
    left: 0;
    transform-origin: 100px;
    transition: .5s;
    transition-delay: calc(.1s * var(--i));
    transform: rotate(0deg) translateX(80px);
    width: 40px;
    height: 40px;
    background-color: #fff;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 50%;
    cursor: pointer;
    box-shadow: 0 3px 4px rgba(0, 0, 0, 0.15);
}

.menu:hover .btn {
    transform: rotate(315deg);
}

.menu:hover span {
    transform: rotate(calc(360deg / 8 * var(--i)));
}

.menu span i {
    transform: rotate(calc(360deg / -8 * var(--i)));
}

.menu span:hover i {
    color: #f51760;
}

@font-face {
    font-family: "iconfont";
    /* Project id 4090357 */
    src: url('//at.alicdn.com/t/c/font_4090357_z2qpnic06um.woff2?t=1685189584312') format('woff2'),
        url('//at.alicdn.com/t/c/font_4090357_z2qpnic06um.woff?t=1685189584312') format('woff'),
        url('//at.alicdn.com/t/c/font_4090357_z2qpnic06um.ttf?t=1685189584312') format('truetype');
}

.iconfont {
    font-family: "iconfont" !important;
    font-size: 16px;
    font-style: normal;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

.icon-add:before {
    content: "\e60c";
}

.icon-home:before {
    content: "\e604";
}

.icon-more:before {
    content: "\e606";
}

.icon-gift:before {
    content: "\e611";
}

.icon-setting:before {
    content: "\e612";
}

.icon-message:before {
    content: "\e613";
}

.icon-star:before {
    content: "\e618";
}

.icon-cart:before {
    content: "\e61d";
}

.icon-money:before {
    content: "\e61e";
}

实现思路拆分

css 复制代码
* {
  margin: 0;
  padding: 0;
  list-style: none;
}

这段代码是设置全局样式,将所有元素的外边距、内边距和列表样式都设置为0,并将列表样式设置为none。

css 复制代码
body {
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #e8e8e8;
}

这段代码是设置页面的基本样式,将页面的高度设置为100vh,并将页面的内容居中对齐。同时,将页面的背景颜色设置为#e8e8e8。

css 复制代码
.menu {
  position: relative;
  width: 200px;
  height: 200px;
  display: flex;
  justify-content: center;
  align-items: center;
}

这段代码是设置菜单按钮的样式,将菜单按钮的位置设置为相对定位,宽度和高度都设置为200px,并将菜单按钮的内容居中对齐。

css 复制代码
.btn {
  position: absolute;
  width: 60px;
  height: 60px;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #fff;
  border-radius: 50%;
  z-index: 1000;
  box-shadow: 0 3px 4px rgba(0, 0, 0, 0.15);
  cursor: pointer;
  transition: all 1.25s;
}

这段代码是设置菜单按钮的样式,将菜单按钮的位置设置为绝对定位,宽度和高度都设置为60px,并将菜单按钮的内容居中对齐。同时,将菜单按钮的背景颜色设置为白色,边框半径设置为50%,并添加了一个box-shadow属性来设置阴影效果。当鼠标悬停在菜单按钮上时,菜单按钮的样式会发生变化。

css 复制代码
.btn i {
  font-size: 32px;
}

这段代码是设置菜单按钮的图标样式,将菜单按钮的字体大小设置为32px。

css 复制代码
.menu span {
  position: absolute;
  left: 0;
  transform-origin: 100px;
  transition:.5s;
  transition-delay: calc(.1s * var(--i));
  transform: rotate(0deg) translateX(80px);
  width: 40px;
  height: 40px;
  background-color: #fff;
  display: flex;
  justify-content: center;
  align-items: center;
  border-radius: 50%;
  cursor: pointer;
  box-shadow: 0 3px 4px rgba(0, 0, 0, 0.15);
}

这段代码是设置菜单按钮旋转的小圆圈的样式,将小圆圈的位置设置为绝对定位,左边距设置为0,将小圆圈的旋转中心设置为100px,并添加了一个transition属性来设置过渡效果。当鼠标悬停在菜单按钮上时,小圆圈的位置会发生变化。

css 复制代码
.menu:hover.btn {
  transform: rotate(315deg);
}

这段代码是设置鼠标悬停在菜单按钮上时的样式,将菜单按钮旋转315度。

css 复制代码
.menu:hover span {
  transform: rotate(calc(360deg / 8 * var(--i)));
}

这段代码是设置鼠标悬停在菜单按钮上时,小圆圈的旋转效果。

css 复制代码
.menu span i {
  transform: rotate(calc(360deg / -8 * var(--i)));
}

这段代码是设置小圆圈的旋转效果,将小圆圈的旋转方向设置为与菜单按钮的旋转方向相反。

css 复制代码
.menu span:hover i {
  color: #f51760;
}

这段代码是设置鼠标悬停在小圆圈上时的样式,将小圆圈的颜色设置为#f51760。

css 复制代码
@font-face {
  font-family: "iconfont";
  /* Project id 4090357 */
  src: url('//at.alicdn.com/t/c/font_4090357_z2qpnic06um.woff2?t=1685189584312') format('woff2'),
    url('//at.alicdn.com/t/c/font_4090357_z2qpnic06um.woff?t=1685189584312') format('woff'),
    url('//at.alicdn.com/t/c/font_4090357_z2qpnic06um.ttf?t=1685189584312') format('truetype');
}

这段代码是定义一个字体,将字体的名称设置为"iconfont",字体的来源设置为三个不同的格式,分别为woff2、woff和ttf。

css 复制代码
.iconfont {
  font-family: "iconfont"!important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

这段代码是设置字体的样式,将字体的名称设置为"iconfont",字体的大小设置为16px,字体的样式设置为普通字体,并添加了一些属性来优化字体的显示效果。

css 复制代码
.icon-add:before {
  content: "\e60c";
}

这段代码是定义一个图标,将图标的名称设置为"icon-add",将图标的Unicode编码设置为"\e60c",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-home:before {
  content: "\e604";
}

这段代码是定义一个图标,将图标的名称设置为"icon-home",将图标的Unicode编码设置为"\e604",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-more:before {
  content: "\e606";
}

这段代码是定义一个图标,将图标的名称设置为"icon-more",将图标的Unicode编码设置为"\e606",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-gift:before {
  content: "\e611";
}

这段代码是定义一个图标,将图标的名称设置为"icon-gift",将图标的Unicode编码设置为"\e611",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-setting:before {
  content: "\e612";
}

这段代码是定义一个图标,将图标的名称设置为"icon-setting",将图标的Unicode编码设置为"\e612",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-message:before {
  content: "\e613";
}

这段代码是定义一个图标,将图标的名称设置为"icon-message",将图标的Unicode编码设置为"\e613",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-star:before {
  content: "\e618";
}

这段代码是定义一个图标,将图标的名称设置为"icon-star",将图标的Unicode编码设置为"\e618",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-cart:before {
    content: "\e61d";
}

这段代码是定义一个图标,将图标的名称设置为"icon-cart",将图标的Unicode编码设置为"\e61d",这个编码是阿里巴巴的图标库中的一个图标的编码。

css 复制代码
.icon-money:before {
    content: "\e61e";
}

这段代码是定义一个图标,将图标的名称设置为"icon-money",将图标的Unicode编码设置为"\e61e",这个编码是阿里巴巴的图标库中的一个图标的编码。

相关推荐
WeiShuai9 分钟前
vue-cli3使用DllPlugin优化webpack打包性能
前端·javascript
ice___Cpu15 分钟前
Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
linux·运维·前端
JYbill18 分钟前
nestjs使用ESM模块化
前端
加油吧x青年36 分钟前
Web端开启直播技术方案分享
前端·webrtc·直播
吕彬-前端1 小时前
使用vite+react+ts+Ant Design开发后台管理项目(二)
前端·react.js·前端框架
小白小白从不日白1 小时前
react hooks--useCallback
前端·react.js·前端框架
恩婧2 小时前
React项目中使用发布订阅模式
前端·react.js·前端框架·发布订阅模式
mez_Blog2 小时前
个人小结(2.0)
前端·javascript·vue.js·学习·typescript
珊珊而川2 小时前
【浏览器面试真题】sessionStorage和localStorage
前端·javascript·面试
森叶2 小时前
Electron 安装包 asar 解压定位问题实战
前端·javascript·electron