CSS画的小老虎 - 虎虎生威 - 卷轴打开动效

2,168 阅读8分钟

PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛

大家好,我是 摸鱼小公举,一个不想摸鱼的公举,期待着有一天能够咸鱼翻身。这篇文章主要内容是一个关于2022年虎年创意动效;画的老虎有些丑大家不要喷我哦!

开篇 (实现逻辑)

这里我们先来说我实现这动效的大概过程和准备工作:

(1)在网上找了一张好看的背景gif图做背景,找到了自己心仪的卡通动漫老虎图片。

(2)然后就按照老虎图片用CSS画出了卡通动漫老虎,这里花了我两天时间画的。

(3)画好了老虎就开始做老虎的animation的动效

(4)后面觉得只有老虎动效太单调了,就在网上找了一个卷轴打开的动效,把老虎放在卷轴上动。

画卡通动漫老虎

首先我来给大家看一下原图

87d58d973c662202142650b62ca0ff4.png

再来对比一下我画的,我不是胖,我是可爱到膨胀。

image.png

在这里我就不解释其中画老虎运用到的知识点了请参考

# CSS+JS实现土味中秋特效 # 用CSS制作中秋之夜星星闪烁动效

画老虎的头

这里头就包括了(耳朵,眼睛,鼻子,牙齿,腮帮子等),这其中有一些是辅助元素是用来遮挡黑边的

HTML代码
         <div class="tager1">
            <div class="head">
              <div class="text">王</div>
              <div class="yuan y-left">
                <div class="inside"></div>
              </div>
              <div class="yuan y-right">
                <div class="inside"></div>
              </div>
              <!-- 耳朵 -->
              <div class="ears e-left"></div>
              <div class="ears e-right"></div>
    
              <!-- 眼睛 -->
              <div class="eyes eye-left">
                <div class="small"></div>
              </div>
              <div class="eyes eye-right">
                <div class="small"></div>
              </div>
              <!-- 鼻子 -->
              <div class="nose">
                <div class="line"></div>
              </div>
              <div class="noseLeft"></div>
              <div class="noseRight"></div>
              <!-- 牙齿 -->
              <div class="tooth"></div>
              <div class="tooth t-right"></div>
              <!-- 腮帮子 -->
              <div class="f-left">
                <span></span>
                <span></span>
              </div>
              <div class="f-left f-right">
                <span></span>
                <span></span>
              </div>
            </div>
           </div>
           
 CSS代码  
 
