前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >纯CSS实现 | yoyo摸鱼(click)

纯CSS实现 | yoyo摸鱼(click)

作者头像
jayjay
发布2022-11-02 16:56:58
4040
发布2022-11-02 16:56:58
举报
文章被收录于专栏:jay_blog

前言

掘金是一个技()术()社区,每天上班开机第一时间就是打开掘金快乐的学()习(),借着代码块的功能推出,今天来用自己的渣渣CSS试着画一下yoyo摸鱼(click)

代码块

https://code.juejin.cn/pen/7086763751239581708

代码实现

1.yoyo

yoyo由肥胖的身体+眼睛+嘴巴+小手手组成

1.1 yoyo身体(包括眼睛和嘴巴)

yoyo的身体的布局就是一个div,通过伪元素::before::after画出两个椭圆的四分之一组成,使用css的border-radius: 100% 0 0 0给一个角100%就能取到四分之一,通过定位两个半圆组在一起,嘴巴和眼睛基本同理,只是使用了transform: rotate来微调角度,使之更生动

html

代码语言:javascript
复制
<div class="yoyo-body">
    <div class="eye-left"></div>
    <div class="eye-right"></div>
    <div class="mouth"></div>
</div>

css

代码语言:javascript
复制
  .yoyo-body::before {
    content: "";
    width: 115px;
    height: 200px;
    border-top: 2px solid black;
    border-left: 2px solid black;
    background: #fff;
    display: block;
    position: absolute;
    top: 100px;
    left: 200px;
    border-radius: 100% 0 0 0;
    background-color: #1E80FF;
  }

  .yoyo-body::after {
    content: "";
    width: 87px;
    height: 200px;
    border-right: 2px solid black;
    border-top: 2px solid black;
    background: #fff;
    display: block;
    position: absolute;
    top: 100px;
    left: 317px;
    border-radius: 0 100% 0 0;
    background-color: #1E80FF;
  }

  .eye-left {
    width: 5px;
    height: 5px;
    /* border-top: 2px solid black; */
    border-right: 2px solid black;
    border-bottom: 2px solid black;
    /* border-left: 2px solid black; */
    border-radius: 30% 0 70% 0;
    transform: rotate(45deg);
    /* border-radius: 50%; */
    position: absolute;
    top: 155px;
    left: 291px;
  }

  .eye-right {
    width: 5px;
    height: 5px;
    /* border-top: 2px solid black; */
    border-right: 2px solid black;
    border-bottom: 2px solid black;
    /* border-left: 2px solid black; */
    border-radius: 30% 0 70% 0;
    transform: rotate(40deg);
    /* border-radius: 50%; */
    position: absolute;
    top: 157px;
    left: 316px;
    z-index: 3;
  }


  .mouth {
    width: 53px;
    height: 12px;
    /* border-top: 2px solid black; */
    /* border-right: 2px solid black; */
    border-bottom: 2px solid black;
    border-left: 2px solid black;
    border-radius: 0 0 20% 80%;
    position: relative;
    top: 157px;
    left: 272px;
    z-index: 3;
  }

  .mouth::after {
    content: "";
    width: 11px;
    height: 9px;
    display: block;
    /* border-top: 2px solid black; */
    border-right: 2px solid black;
    border-bottom: 2px solid black;
    /* border-left: 2px solid black; */
    border-radius: 0 0 20px 0px;
    position: relative;
    top: -4px;
    left: -11px;
    transform: rotate(-20deg);
  }
image.png
image.png
1.2 yoyo的小手手

小手手比较简单,其实就是两个矩形圆角后组成,然后定位到合适的位置 html

代码语言:javascript
复制
<div class="yoyo-body">
    <div class="eye-left"></div>
    <div class="eye-right"></div>
    <div class="mouth"></div>
    <!-- 小手手 -->
    <div class="hand-left"></div>
    <div class="hand-right"></div>
</div>

css

代码语言:javascript
复制
  .hand-left {
    width: 50px;
    height: 50px;
    border-top: 2px solid black;
    border-right: 2px solid black;
    border-bottom: 2px solid black;
    /* border-left: 2px solid black; */
    border-radius: 150px 300px 300px 150px;
    background-color: #1E80FF;
    position: absolute;
    top: 221px;
    left: 234px;
    z-index: 4;
    transition: all 1s;
    animation: momo 2s infinite;
    transform-origin: 100% 95%;
  }

  .hand-right {
    width: 50px;
    height: 50px;
    border-top: 2px solid black;
    /* border-right: 2px solid black; */
    border-bottom: 2px solid black;
    border-left: 2px solid black;
    border-radius: 300px 150px 150px 300px;
    background-color: #1E80FF;
    position: absolute;
    top: 221px;
    left: 327px;
    z-index: 4;
    transition: all 1s;
    animation: momo 2s infinite;
    transform-origin: 100% 95%;
  }

再给小手手加上动画,使之看起来像摸的效果

