前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >中秋特别文章——css实现海上升明月

中秋特别文章——css实现海上升明月

作者头像
十里青山
发布2022-08-22 09:43:58
2330
发布2022-08-22 09:43:58
举报
文章被收录于专栏:我的前端之路

想了好久都没想到什么好的创意,刚好今天想到了一句诗,海上生明月,天涯共此时。由此引发了一些思路,特意做出来和大家分享一下。

效果预览

zpini-cknw3.gif
zpini-cknw3.gif

构思

我想做的就是海面上缓缓的升起一个月亮,天上有着星星,星星要会闪,月亮是从海面升起来的,就这么简单,那下面就一起来实现吧。 首先,我们来确定整体的画面构图,大概是这样子的。

image.png
image.png

实现

天空和海面好实现,直接两个div,来一个背景渐变即可

代码语言:javascript
复制
  <div class="wrap">
    <div class="sky" id="sky">
    </div>
    <div class="sea">
    </div>
  </div>
代码语言:javascript
复制
    * {
      margin: 0;
      padding: 0;
    }
    .wrap {
      width: 100vw;
      height: 100vh;
      display: flex;
      flex-direction: column;
    }
    .sky {
      height: 50%;
      background-image: linear-gradient(#000ea9, #101984);
    }
    .sea {
      height: 50%;
      background-image: linear-gradient(#0049b7, #00085f);
    }
image.png
image.png

接下来我们就要画月亮也很简单,直接画一个圆就行了,再加一个阴影就行了,升上来的动画再来一个animate就行,由于后面左边要放诗句,为了对称,所以要让月亮跑到右边,至于如何让月亮沿着弧线运动,我没研究,有大神的话可以指导一下,这里为了给海面加点生机,我们来个月亮的倒影。这里月亮从海里升出来的效果,我们使用overflow:hidden来完成。

月亮在海面上的倒影一般不会太清晰,所以我们这里使用opacity降低一下透明度,再使用filter: blur(10px)来一个高斯模糊。

代码语言:javascript
复制
  <div class="wrap">
    <div class="sky" id="sky">
      <div class="sky_moon moon"></div>
    </div>
    <div class="sea">
      <div class="sea_moon moon"></div>
    </div>
  </div>
代码语言:javascript
复制
.sky {
  height: 50%;
  background-image: linear-gradient(#000ea9, #101984);
  position: relative;
  overflow: hidden;
}
.sea {
  height: 50%;
  background-image: linear-gradient(#0049b7, #00085f);
  position: relative;
  overflow: hidden;
}
.moon {
  width: 200px;
  height: 200px;
  background: #f1eacb;
  box-shadow: 0 0 10px 5px rgba(255, 255, 255, .25);
  border-radius: 50%;
  position: absolute;
  left: 70%;
}
.sky_moon {
  top: 10%;
  animation: skymove ease-out 5s;
}
.sea_moon {
  bottom: 10%;
  opacity: .2;
  filter: blur(10px); 
  animation: seamove ease-out 5s;
}
@keyframes skymove {
  0% { top: 112%; left: 50% }
  100% { top: 10%; left: 70% }
}
@keyframes seamove {
  0% { bottom: 112%; left: 50% }
  100% { bottom: 10%; left: 70% }
}
moon1.gif
moon1.gif

这个完成之后,其实主要的功能已经实现了,但是画面还是太单调,我们可以给夜空加一些星星 添加星星的时候,我们给了一个随机的位置,之后又用animation动画给来了个一闪一闪的效果,但如果一起添加的话,所有的星星就会一起闪,效果不好,所以我们添加星星时候给了个定时器,随机给个1秒以内的延迟,这样闪烁就有间隔了,也更符合常理。

代码语言:javascript
复制
.star {
  position: absolute;
  width: 3px;
  height: 3px;
  background: #f1eacb;
  animation: star infinite 2s;
}
@keyframes star {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}
代码语言:javascript
复制
  const sky = document.getElementById('sky')
  function addStar (length) {
    for (let index = 0; index < length; index++) {
      setTimeout(function () {
        let star = document.createElement('div')
        star.className = 'star'
        let width = document.body.clientWidth
        let height = document.body.clientHeight / 2
        let left = Math.random() * width + 'px'
        let top = Math.random() * height + 'px'
        star.style.top = top
        star.style.left = left
        sky.append(star)
      }, Math.random() * 1000)
      
    }
  }
  addStar(10)
moon2.gif
moon2.gif

最后再加上我们的祝福语就大功告成了,这里我们设计的是在月亮动画结束后祝福语再出来,所以给动画延时时间加了5秒,由于gif录制时长问题,本来摄像的文字一个一个出来就没有做,直接整体出来。

代码语言:javascript
复制
  <div class="sky" id="sky">
    <div class="sky_moon moon"></div>
    <div class="text-wrap">
      海上升明月,<br>
      天涯共此时,<br>
      祝掘金所有小伙伴中秋快乐
    </div>
  </div>
代码语言:javascript
复制
    .text-wrap {
      margin: 10% 0 0 20%;
      color: #f1eacb;
      letter-spacing: 5px;
      font-size: 32px;
      opacity: 0;
      animation: text 2s 5s forwards;
    }
    @keyframes text {
      0% { opacity: 0; }
      100% { opacity: 1; }
    }

OK。到这里就全部完成啦

zpini-cknw3.gif
zpini-cknw3.gif
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 构思
  • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档