( 这里我常用的知识点 补充z-index 层级属性最为重要,一般都是使用了定位之后才会起效果)

      .head {
        width: 100px;
        height: 90px;
        border-radius: 78% 78% 59% 56%;
        background-color: rgb(248, 229, 118);
        border: 1px solid #333;
        position: relative;
      }
      .text {
        font-size: 20px;
        color: #000;
        position: absolute;
        text-align: center;
        left: 0;
        right: 0;
        top: 6px;
        z-index: 11;
        animation: head 0.8s ease-in-out infinite;
      }
      .ears {
        width: 30px;
        height: 26px;
        border-radius: 50%;
        background-color: rgb(248, 229, 118);
        border: 1px solid #333;
        position: absolute;
        z-index: -1;
      }
      .e-right {
        transform: rotateZ(45deg);
        right: -6px;
        top: 0px;
      }
      .e-left {
        transform: rotateZ(-45deg);
        left: -6px;
        top: 0px;
      }
      .yuan {
        width: 30px;
        height: 26px;
        border-radius: 50%;
        background-color: rgb(248, 229, 118);
        position: absolute;
      }
      .y-left {
        transform: rotateZ(-45deg);
        margin-top: 6px;
        left: 0;
      }
      .y-right {
        transform: rotateZ(45deg);
        margin-top: 6px;
        right: 0;
      }
      .inside {
        width: 16px;
        height: 10px;
        background-color: rgb(250, 163, 163);
        border: 1px solid #333;
        border-radius: 50% 50% 10% 10%;
        margin-left: 6px;
      }
      .eyes {
        width: 14px;
        height: 14px;
        background-color: #000;
        border-radius: 50%;
        position: absolute;
        top: 40px;
        z-index: 20;
        animation: head 0.8s ease-in-out infinite;
      }
      .eye-left {
        left: 24px;
      }
      .eye-right {
        transform: rotateY(180deg);
        right: 24px;
      }
      .small {
        width: 4px;
        height: 4px;
        border-radius: 50%;
        background-color: #fff;
        margin-left: 3px;
        margin-top: 3px;
      }
      .nose {
        width: 8px;
        height: 8px;
        border-radius: 100% 50% 50%;
        background-color: rgb(250, 163, 163);
        border: 1px solid #333;
        position: relative;
        top: 46px;
        margin: 0 auto;
        left: 0;
        right: 0;
        transform: rotateZ(45deg);
        z-index: 11;
      }
      .line {
        position: absolute;
        width: 2px;
        height: 8px;
        background-color: #000;
        transform: rotateZ(-45deg);
        margin-left: 9px;
        margin-top: 7px;
      }
      .noseLeft,
      .noseRight {
        width: 17px;
        height: 34px;
        background-color: rgb(248, 229, 118);
        position: absolute;
        top: 31px;
        right: 34px;
        border-radius: 50%;
        border: 2px solid rgb(248, 229, 118);
        border-bottom-color: #000;
        z-index: 9;
      }
      .noseLeft {
        left: 32px;
      }
      .tooth {
        width: 4px;
        height: 10px;
        background: #fff;
        border-radius: 100%;
        position: absolute;
        top: 61px;
        left: 40px;
        border: 1px solid #333;
        z-index: 2;
      }
      .t-right {
        left: 52px;
      }
      .f-left span {
        width: 18px;
        height: 8px;
        border-radius: 0 50% 50% 0;
        background-color: #000;
        position: absolute;
        bottom: 28px;
        left: -1px;
        transform: rotateZ(-23deg);
      }
      .f-left span:nth-child(2) {
        width: 14px;
        bottom: 18px;
        left: 2px;
      }
      .f-right {
        transform: rotateY(180deg) translateY(80px);
      }
 
 这里我的代码是没来得及优化的,然后看起来有点多

image.png

画老虎的下半部分

其实这里你们也可以用伪元素来写,这样会比较节约html结构。然后这里最难画的地方就是尾巴,仔细看一下你们会发现尾巴部分那里我没处理好,有更好主意欢迎大家提意见。

HTML代码

         <!-- 肚子 -->
            <div class="belly"></div>
            <!-- 脚 -->
            <div class="foot"></div>
            <div class="foot foot1"></div>
            <!-- 手 -->
            <div class="hands">
              <div class="yuan yuan1"></div>
              <div class="yuan"></div>
            </div>
            <div class="hands">
              <div class="yuan yuan1"></div>
              <div class="yuan"></div>
            </div>
            <!-- 尾巴 -->
            <div class="total">
              <div class="tail">
                <span class="black1"></span>
                <div class="tail-insaide"></div>
              </div>
              <div class="tail tail1">
                <span></span>
                <span class="black"></span>
                <span class="black"></span>
                <div class="tail-insaide"></div>
              </div>
            </div>
            
