用CSS实现的铠甲骑士

169 阅读7分钟

“我正在参加 码上掘金体验活动,详情: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部分我们来编写一下骑士的基础样式跟动画,宽高布局之类的上面有一个整体的布局,这里我们使用了一个@keyframestransform的属性,就是为了让我们可以看到一个舞动剑柄的视角,如果不设置的话我们只能在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样式组合成的一个实现铠甲骑士的效果。

点个赞吧φ(>ω<*)

a1597ecaa1e0ec87eabdf2efbfd3111.jpg