前言
这次趁着周末休息的时间,又弄了一个新的动画效果,用CSS实现的一个大白。整个实现过程比较简单,大家可以先看到下面的效果预览部分,十分简单,没有花里胡哨的技巧。话不多说,咱们直接进入主题。
效果预览
最终实现的相关效果如下。
HTML部分
首先我们看到HTML部分,相关代码如下。
<body>
<figure class="baymax">
<div class="head">
<span class="eyes"></span>
</div>
<div class="body">
<div class="chest">
<span class="button"></span>
</div>
<div class="belly"></div>
<div class="arm left">
<span class="fingers"></span>
</div>
<div class="arm right">
<span class="fingers"></span>
</div>
</div>
<div class="legs">
<div class="leg left"></div>
<div class="leg right"></div>
</div>
</figure>
</body>
使用<figure class="baymax">作为整个baymax类的容器,head和eye分别是整个容器的头部和眼部。.body是身体部分,.chest是胸部区域,.button是胸前的红色按钮(角色特征),.belly是腹部区域,.arm.left 和 .arm.right分别左右手臂,.fingers是手指部分,.leg.left 和 .leg.right分别是左右腿部分。
有了这些之后,就能通过下面的CSS将这个效果实现出来。
CSS部分
首先我们看到类名baymax的样式,相关代码如下。
.baymax {
font-size: 10px;
width: 30em;
height: 41em;
color: white;
display: flex;
justify-content: center;
position: relative;
}
.baymax * {
position: absolute;
}
.baymax *::before,
.baymax *::after {
content: '';
position: absolute;
}
这里设置了baymax角色的容器样式。定义了尺寸以及颜色,并且使用Flexbox布局使得水平居中子元素,通过position: relative使容器成为绝对定位子元素的参考点。
在伪元素设置中,为所有元素的::before和::after伪元素设置空内容和绝对定位,创建了一个可控的、基于比例的绘图环境,使得baymax的各个部分可以精确地定位和缩放。
接下来我们看到类名head的样式,相关代码如下。
.head {
width: 9em;
height: 6em;
background-color: currentColor;
border-radius: 50%;
box-shadow:
inset 0 -1.5em 3em rgba(0, 0, 0, 0.2),
0 0.5em 1.5em rgba(0, 0, 0, 0.2);
}
.head .eyes {
position: absolute;
width: 4.8em;
height: 0.1em;
background-color: #222;
top: 2.3em;
left: calc((9em - 4.8em) / 2);
}
.head .eyes::before,
.head .eyes::after {
width: 0.8em;
height: 0.9em;
background-color: #222;
border-radius: 50%;
top: -0.3em;
}
.head .eyes::before {left: 0;}
.head .eyes::after {right: 0;}
这里实现了Baymax的头部和眼睛,在头部容器(.head) 中,定义好尺寸和颜色,设置好圆角,通过立体阴影使得内外组合阴影创造深度感。
在眼睛(.eyes) 中设置绝对定位,精确放置在头部,通过一条极细的水平线(0.1em)作为眼睛基线,使用calc()函数计算水平位置实现精确居中。
最后在眼球(::before和::after伪元素) 中,创建两个圆形作为眼球,分别定位在眼睛基线的两端,使用相对定位(负值)向上偏移。
然后看到身体部分的样式,相关代码如下。
.body .chest {
position: absolute;
width: 19em;
height: 26em;
background-color: currentColor;
top: 4em;
left: calc((100% - 19em) / 2);
border-radius: 50%;
z-index: -1;
}
.body .chest .button {
position: absolute;
width: 2em;
height: 2em;
background-color: currentColor;
border-radius: 50%;
top: 4em;
right: 4em;
box-shadow:
inset 0 -0.5em 0.8em rgba(0, 0, 0, 0.15),
0.2em 0.3em 0.2em rgba(0, 0, 0, 0.05);
filter: opacity(0.75);
}
.body .belly {
position: absolute;
width: 24em;
height: 31em;
background-color: currentColor;
top: 5.5em;
left: calc((100% - 24em) / 2);
border-radius: 50%;
z-index: -2;
box-shadow:
inset 0 -2.5em 4em rgba(0, 0, 0, 0.15),
0 0.5em 1.5em rgba(0, 0, 0, 0.25);
}
.body .arm {
position: absolute;
top: 7.5em;
}
这里实现了Baymax的身体部分,在胸部(.chest) 中,定义尺寸为19em×26em(190px×260px),通过绝对定位让其水平居中,距离顶部4em,并且设计成椭圆形。
在按钮(.button) 中,定义尺寸为2em×2em(20px×20px),设计成圆形,具有内外阴影效果,最后通过filter: opacity(0.75)使得其有75%不透明度。
在腹部(.belly) 中,定义尺寸为24em×31em(240px×310px),比胸部更大,通过定位的方式使得其水平居中,距离顶部5.5em,最后定义好阴影样式让其更明显的内部和外部阴影效果。
总结
以上就是整个效果的实现过程了,代码简单易懂。另外,感兴趣的小伙伴们还可以在现有基础上发散思维,比如增加点其他效果,或者更改颜色等等。关于该效果如果大家有更好的想法欢迎在评论区分享,互相学习。最后,完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~