CSS代码
 .belly {
        width: 50px;
        height: 50px;
        border-radius: 43% 43% 43% 42%;
        border: 1px solid #333;
        background-color: rgb(248, 229, 118);
        position: relative;
        left: 23px;
        top: -9px;
        z-index: -1;
      }
      .foot {
        display: inline-block;
        width: 10px;
        height: 20px;
        border: 1px solid #333;
        background-color: rgb(248, 229, 118);
        border-radius: 50%;
        transform: rotateZ(20deg);
        position: relative;
        left: 28px;
        top: -26px;
        z-index: -2;
      }
      .foot1 {
        left: 40px;
        transform: rotateZ(-20deg);
      }
      .hands {
        display: inline-block;
        width: 30px;
        height: 10px;
        border: 1px solid #333;
        background-color: rgb(248, 229, 118);
        border-radius: 41% 155% 50% 0;
        transform: rotateX(-180deg);
        position: relative;
        top: -67px;
        left: 2px;
        transform: rotateZ(230deg);
        animation: arm 1s ease-in-out infinite;
      }
      .hands .yuan {
        width: 10px;
        height: 10px;
        background-color: rgb(248, 229, 118);
        border-radius: 50%;
        position: absolute;
        left: -6px;
      }
      .hands .yuan1 {
        width: 8px;
        height: 8px;
        bottom: 0;
        background-color: #000;
        left: 10px;
      }
      .tail {
        width: 50px;
        height: 25px;
        border-radius: 24px 21px 6px 1px;
        background-color: rgb(248, 229, 118);
        border: 1px solid #333;
        display: flex;
        justify-content: center;
        align-items: center;
        position: relative;
        transform: rotateX(180deg);
      }
      .tail span {
        width: 10px;
        height: 10px;
        background-color: rgb(248, 229, 118);
        border-radius: 50%;
        position: absolute;
        z-index: 9;
        left: 0px;
        top: 16px;
        z-index: 99;
      }
      .tail .black {
        width: 8px;
        height: 6px;
        background-color: #000;
        left: -1px;
        top: 20px;
      }
      .tail .black1 {
        background-color: #000;
        width: 8px;
        height: 6px;
        left: 19px;
        top: 4px;
        transform: rotateZ(100deg);
      }
      .tail .black:nth-child(2) {
        width: 12px;
        margin-top: 4px;
      }
      .tail .black:nth-child(3) {
        left: 18px !important;
        top: 1px;
        transform: rotateZ(90deg);
      }
      .tail-insaide {
        width: 30px;
        height: 15px;
        border-radius: 15px 15px 0px 0px;
        background-color: #c5bd98;
        border-top: 1px solid #333;
        margin-top: 10px;
      }
      .tail1 {
        transform: rotateX(360deg);
        margin-left: 40px;
        margin-top: -50px;
      }
      .total {
        margin-top: -67px;
        margin-left: 44px;
        position: relative;
        z-index: -2;
        animation: tail 0.8s ease-in-out infinite;
      }

这样生动可爱的小老虎就画出来了

image.png

小老虎的动效

其实就是简单的放大缩小,上下左右晃动的效果;本来想试试做个老虎走路的动效,太难了,我实现不出来。

CSS代码:然后动画剧本应用的CSS在上面两段内容

  /* 尾巴摇摆动画*/
      @keyframes tail {
        0% {
          transform-origin: 20px;
          transform: rotateZ(0deg);
        }

        60% {
          transform-origin: 20px;
          transform: rotateZ(10deg);
        }

        100% {
          transform-origin: 20px;
          transform: rotateZ(0deg);
        }
      }
      /* 手臂摇摆动画*/
      @keyframes arm {
        0% {
          transform-origin: 0 100%;
          transform: rotateZ(220deg);
        }

        60% {
          transform-origin: 0 100%;
          transform: rotateZ(350deg);
        }

        100% {
          transform-origin: 0 100%;
          transform: rotateZ(220deg);
        }
      }
      /* 放大摇摆动画*/
      @keyframes head {
        0% {
          transform: scale(1);
        }

        60% {
          transform: scale(1.2);
        }

        100% {
          transform: scale(1);
        }
      }

这动效看起来是牵强

target.gif

另一只母老虎的产生

HTML代码省略,是复制过来的

CSS代码
.tager2 {
        z-index: 99;
        transform: rotateY(180deg);
        margin-left: 60px;
      }
      .tager2 .head,
      .tager2 .ears,
      .tager2 .yuan,
      .tager2 .yuan1,
      .tager2 .noseLeft,
      .tager2 .noseRight,
      .tager2 .belly,
      .tager2 .tail,
      .tager2 .hands,
      .tager2 .foot,
      .tager2 .tail span,
      .tager2 .hands .yuan {
        background-color: pink;
      }
      .tager2 .hands .yuan1,
      .tager2 .tail .black,
      .tager2 .tail .black1 {
        background-color: #000;
      }
      .tager2 .noseLeft,
      .tager2 .noseRight {
        border: 1px solid pink;
        border-bottom: 2px solid #333;
      }