代码语言:javascript
复制
@keyframes momo {
    0% {
      transform: rotate(0deg);
    }

    50% {
      transform: rotate(-5deg);
    }

    100% {
      transform: rotate(5deg);
    }
  }
image.png
image.png
2. click

click的眼睛是一个椭圆然后中间有个白色背景的div组成,嘴巴则是三个不同大小和背景颜色的圆组成,由于水平有限,画的比较难看,再使用transform: rotate调整角度,click的身体直接用svg生成了,真的不会玩圆角三角形。。。

html

代码语言:javascript
复制
<div class="click-div">
  <div class="click">
    <svg width="250" height="100" viewBox="-50 -50 300 300">
      <polygon class="triangle" stroke-linejoin="round" points="100,0 40,200 200,200" />
    </svg>
  </div>

  <div class="click-eye-left"></div>
  <div class="click-eye-right"></div>
  <div class="click-mouth"></div>
</div>

css

代码语言:javascript
复制
  .click {
    transform: rotate(60deg);
    position: absolute;
    top: 182px;
    left: 181px;
    z-index: 3;
  }

  .click {
    fill: #20DFB0;
    stroke: #20DFB0;
    stroke-width: 80;
  }

  .click-eye-left {
    width: 10px;
    height: 20px;
    border: 2px solid black;
    background-color: black;
    border-radius: 50%;
    transform: rotate(180deg);
    position: absolute;
    top: 198px;
    left: 299px;
  }

  .click-eye-left::before {
    content: "";
    display: block;
    width: 10px;
    height: 15px;
    background-color: white;
    border-radius: 2px;
    /* z-index: 4; */

  }


  .click-eye-right {
    width: 10px;
    height: 20px;
    border: 2px solid black;
    background-color: black;
    border-radius: 50%;
    transform: rotate(180deg);
    position: absolute;
    top: 197px;
    left: 310px;
    z-index: 2;
  }

  .click-eye-right::before {
    content: "";
    display: block;
    width: 10px;
    height: 15px;
    background-color: white;
    border-radius: 2px;
    /* z-index: 4; */

  }

  .click-mouth {
    width: 15px;
    height: 10px;
    border: 2px solid black;
    background-color: #FC85B1;
    border-radius: 50%;
    transform: rotate(-10deg);
    position: absolute;
    top: 215px;
    left: 304px;
    z-index: 3;
  }

  .click-mouth::before {
    content: "";
    display: block;
    width: 5px;
    height: 5px;
    border: 2px solid black;
    background-color: #20DFB0;
    border-radius: 50%;
    transform: rotate(-10deg);
    position: relative;
    top: 1px;
    left: 3px;
    z-index: 4;
  }

  .click-mouth::after {
    content: "";
    display: block;
    width: 5px;
    height: 5px;
    border-top: 2px solid #FC85B1;
    border-bottom: 2px solid black;
    border-left: 2px solid black;
    border-right: 2px solid black;
    background-color: #FC85B1;
    border-radius: 50%;
    transform: rotate(-25deg);
    position: relative;
    top: 0px;
    left: 9px;
    z-index: 4;
  }
image.png
image.png
3.星星

星星的直接很简单,就直接用这个符号代替就行,接着使用动画操作透明度来达到闪烁的效果

css

代码语言:javascript
复制
<div class="star star1">✦</div>
<div class="star star2">✦</div>
<div class="star star3">✦</div>
<div class="star star4">✦</div>

html

代码语言:javascript
复制
  .star {
    font-size: 10px;
    color: #E9CF17;
  }

  .star1 {
    position: absolute;
    top: 119px;
    left: 222px;
    animation: buling 0.5s ease infinite alternate;
  }

  .star2 {
    position: absolute;
    top: 73px;
    left: 278px;
    z-index: 99;
    animation: buling 0.5s ease infinite alternate;
  }

  .star3 {
    position: absolute;
    top: 81px;
    left: 360px;
    z-index: 99;
    animation: buling 0.5s ease infinite alternate;
  }

  .star4 {
    position: absolute;
    top: 129px;
    left: 393px;
    z-index: 99;
    animation: buling 0.5s ease infinite alternate;
  }
  
  @keyframes buling {
    0% {
      opacity: 1;
    }

    100% {
      opacity: 0;
    }
ScreenRecorderProject3_2.gif
ScreenRecorderProject3_2.gif

最后激将他们组合起来,就完成啦

ScreenRecorderProject3_3.gif
ScreenRecorderProject3_3.gif

结语

制作过程是比较繁琐的,用了大量的圆角和旋转,可惜是自己前端技术水平不高,click画的有点难看,平时需要写前端的也是画布局的多,不过,做了这么久后端偶尔搞搞前端感觉还不错。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 代码块
  • 代码实现
    • 1.yoyo
      • 1.1 yoyo身体(包括眼睛和嘴巴)
      • 1.2 yoyo的小手手
    • 2. click
      • 3.星星
      • 结语
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档