下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

用纯CSS3绘制可爱大白面部

作者:课课家教育     来源: http://www.kokojia.com点击数:1040发布时间: 2016-10-21 09:36:42

标签: CSS3图形绘制实例教程

Web开发

      电影《超能陆战队》中可爱的大白形象可谓红极一时,红到在技术圈都引起广泛的关注。程序员们都想着用自己熟悉的编程语言把这只大白给画出来,这当中自然也包括css3在内了。

  二话不说,我们先来看看CSS3版本的效果图,想想CSS3诞生之前,画出这种巧夺天工的人物,web程序员们真是想都不敢想。

用纯CSS3绘制可爱大白面部_CSS3_图形绘制_实例教程_课课家

  由于篇幅有限,本教程只介绍面部的画法,其它的大家可以类推。

  还是那个套路,先来构建基础的html代码:

基础代码

  我们先给背景做了一些基本的设置,并且加入渐变填充来提升脸部的立体感。

  radial-gradient代表的是放射状渐变,即从中心点开始,沿着半径从纯白过渡到浅灰。

       效果如下图所示:

设置背景并加入渐变填充效果图

  接下来,大家可能觉得很奇怪,为什么只有一个元素呢?光看脸都有一双眼睛加一个嘴巴啊。没错,这里我们继续用before和after伪元素来构建不同的部分,为了体现before和after的对等关系,我们可以让before和after各负责绘制一只眼睛,然后嘴巴就拿来做元素的主体了。

  由于嘴巴是一根线,所以用border来绘制会非常方便,然后我们用百分比定位使其居中。

  .baymax{

  border-bottom:1.5em solid #000;

  position:absolute;

  top:50%;

  left:50%;

  width:50%;

  }

  运行效果如下图所示:

尝试绘制大白嘴巴

  怎么跑右边去了?这是因为坐标位置基于div的左上角,要使其以div中心为基准,我们可以利用CSS3的transform属性向左向上偏移div宽高的50%。

  .baymax{

  /*其它样式代码省略*/

  transform:translate(-50%,-50%);

  }

  再次运行,效果就正确了:

嘴巴的位置正确了

  接下来我们用before伪元素插入一只眼睛,它是个圆。如果大家之前有关注课课家的CSS3教程,那相信你们对椭圆的画法都很熟悉了,用圆角半径为50%的正方形即可。背景用黑色,跟眼睛的颜色一致。

  .baymax::before{

  background:#000;

  border-radius:50%;

  content:"";

  position:absolute;

  width:12em;

  height:12em;

  }

  运行效果如下图所示:

利用before元素插入一只眼睛

  然后适当调整下位置,让圆心对齐到边框的左边缘。当然了,左一点也没太大关系。

  .baymax::before{

  /*其它样式代码省略*/

  left:-9em;

  top:-6em;

  }

  运行效果如下图所示:

调整眼睛位置效果

  然后,眼睛太圆给人的感觉很“平面”,不像脸蛋上球形的眼睛,所以我们让它适当扭曲一下,在transform的各项属性里面,skew会把矩形扭曲为非直角的平行四边形,从而实现假3D的效果。

  .baymax::before{

  /*其它样式代码省略*/

  transform:skewX(-4deg);

  }

  再次运行,感觉就出来了:

对眼睛实施扭曲

  类似地,我们加上右眼。最大的不同在于,扭曲方向应该跟左眼相反,这样才可以让两边对称。

  .baymax::after{

  background:#000;

  border-radius:50%;

  content:"";

  position:absolute;

  width:12em;

  height:12em;

  right:-9em;

  top:-6em;

  transform:skewX(4deg);

  }

  然后,大白的脸部就绘制完成了,如下图所示:

大白的脸部

  为了让效果更加生动,我们不妨给大白加点动画,比如电影里面没电时的眨眼动作。

  要实现眨眼动画的是before和after伪元素,我们打算通过background-position来进行修改,但这样做会导致眼睛闭上的时候,上方会留有空白,所以我们给眼白的部分加上一个接近白色的浅灰渐变,同时增大background-size使其可以实现滚动。

  .baymax::before{

  /*其它样式代码省略*/

  background:linear-gradient(tobottom,#efefef,#efefef 50%,#000 50%,#000);

  background-position:0-100%;

  background-size:200%;

  }

  .baymax::after{

  /*其它样式代码省略*/

  background:linear-gradient(tobottom,#efefef,#efefef 50%,#000 50%,#000);

  background-position:0-100%;

  background-size:200%;

  }

  然后再为它们定义animation属性:

  .baymax::before{

  /*其它样式代码省略*/

  -webkit-animation:blink 6s infinite;

  -moz-animation:blink 6s infinite;

  -o-animation:blink 6s infinite;

  animation:blink 6s infinite;

  }

  .baymax::after{

  /*其它样式代码省略*/

  -webkit-animation:blink 6s 0.1s infinite;

  -moz-animation:blink 6s 0.1s infinite;

  -o-animation:blink 6s 0.1s infinite;

  animation:blink 6s 0.1s infinite;

  }

  infinite是无穷的意思,代表动画不停循环播放。after中的0.1s代表延后0.1秒播放,这可以让两个眼睛的动画适当错开,看起来会更萌的哟~

  blink是动画的名称,它通过@keyframes规则进行定义。

  @keyframes blink{

  0%,50%{

  background-position:0 100%;

  }

  85%,95%{

  background-position:0 75%;

  }

  100%{

  background-position:0 100%;

  }

  }

  @keyframes跟animation一样需要多个前缀兼容不同的浏览器,但全部贴出来代码太长了,所以此处省略。

  这个动画在6秒(整个动画的持续时间)的前一半时间(即3秒),背景的位置在100%处静止不动,没有眨眼效果,然后从一半到85%的时间段(3秒到5.1秒)里面,背景向下滚动到75%,从而形成闭眼动画,接着停留10%的时间(0.6秒)后,再重新睁开眼睛,持续时间为5%,即0.3秒。

  这么说比较抽象,大家直接测试下自己的文件就能观看完整的动画效果了。这样一个萌萌的大白面部就诞生了!你还不赶快动手试一试!

赞(1)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程