效果 (此时此刻我想起了一首歌,两只老虎两只老虎跑得快,跑得快,一只没有耳朵,一只没有尾巴,真奇怪...)

target3.gif

实现卷轴打开动效

本来刚开始只有老虎在动,后面觉得太单调,突发奇想就想到了卷轴打开动效;

HTML代码

 <div class="container">
      <!-- 画横幅 -->
      <div class="content">
        <div class="l-pic-index"></div>
        <!--左转轴-->
        <div class="r-pic-index"></div>
        <!--右转轴-->
        <div class="l-bg-index"></div>
        <div class="r-bg-index"></div>
        <div class="main-index">
          <!-- <h1 class="title"><img src="images/bg.jpeg" alt="" /></h1> -->
            <!--这里是放卷轴上展示的内容
          <div class="text1">生</div>
          <div class="text1 text2">威</div>
        </div>
      </div>
    </div>
    
 CSS代码
 
   /* 卷轴打开 */
      .content {
        position: relative;
        margin: 40px 0 0 -21px;
        width: 900px;
        height: 460px;
      }
      .l-pic-index {
        position: absolute;
        left: 400px;
        top: 20px;
        z-index: 2;
        width: 50px;
        height: 460px;
        background: url("images/j1.png") no-repeat right 0;
      }
      .r-pic-index {
        position: absolute;
        right: 400px;
        top: 20px;
        z-index: 2;
        width: 50px;
        height: 460px;
        background: url("images/j4.png") no-repeat left 0;
      }
      .l-bg-index {
        position: absolute;
        top: 21px; /*中间转轴位置*/
        left: 430px;
        z-index: 1;
        width: 25px;
        height: 459px;
        background: url("images/j2.png") right 0 no-repeat;
      }
      .r-bg-index {
        position: absolute;
        top: 20px;
        right: 430px;
        z-index: 1;
        width: 25px;
        height: 459px;
        background: url("images/j3.png") 0 0 no-repeat;
      }
      .main-index {
        display: none;
        /* overflow: hidden; */
        zoom: 1;
        position: absolute;
        z-index: 5;
        width: 700px;
        height: 280px;
        left: 180px;
        top: 130px;
        color: #2e2e2e;
      }
      .main-index img {
        width: 100%;
      }
      .intro-text {
        margin: 10px 0 0 44px;
        line-height: 2;
        text-indent: 3px;
      }
      .text1 {
        display: inline-block;
        font-size: 100px;
        color: #fff;
        font-weight: bold;
        margin-left: 40px;
      }
      
//JS代码

卷轴展开效果:是用了jquery的animate 左滑右滑,淡入淡出的效果。在这里补充一下相关知识

语法:(selector).animate( {styles},speed,easing,callback)

定义和用法:animate() 方法执行 CSS 属性集的自定义动画。
该方法通过 CSS 样式将元素从一个状态改变为另一个状态。CSS属性值是逐渐改变的,这样就可以创建动画效果。
只有数字值可创建动画(比如 "margin:30px")。字符串值无法创建动画(比如 "background-color:red")。
提示:请使用 "+=" 或 "-=" 来创建相对动画,想更深入了解可以前往菜鸟教程或者W3school。
      
       window.onload = function () {
        $(".l-pic-index").animate({ left: "98px", top: "20px" }, 1450);
        $(".r-pic-index").animate({ right: "-23px", top: "20px" }, 1450);
        $(".l-bg-index").animate({ width: "433px", left: "73px" }, 1500);
        $(".r-bg-index").animate(
          { width: "433px", right: "-38px" },
          1500,
          function () {
            $(".main-index").fadeIn(800);
          }
        );
      };

效果

target2.gif

结语 (祝福)

好了文章到这就结束了。欢迎大家( 点赞+评论+关注 ) 有问题可以来互相交流一下; 同时也祝大家身体健康,天天开心,万事如意,家和万事兴,小哥哥们越来越帅,小姐姐们越来越美!