강아지 애니메이션
이번 시간에는 SCSS와 Pug를 이용해서꼬리를 흔드는 강아지를 만들어보겠습니다.
01. html
HTML은 Pug로 컴파일 시켜줍니다.
body 안에 tail(꼬리) 8개를 넣어줍니다.
torso(몸통), head(머리)를 만들어주고 그안에 알맞게
정렬을 맞추어 ears(귀),ear,eyes(눈),eye,muzzle(주둥이),tongue(혀)를 넣어줍니다.
코드 보기
{
<div class="dog">
<div class="dog-body">
<div class="dog-tail">
<div class="dog-tail">
<div class="dog-tail">
<div class="dog-tail">
<div class="dog-tail">
<div class="dog-tail">
<div class="dog-tail">
<div class="dog-tail"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="dog-torso"></div>
<div class="dog-head">
<div class="dog-ears">
<div class="dog-ear"></div>
<div class="dog-ear"></div>
</div>
<div class="dog-eyes">
<div class="dog-eye"></div>
<div class="dog-eye"></div>
</div>
<div class="dog-muzzle">
<div class="dog-tongue"></div>
</div>
</div>
</div>
}
02. CSS
CSS는 SCSS로 컴파일 시켜줍니다. animation 효과를 주어 꼬리를 흔들며 움직이게 해주고, 취향에 맞게 색과 모양을 맞춰줍니다.
코드 보기
{
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
html, body {
background: #297BF6;
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
*, *:before, *:after {
box-sizing: border-box;
position: relative;
}
.dog {
width: 100px;
height: 100px;
z-index: 1;
}
.dog:before {
content: "";
display: block;
position: absolute;
width: 100%;
height: 100%;
border-radius: 50%;
background: rgba(0, 0, 0, 0.03);
transform: translatey(-30%) scale(1.5);
}
.dog * {
position: absolute;
}
.dog-body, .dog-head, .dog-torso {
border-radius: 50%;
background: white;
position: absolute;
width: 100%;
height: 100%;
}
.dog-body {
top: -50%;
box-shadow: inset 0 -15px 0 0 #EAEBEC;
animation: dog-body 200ms ease-in-out infinite alternate;
}
.dog-body:before {
content: "";
position: absolute;
bottom: 90%;
right: 50%;
width: 90%;
height: 90%;
background: rgba(255, 255, 255, 0.4);
border-top-left-radius: 100%;
border-bottom-left-radius: 10%;
border-top-right-radius: 10%;
transform-origin: right bottom;
animation: dog-tail-blur 200ms 33.3333333333ms ease-in-out infinite alternate both;
}
@keyframes dog-tail-blur {
0% {
transform: rotate(0);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
opacity: 0;
transform: rotate(90deg);
}
}
@keyframes dog-body {
from {
transform: translatex(-10%);
}
to {
transform: translatex(10%);
}
}
.dog-head {
border-radius: 50px;
animation: dog-head 1800ms cubic-bezier(0.11, 0.79, 0, 0.99) infinite;
}
@keyframes dog-head {
0% {
transform: rotate(45deg);
}
33% {
transform: rotate(-45deg);
}
66% {
transform: rotate(0deg);
}
100% {
transform: rotate(45deg);
}
}
.dog-torso {
top: -20%;
background: white;
box-shadow: inset 0 -15px 0 0 #EAEBEC;
animation: dog-torso 200ms ease-in-out infinite alternate-reverse;
}
@keyframes dog-torso {
0% {
transform: translatex(-5%);
}
100% {
transform: translatex(5%);
}
}
.dog-eyes {
width: 60%;
top: 55%;
left: 20%;
z-index: 1;
}
.dog-eyes:before {
content: "";
display: block;
width: 40px;
height: 40px;
border-radius: 40px;
background: #000;
position: absolute;
top: -10px;
left: -10px;
z-index: 0;
border: 4px solid white;
border-left-width: 0;
border-bottom-width: 0;
border-top-width: 0;
transform: rotate(-45deg);
}
.dog-eye {
width: 10px;
height: 10px;
border-radius: 50%;
background: #F6E229;
z-index: 1;
}
.dog-eye:first-child {
left: 0;
}
.dog-eye:last-child {
right: 0;
}
.dog-muzzle {
width: 60%;
left: 20%;
height: 50%;
border-bottom-left-radius: 100%;
border-bottom-right-radius: 100%;
bottom: -15%;
background: white;
}
.dog-muzzle:before, .dog-muzzle:after {
content: "";
display: block;
position: absolute;
}
.dog-muzzle:before {
width: 6px;
height: 20px;
bottom: 0;
background: #EAEBEC;
left: calc(50% - 10px);
}
.dog-muzzle:after {
background: black;
width: 20px;
height: 15px;
bottom: 12px;
left: calc(50% - 10px);
border-bottom-left-radius: 60% 60%;
border-bottom-right-radius: 60% 60%;
border-top-left-radius: 50% 40%;
border-top-right-radius: 50% 40%;
}
.dog-ears {
width: 40%;
top: 25%;
left: 30%;
}
.dog-ear {
bottom: -10px;
height: 50px;
width: 50px;
background: #EAEBEC;
}
.dog-ear:first-child {
right: 100%;
border-bottom-left-radius: 80%;
border-top-right-radius: 80%;
box-shadow: inset -15px 15px 0 1px white;
transform: rotate(10deg);
}
.dog-ear:last-child {
left: 100%;
border-bottom-right-radius: 80%;
border-top-left-radius: 80%;
box-shadow: inset 15px 15px 0 0px white;
transform: rotate(-10deg);
}
.dog-tongue {
width: 40%;
height: 100%;
left: calc(50% - 20px);
z-index: -1;
transform-origin: center top;
}
.dog-tongue:before {
content: "";
position: absolute;
left: 8px;
display: block;
width: 100%;
height: 100%;
border-radius: 40px;
background: #fd3163;
animation: dog-tongue-inner 100ms ease-in-out infinite alternate;
}
@keyframes dog-tongue-inner {
from {
transform: translatey(5%);
}
to {
transform: translatey(22%);
}
}
.dog-tail {
width: 22px;
height: 24.2px;
background: black;
bottom: 40%;
border-radius: 11px;
left: calc(50% - 11px);
transform-origin: center bottom;
}
.dog-tail {
animation: dog-tail-segment 200ms ease-in-out infinite alternate;
}
@keyframes dog-tail-segment {
0% {
transform: rotate(-10deg);
}
100% {
transform: rotate(10deg);
}
}
.dog-body > .dog-tail {
bottom: 90%;
}
}
03. 최종결과 (코드펜)
코드펜으로 결과물을 냅니다.
'CSS' 카테고리의 다른 글
이미지 스프라이트 / IR 효과 / 백그라운드 표현 (5) | 2022.08.20 |
---|---|
SCSS (3) | 2022.08.18 |
미디어 쿼리(media query) (5) | 2022.08.15 |
기본 문법 (6) | 2022.08.13 |
비트맵 방식 / 벡터 방식 (8) | 2022.08.10 |
댓글