天气炎热,搞个电风扇吹吹风

我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛

现在,一打开天气,马上引入眼帘的就是高温预警,随着气温越来越高,相信很多小伙伴已经没有心思工作了,这时候作为前端的我们,就不能自己想想办法吗,这不得自己搞个风扇降将温,虽然不能物理降温,但是,看着还是能够感觉到一丝丝凉意思的,话不多说,说干就干。

先看一下我们的原型图:

ca1349540923dd547925879b52b468d69d824830.jpeg 零件看着也不多,拆过电风扇的小伙伴应该知道,核心就是一个扇叶、控制开关、风扇罩,其余的都是些装饰品。 首先,我们来实现我们的风扇罩和扇叶,这个功能比较简单好实现,无非就是CSS3中的一些特性,例如圆角呀、旋转呀等等特性。 那接下来我们就来实现一下我们的扇叶以及罩子:

<!-- 罩子 -->
<div class="top-part">
  <!-- 风扇罩上的装饰线 -->
  <div class="line-box">
    <div class="line"></div>
    <div class="line"></div>
    <div class="line"></div>
    <div class="line"></div>
    <div class="line"></div>
    <div class="line"></div>
    <div class="mid-dot"></div>
  </div>
  <!-- 扇叶 -->
  <div class="left-box" id="leaf-id">
    <div class="leaf"></div>
    <div class="leaf"></div>
    <div class="leaf"></div>
  </div>
</div>
复制代码

好了现在结构已经很明确的,接下来就是使用CSS来风扇罩和扇叶的显示效果了:

.top-part {
  width: 220px;
  height: 220px;
  box-sizing: border-box;
  position: relative;
}
.top-part .left-box {
  width: 220px;
  height: 220px;
  box-sizing: border-box;
  border-radius: 50%;
  border: 8px solid #333;
}
.top-part .left-box .leaf {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 50px;
  height: 100px;
  margin-left: -25px;
  border-radius: 50%;
  background-color: rgb(106, 106, 235);
  margin-top: -100px;
}
.top-part .left-box .leaf:nth-child(2) {
  transform: rotate(120deg);
  transform-origin: 50% 100%;
}
.top-part .left-box .leaf:nth-child(3) {
  transform: rotate(240deg);
  transform-origin: 50% 100%;
}
.line-box .line {
  position: absolute;
  top: 50%;
  left: 0px;
  width: 212px;
  height: 2px;
  background-color: #333;
  z-index: 10;
}
.line-box .line:nth-child(2) {
  transform: rotate(30deg);
}
.line-box .line:nth-child(3) {
  transform: rotate(60deg);
}
.line-box .line:nth-child(4) {
  transform: rotate(90deg);
}
.line-box .line:nth-child(5) {
  transform: rotate(120deg);
}
.line-box .line:nth-child(6) {
  transform: rotate(150deg);
}
.line-box .mid-dot {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 50px;
  height: 50px;
  margin-left: -25px;
  margin-top: -25px;
  background-color: #333;
  z-index: 11;
  border-radius: 50%;
}
复制代码

现在我们的风扇上半部分已经完成了,效果如下:

image.png

是不是很像一个车轮

e5921124605422755ae746fb5b716c5.jpg 接下俩我们来实现风扇的控制开关那一部分,先看一下DOM结构:

<div class="bom-part">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item"></div>
</div>
复制代码

其中有三个按钮,分别对应不同的挡位,后期我们需要为其绑定事件,让风扇转起来。 接下里使用css对样式做出调整:

.bom-part {
  width: 50px;
  height: 200px;
  background-color: #333;
  position: absolute;
  top: 215px;
  left: 50%;
  margin-left: -25px;
}
.bom-part .item {
  color: white;
  width: 22px;
  height: 22px;
  background-color: rgb(106, 106, 235);
  border-radius: 50%;
  font-size: 13px;
  display: flex;
  justify-content: center;
  align-items: center;
  margin: 0px auto;
  margin-top: 15px;
  cursor: pointer;
}
复制代码

现在整个风扇的结构以及搭建好了,接下来使用动画让风扇转起来、

.leaf-ani1 {
  animation: ani 1s infinite linear;
}
.leaf-ani2 {
  animation: ani 0.8s infinite linear;
}
.leaf-ani3 {
  animation: ani 0.5s infinite linear;
}
@keyframes ani {
  0% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}
复制代码

同时,我们还需为其对应的按钮绑定上对应的事件:

const btn1 = document.getElementsByClassName('item')[0]
const btn2 = document.getElementsByClassName('item')[1]
const btn3 = document.getElementsByClassName('item')[2]
const btn4 = document.getElementsByClassName('item')[3]
btn1.addEventListener('click', handleOpen.bind(this, 1))
btn2.addEventListener('click', handleOpen.bind(this, 2))
btn3.addEventListener('click', handleOpen.bind(this, 3))
btn4.addEventListener('click', handleOpen.bind(this, null))

function handleOpen(type) {
  let dom = document.getElementById("leaf-id");
  if (type) {
    dom.setAttribute("class", "left-box leaf-ani" + type)
  } else {
    dom.setAttribute("class", "left-box");
  }
}
复制代码

至此,一个简易版的电风扇就完成了。

猜你喜欢

转载自juejin.im/post/7109812544310607909
今日推荐