HTML+CSS+JS实现好看的风车屋

1,619 阅读2分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

先来一睹为快最终的效果吧!如下:

64d9b62cbf854548b87c31d89a3c4639.gif

看到图,我们思路其实就很明确了,仅用css以及一些动画,就可以实现。大致就是先设置一个relative的视窗,然后里面的元素用absolute定位来画。圆形的大月亮,梯形带三角屋顶的风车房,利用transform: rotate(360deg)来旋转的风车骨架,天上随机改变opacity的闪烁的星星,box-shadow来形成灯光效果的门窗,以及translateX划过天空的流星。

是不是很简单,一副很美妙的图画,其实用到的都是我们耳熟能详的css属性。

这里我们略过最简单的月亮和圆形外框,先来说说天上闪烁的星星:

let fragment = document.createDocumentFragment();
      // 创建30颗星星
      for (let i = 0; i < 30; i++) {
        // 生成随机位置
        let child = document.createElement("div");
        child.className = "star star-" + (i + 1);
        child.style = `left:${randomNum(40, 300)}px;top:${randomNum(
          40,
          200
        )}px;`;
        child.style.setProperty("animation-duration", randomNum(2, 5) + "s");
        fragment.appendChild(child);
      }
      document.getElementById("stars").appendChild(fragment);

首先通过js来随机生成了30颗星星的位置,然后通过奇偶数赋予不同的闪烁时间,让它们模拟出天上真正繁星闪烁的样子。

      /* 星星 */
      .star {
        background: white;
        height: 2px;
        width: 2px;
        position: absolute;
        left: 100px;
        top: 20px;
        border-radius: 25%;
        opacity: 0.5;
      }
      @keyframes starOdd {
        10% {
          opacity: 0.3;
        }
 
        90% {
          opacity: 0.7;
        }
      }
      @keyframes starEven {
        10% {
          opacity: 0.1;
        }
 
        90% {
          opacity: 0.8;
        }
      }
      .star:nth-child(odd) {
        animation: starOdd 2.5s ease-in infinite;
      }
      .star:nth-child(even) {
        animation: starEven 2.5s ease-in infinite;
      }

风车的骨架思路其实就像画画一样,长方形的主骨架,然后是一个个间隔开的横梁。只需要画出一个,剩下三个利用rotate旋转90、180、270度就行了:

   .fan-wing {
        width: 89px;
        height: 16px;
        border-bottom: 8px solid #292f4c;
        position: relative;
        left: 0;
        left: 0;
      }
      .fan-1 {
        left: 0;
      }
      .fan-2 {
        transform: rotate(90deg);
        transform-origin: 102px 7px;
      }
      .fan-3 {
        transform: rotate(180deg);
        transform-origin: 90px -4px;
      }
      .fan-4 {
        transform: rotate(270deg);
        transform-origin: 52px -17px;
      }

其他的细节看看代码就行:

中秋快到了,祝大家佳节快乐哦~