“我正在参加 码上掘金体验活动,详情:show出你的创意代码块”
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
前言
骑士(Knight、Cavalier) 原指欧洲中世纪时受过正式的军事训练的骑兵,后来演变为一种荣誉称号用于表示一个社会阶层。骑士的身份往往并不是继承而来的,中世纪时,骑士在领主军队中服役并获得封地。
实现
布局
整体布局代码
<div class="warrior">
<div class="helmet">
<div class="half-circle">
<!-- 帽子 -->
<div class="vrt-torso"></div>
<!-- 帽延 -->
</div>
<div class="torso">
<!-- 帽孔 -->
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
</div>
<div class="hair">
<!-- 头 -->
<div class="hair-1"></div>
<div class="hair-bor"></div>
<div class="hair-2"></div>
<div class="hair-2-bor"></div>
<!-- 头发 -->
</div>
<div class="face">
<!-- 脸 -->
<div class="eyebrow"></div>
<!-- 眉 -->
<div class="eye"></div>
<!-- 眼睛 -->
<div class="nose"></div>
<!-- 鼻子 -->
<div class="nose2"></div>
<div class="eye2"></div>
<div class="mouth">
<!-- 嘴巴 -->
<div class="tongue"></div>
</div>
</div>
<div class="hair-3">
</div>
<div class="sword">
<!-- 剑 -->
<div class="sword-div">
<div class="sword-iron"></div>
</div>
<div class="sword-div2">
<div class="sword-iron2"></div>
</div>
<div class="grip"></div>
<div class="grip2"></div>
<div class="grip4"></div>
<!-- 剑柄 -->
</div>
<div class="hand">
<!-- 手 -->
<div class="braclet"></div>
</div>
<div class="chest"></div>
<div class="chest2"></div>
<!-- 身体 -->
<div id="main-shield">
<!-- 遁甲 -->
<div id="shield">
<div id="shield2"></div>
<div id="shield3"></div>
</div>
</div>
<div class="leg"></div>
<div class="leg2"></div>
<!-- 脚 -->
<div class="feet"></div>
<div class="feet2"></div>
<!-- 鞋 -->
</div>
样式
css部分我们来编写一下骑士的基础样式跟动画,宽高布局之类的上面有一个整体的布局,这里我们使用了一个@keyframes、transform的属性,就是为了让我们可以看到一个舞动剑柄的视角,如果不设置的话我们只能在2d的空间里进行操作吗,transform: rotate(10deg);的属性也就是根据手臂挥起放下的旋转,设置了之后我们就多了一个挥剑动作。看如下整体动画效果代码。
body{
background:
radial-gradient(circle, transparent 20%, slategray 20%, slategray 80%, transparent 80%, transparent),
radial-gradient(circle, transparent 20%, slategray 20%, slategray 80%, transparent 80%, transparent) 50px 50px,
linear-gradient(#a09696 8px, transparent 8px) 0 -4px,
linear-gradient(90deg, #a09696 8px, transparent 8px) -4px 0;
background-color: slategray;
background-size:100px 100px, 100px 100px, 50px 50px, 50px 50px;
}
.hair-1{
z-index:3;
top:3px;
left:3px;
position:absolute;
height:205px;
width:205px;
background-color:rgb(218,071,06);
/* clip-path: polygon(61% 0, 61% 4%, 35% 22%, 42% 8%, 23% 25%, 30% 11%, 8% 32%, 15% 18%, 0 33%, 0 0); */
clip-path: polygon(66% 0, 57% 4%, 39% 14%, 44% 5%, 26% 18%, 31% 8%, 10% 26%, 15% 13%, 0 28%, 0 0);
-webkit-clip-path: polygon(66% 0, 57% 4%, 39% 14%, 44% 5%, 26% 18%, 31% 8%, 10% 26%, 15% 13%, 0 28%, 0 0);
-moz-clip-path: polygon(66% 0, 57% 4%, 39% 14%, 44% 5%, 26% 18%, 31% 8%, 10% 26%, 15% 13%, 0 28%, 0 0);
}
.hair-bor{
z-index:2;
left:-1px;
border:2px solid black;
height:225px;
width:215px;
background-color:black;
/* clip-path: polygon(61% 0, 61% 4%, 32% 23%, 42% 8%, 20% 27%, 30% 11%, 7% 33%, 15% 18%, 0 33%, 0 0); */
clip-path: polygon(69% 0, 59% 5%, 33% 18%, 44% 7%, 22% 22%, 32% 10%, 7% 29%, 14% 16%, 0% 29%, 0 0);
-webkit-clip-path: polygon(69% 0, 59% 5%, 33% 18%, 44% 7%, 22% 22%, 32% 10%, 7% 29%, 14% 16%, 0% 29%, 0 0);
-moz-clip-path: polygon(69% 0, 59% 5%, 33% 18%, 44% 7%, 22% 22%, 32% 10%, 7% 29%, 14% 16%, 0% 29%, 0 0);
position:absolute;
border:3px solid black;
}
.hair-2{
clip-path: polygon(55% 0%, 55% 27%, 47% 13%, 49% 29%, 38% 0);
-webkit-clip-path: polygon(55% 0%, 55% 27%, 47% 13%, 49% 29%, 38% 0);
-moz-clip-path: polygon(55% 0%, 55% 27%, 47% 13%, 49% 29%, 38% 0);
height:200px;
width:200px;
position:absolute;
background-color:rgb(218,71,6);
border: 2px solid black;
top:1px;
left:52px;
z-index:3;
}
.hair-2-bor{
z-index:2;
clip-path: polygon(56% 0, 56% 28%, 49% 17%, 50% 29%, 37% 0);
-webkit-clip-path: polygon(56% 0, 56% 28%, 49% 17%, 50% 29%, 37% 0);
-moz-clip-path: polygon(56% 0, 56% 28%, 49% 17%, 50% 29%, 37% 0);
height:235px;
width:235px;
position:absolute;
background-color:black;
border: 2px solid black;
left:35px;
}
body{
top:10px;
position:relative;
margin: auto;
width: 20%;
}
.circle{
display:inline-block;
width:5px;
height:5px;
border-radius:20px;
border:3px solid black;
background-color:black;
margin:5px 7px;
}
.hair{
position:absolute;
top:100px;
left:8.5px;
}
.torso{
top:75px;
position:absolute;
width:180px;
height:20px;
border-radius:10px;
border:4px solid black;
background-color:rgb(247,191,0);
}
.vrt-torso{
position:absolute;
width:20px;
height:120px;
border-radius:7px;
border:4px solid black;
background-color:rgb(247,191,0);
top:-10px;
left:72px;
}
.half-circle {
position:absolute;
left:5px;
width: 164px;
height: 80px;
background-color: rgb(137,136,143);
border-top-left-radius: 110px;
border-top-right-radius: 110px;
border: 5px solid black;
border-bottom: 0;
}
.face{
z-index:1;
top:100px;
position:absolute;
width:150px;
height:90px;
border-radius:30px;
border:3px solid black;
background-color:rgb(241,174,131);
left:14px;
}
.hair-3{
z-index:0;
top:100px;
position:relative;
width:163px;
height:100px;
border-radius:30px;
border:3px solid black;
background-color:rgb(218,71,6);
left:8px;
}
.eye, .eye2{
top:35px;
position:relative;
display:inline-block;
width:15px;
height:15px;
border-radius:15px;
border:3px solid black;
background-color:black;
/* margin:3px 5px; */
}
.eye{
left:16px;
z-index:7;
}
.eye2{
left:80px;
z-index:8;
}
.eyebrow{
left:95px;
top:25px;
position:absolute;
display:inline-block;
width:29px;
height:2px;
border-radius:5px;
transform:rotate(-25deg);
border:1px solid black;
background-color:black;
}
.nose, .nose2{
left:60px;
top:44px;
position:absolute;
display:inline-block;
width:20px;
height:2px;
border-radius:5px;
transform:rotate(-75deg);
border:1px solid black;
background-color:black;
}
.nose2{
top:53px;
left:67px;
width: 13px;
transform:rotate(0deg);
}
.mouth{
left:63px;
top:64px;
position:absolute;
display:inline-block;
width:15px;
height:19px;
border-radius:2px;
border:3px solid black;
background-color:rgb(208,41,6);
border-bottom-left-radius:15px;
border-bottom-right-radius:15px;
}
.tongue{
position:relative;
top:7px;
width:15px;
height:8px;
background-color:red;
border-radius:25px;
border-top:3px solid black;
}
.chest, .chest2{
top:206px;
left:24px;
position:absolute;
border-bottom: 100px solid rgb(43,45,35);
border-left: 25px solid transparent;
border-right: 25px solid transparent;
height: 0;
width:88px;
}
.chest{
z-index:-1;
top:200px;
}
.chest2{
top:25px;
z-index:-2;
border-bottom: 100px solid rgb(45,13,1);
width:100px;
left:18px;
height:180px;
}
.leg , .leg2 , .feet , .feet2{
top:297px;
left:35px;
position:absolute;
height:50px;
width:40px;
border:3px solid rgb(45,13,1);
background-color:rgb(102,101,100);
margin:5px;
}
.leg2{
left:95px;
}
.feet, .feet2{
height:20px;
width:50px;
background-color:rgb(43,45,35);
border-top-left-radius:15px;
border-top-right-radius:15px;
}
.feet{
top:350px;
left:30px;
}
.feet2{
top:350px;
left:90px;
}
.hand{
z-index:-2;
width:100px;
height:25px;
position:absolute;
background-color:rgb(241,174,131);
transform-origin:bottom right;
transform:rotate(10deg);
animation: 2s raise-arm ease-out infinite;
top:205px;
left:-65px;
border:3px solid rgb(43,45,35);
}
@keyframes raise-arm{
0{
transform:rotate(10deg);
}
30%{ transform:rotate(13deg);
}
60%{ transform:rotate(20deg);
}
80%{ transform:rotate(13deg);
}
100{ transform:rotate(10deg);
}
}
.braclet{
position:relative;
left:10px;
height:25px;
width:15px;
border-left:3px solid black;
border-right:3px solid black;
background-color:red;
}
.sword{
top:35px;
left:-88px;
position:absolute;
animation: 2s raise-sword ease-out infinite;
}
@keyframes raise-sword{
0%{
top:30px;
left:-88px;
}
30%{
top:40px;
left:-90px;
/* transform:translateX(-18px); */
}
60%{
top:33px;
left:-68px;
}
80%{
top:25px;
left:-83px;
}
100%{
top:35px;
left:-88px;
}
}
.sword-iron, .sword-iron2{
position:absolute;
width: 15px;
height: 120px;
-webkit-transform: skew(20deg);
-moz-transform: skew(20deg);
-o-transform: skew(20deg);
background: grey;
border:2px solid black;
}
.sword-div{
transform:rotateY(180deg) rotate(20deg);
}
.sword-div2{
transform: rotate(20deg) translateX(39px) translateY(-14px);
}
.sword-iron2{
background-color:rgba(43,34,32,);
}
.sword:after{
content:" ";
color:white;
}
.grip, .grip2, .grip3, .grip4{
position:absolute;
background-color:rgb(247,191,0);
height:7px;
width:37px;
top:120px;
left:-1px;
border:3px solid black;
border-radius:7px;
}
.grip2{
top:130px;
}
.grip3{
top:140px;
}
.grip4{
top:140px;
height:40px;
width:20px;
left:8px;
}
#shield {
position: relative;
width: 95px;
height: 95px;
background-color: grey;
border-radius: 0 0 140px 140px;
display: inline-block;
border:3px solid black;
}
#shield:before, #shield:after {
position: absolute;
margin-top: 50px;
content:"";
left: 70px;
top: 0;
width: 35px;
height: 50px;
background: grey;
border-radius: 100px 100px 0 0;
-webkit-transform: rotate(-60deg);
-moz-transform: rotate(-60deg);
-ms-transform: rotate(-60deg);
-o-transform: rotate(-60deg);
transform: rotate(-60deg);
-webkit-transform-origin: 0 100%;
-moz-transform-origin: 0 100%;
-ms-transform-origin: 0 100%;
-o-transform-origin: 0 100%;
transform-origin: 0 100%;
}
#shield:after {
background-color: grey;
left: 0;
-webkit-transform: rotate(60deg);
-moz-transform: rotate(60deg);
-ms-transform: rotate(60deg);
-o-transform: rotate(60deg);
transform: rotate(60deg);
-webkit-transform-origin: 100% 100%;
-moz-transform-origin: 100% 100%;
-ms-transform-origin: 100% 100%;
-o-transform-origin: 100% 100%;
transform-origin :100% 100%;
}
#shield2 {
z-index:1;
position: absolute;
top:10px;
left:5px;
width: 80px;
height: 75px;
background-color: rgb(91,180,202);
border-radius: 0 0 140px 140px;
border:3px solid black;
}
#shield3 {
z-index:2;
position: absolute;
top:20px;
left:13px;
width: 65px;
height: 35px;
background-color: rgb(247,191,0);
border-radius: 0 0 140px 140px;
transform:rotate(-180deg);
border:3px solid black;
}
#main-shield{
z-index:9;
position:absolute;
top:180px;
left:110px;
}
总结
整篇主要用到的是css布局,背景,还有抓娃娃部分用到的@keyframes、transform的平移旋转等css样式组合成的一个实现铠甲骑士的效果。