✅ css 애니메이션 소개
✅ transform 속성
✅ transition 속성
✅ Animation 속성
✅ Kids Gao 움직이는 사자 구현
✅ 실무01 mouse-animation
✅ 실무02 move-box
✅ 실무03 outer-border, inner-border
✅ 실무04 슈퍼마리오 동전
✅ 실무05 이미지 확대 기능
오브젝트 크기를 축소 및 확대하거나, 각도를 회전 시키거나 위치를 변경시킬 때 사용한다.
rotate
속성은 2차원적인 회전 효과를 의미한다. 평면적으로 회전을 하게 되고 rotate안의 숫자는 양수 또는 음수 모두를 가질 수 있다.
scale
속성은 내가 선택한 영역의 크기를 비율로 키울 때 사용한다. 예를 들면, transform: scale(2, 3);은 앞의 숫자는 width 값을 2배로 키우겠다는 뜻이고 뒤의 숫자는 height값을 3배로 키우겠다는 뜻이다.
skew
속성은 선택한 영역의 각도에 미치는 속성이다. 3차원적인 효과를 적용한다. 예를들면, transform: skew(10deg, 20deg);에서 앞의 숫자는 x축에 영향을 미치고 뒤의 숫자는 y축에 영향을 미친다. 숫자는 양수 또는 음수 모두를 가질 수 있다. 정육면체를 만들 수도 있다.
translate
는 내가 선택한 영역의 오브젝트를 위치를 변경할 때 사용한다. 첫번째 숫자로 전달된 값은 x축, 두번째 숫자로 전달된 값은 y축에 영향을 미친다.
🚨주의점: 사용하고 있는 브라우저에는 고유한 버전들이 있는데, 각 브라우저의 하위버전까지 맞추어서 transform을 작성하고 싶을 때 프리픽스를 이용한다.
-webkit-transform: rotate(10deg); /* 크롬, 사파리 */
-moz-transform: rotate(10deg); /* 파이어폭스 */
-ms-transform: rotate(10deg); /* 익스플로러 */
-o-transform: rotate(10deg); /* 오페라 */
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="transform"></div>
</body>
</html>
👉 css
.transform {
width: 300px;
height: 300px;
background-color: yellow;
/*transform: rotate(-10deg);*/
/*transform: scale(0.5, 0.5);*/
/*transform: skew(-10deg, 20deg);*/
/*transform: translate(100px, 300px);*/
/*margin-left: 300px;*/
/*margin-top: 200px;*/
/*-webkit-transform: rotate(10deg);*/
/*-moz-transform: rotate(10deg);*/
/*-ms-transform: rotate(10deg);*/
/*-o-transform: rotate(10deg);*/
transform: rotate(10deg);
}
👉 결과물
변화하는 과정을 보여주고 싶을 때 사용
transition-property
: 변화를 주고자 하는 영역
transition-duration
: 애니메이션이 진행되는 시간
transition-timing-function
: 애니메이션이 움직이는 데 여러 속도의 성격을 지정할 수 있다. linear 속성값은 처음부터 끝까지 일정한 속도를 유지시키겠다는 뜻이다.
transition-delay
: 약간의 딜레이를 적용한 이후에 애니메이션 효과를 발동시키는 속성이다.
위의 transition 속성값들을 하나의 속성값으로 만들 수 있다.(용량을 줄이므로 로딩 속도가 빨라진다)
메뉴버튼에 마우스를 올렸을 때 바로 색상을 바꾸게 하게끔 아니라 자연스러운 색상변화를 적용하고자 할 때 transition속성을 이용한다.
변화를 주고자 하는 속성은 ,를 사용해서 늘릴 수 있다.
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="transition"></div>
</body>
</html>
👉 css
.transition {
width: 300px;
height: 300px;
background-color: yellow;
/*
transition-property: width;
transition-duration: 2s;
transition-timing-function: linear;
transition-delay: 1s;
*/
transition: width 2s linear, height 2s linear;
}
.transition:hover {
width: 600px;
height: 600px;
}
👉 결과물
자연스럽게 오브젝트를 자동으로 움직이는 효과를 만들고 싶을 때 사용하는 속성이다.
animation-name
: 원하는 이름으로 작성
animation-duration
: 애니메이션이 전체 동작하는 시간
animation-timing-function
: 애니메이션이 움직이는 데 여러 속도의 성격을 지정할 수 있다. linear 속성값은 처음부터 끝까지 일정한 속도를 유지시키겠다는 뜻이다.
animation-delay
: 약간의 딜레이를 적용한 이후에 애니메이션 효과를 발동시키는 속성이다.
animation-iteration-count
: 애니메이션 진행 횟수
animation-direction
: 애니메이션 진행 방향
애니메이션 속성을 사용할 때 같이 따라와야 하는 코드는 @keyframes이다. @keyframes + 지정한 animation-name
@keyframes changeWidth {
from {
width: 300px;
}
to {
width: 600px;
}
}
css속성을 추가해서 다양한 커스텀 효과를 가져올 수 있다. 배경 색깔 변화도 가능하다.
keyframes 안에서 from, to를 숫자로 표현할 수도있다. 지점을 따로 설정해서 작업이 가능하다.
@keyframes changeWidth {
0% {
width: 300px;
height: 300px;
background-color: yellow;
}
50% {
background-color: blue;
}
100% {
width: 600px;
height: 600px;
background-color: red;
}
}
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="animation"></div>
</body>
</html>
👉 css
.animation {
width: 300px;
height: 300px;
background-color: yellow;
animation-name: changeWidth;
animation-duration: 3s;
animation-timing-function: linear;
animation-delay: 1s;
animation-iteration-count: infinite;
animation-direction: alternate;
}
@keyframes changeWidth {
0% {
width: 300px;
height: 300px;
background-color: yellow;
}
50% {
background-color: blue;
}
100% {
width: 600px;
height: 600px;
background-color: red;
}
}
👉 결과물
Animation 속성값들을 하나의 속성값으로 만들 수 있다.(용량을 줄이므로 로딩 속도가 빨라진다)
하위버전으로 제작을 하는 경우 animation속성을 사용해야한다면 코드가 필연적으로 늘어날 수 밖에 없다.
포물선 만들기(참고 사이트): https://jeremyckahn.github.io/stylie/
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="spin-lion"></div>
</body>
</html>
👉 css
.spin-lion {
width: 150px;
height: 150px;
background-color: blue;
margin: 0 auto;
margin-top: 200px;
/*
animation-name: spinLion;
animation-duration: 1.5s;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
*/
-webkit-animation: spinLion 1.5s linear infinite alternate;
animation: spinLion 1.5s linear infinite alternate;
}
@-webkit-keyframes spinLion {
from {
-webkit-transform: rotate(-10deg);
}
to {
-webkit-transform: rotate(10deg);
}
}
@keyframes spinLion {
from {
transform: rotate(-10deg);
}
to {
transform: rotate(10deg);
}
}
👉 결과물
색상 코드 변경: http://hex2rgba.devoth.com/
배경에만 투명도를 주고싶다면 rgba()를 사용하는 것이 좋다.
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<nav class="mouse-animation">
<ul>
<li><a href="#">메뉴1</a></li>
<li><a href="#">메뉴2</a></li>
<li><a href="#">메뉴3</a></li>
<li><a href="#">메뉴4</a></li>
</ul>
</nav>
</body>
</html>
👉 css
html, body {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
a {
text-decoration: none;
color: #000000;
}
.mouse-animation li {
width: 250px;
background-color: rgba(0, 0, 0, 1);
padding: 20px;
border-top: solid 5px #dfdfdf;
transition: opacity 0.5s, margin-left 0.5s
}
.mouse-animation li:hover {
background-color: rgba(0, 0, 0, 0.5);
margin-left: 10px;
}
.mouse-animation li a {
color: red;
font-size: 20px;
}
👉 결과물
left와 top을 사용할 수 있는 이유는 position이 relative이기 때문이다.
animation-play-state
:
animation-fill-mode
:
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="move-box"></div>
</body>
</html>
👉 css
.move-box {
position: relative;
width: 200px;
height: 200px;
background-color: red;
animation-name: moveBox;
animation-duration: 4s;
animation-timing-function: linear;
animation-delay: 1s;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-play-state: running;
animation-fill-mode: backwards; // 원래 move-box 배경색은 빨간색(red)이지만, backwards를 씀으로써 0%의 배경색인 green으로 따라간다.
}
@keyframes moveBox {
0% {
background-color: green;
left: 0;
top: 0;
}
25% {
background-color: yellow;
left: 500px;
top: 0;
}
50% {
background-color: grey;
left: 500px;
top: 500px;
border-radius: 50%;
}
75% {
background-color: blue;
left: 0;
top: 500px;
}
100% {
background-color: red;
left: 0;
top: 0;
}
}
👉 결과물
box-sizing: border-box;
안쪽의 박스 크기를 바깥 박스 크기를 넘어서지 않도록 하는 것👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="outer-border">
<div class="inner-border"></div>
</div>
</body>
</html>
👉 css
.outer-border {
display: flex;
justify-content: center;
align-items: center;
width: 200px;
height: 200px;
border: solid 15px red;
border-radius: 50%;
margin: 0 auto;
margin-top: 200px;
animation: outerBorder 2s infinite;
}
@keyframes outerBorder {
0% { border-color: red; transform: scale(1);}
25% { border-color: yellow; transform: scale(1.2); }
50% { border-color: blue; transform: scale(1.3);}
75% { border-color: green; transform: scale(1.2);}
100% { border-color: pink; transform: scale(1);}
}
.inner-border {
box-sizing: border-box;
width: 75px;
height: 75px;
border: 5px solid purple;
animation: innerBorder 2s infinite alternate;
}
@keyframes innerBorder {
0% { transform: rotate(0deg); }
25% { border-color: blue; border-width: 10px;}
50% { border-color: yellow; border-width: 20px;}
75% { border-color: green;border-width: 30px;}
100% { border-color: grey; border-width: 5px; transform: rotate(360deg);}
}
👉 결과물
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="mario-container">
<div class="mario-coin"></div>
<div class="mario-box"></div>
</div>
</body>
</html>
👉 css
.mario-container {
position: relative;
width: 500px;
height: 500px;
border: solid 10px black;
margin: 0 auto;
margin-top: 200px;
}
.mario-container .mario-coin {
position: relative;
width: 70px;
height: 70px;
background-color: yellow;
margin: 0 auto;
margin-top: 100px;
border-radius: 50%;
animation: jumpCoin 1.0s infinite ;
}
@keyframes jumpCoin {
0% {
transform: translateY(0);
opacity: 1;
}
50% {
transform: translateY(-100px) rotateY(180deg);
opacity: 0;
}
100% {
transform: translateY(-100px) rotateY(360deg);
opacity: 0;
}
}
.mario-container .mario-box {
width: 100px;
height: 100px;
background-color: blue;
margin: 0 auto;
animation: jumpBox 0.5s linear infinite alternate;
}
@keyframes jumpBox {
0% { transform: translateY(0); }
50% { transform: translateY(-10px); }
100% { transform: translateY(0); }
}
👉 결과물
%는 %를 사용한 지점의 부모가 누구인지에 따라 그 공간의 크기가 설정된다.
img 태그는 하단에 미세한 공백을 가지고 있다. 이를 해결(하단 공백 제거)하기 위해서는 vertical-align: middle;을 적용하면 된다. 이는 디폴드 값으로 넣어주어야 한다.
부모가 2차원일 때 자식의 3차원적인 높이 값이 부모의 높이 값에 영향을 줄 수 없다. (부모 클래스인 hover-image가 자식 클래스인 image-info의 높이를 인식하지 못한다. 해결법으로 부모 position을 relative로 적용)
부모가 3차원적인 특징을 갖고 있을 때(relative 포함)그리고 자식을 3차원으로 적용했을 때 width값을 부모를 기준으로 잡을 수 있다.
부모가 3차원 특징을 갖고 있을 때 position 좌표 기준점은 부모를 기준으로 형성이 된다.(부모가 relative이므로 left, top 이동 가능)
overflow:hidden;을 적용해서 이미지가 hover-image 영역을 넘어서는 부분을 감춘다.
scale과 관련된 효과를 적용하고 싶을 땐 overflow를 같이 사용해야한다. 특정 영역을 벗어났을 때 감춤 효과를 적용하기 위해서
cursor: pointer;
: 이미지에 마우스를 올렸을 때 클릭을 나타내는 손가락 모양으로 변경
👉 html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="hover-image">
<img src="https://image.freepik.com/free-photo/sunny-day-with-sea-background_1160-233.jpg">
<div class="image-info">
<h2>Title</h2>
<p>Paragraph</p>
</div>
</div>
</body>
</html>
👉 css
.hover-image {
cursor: pointer;
overflow: hidden;
position: relative;
width: 400px;
border: solid 10px #000000;
}
.hover-image img {
width: 100%;
vertical-align: middle;
transition: transform 0.3s linear;
}
.hover-image:hover img {
transform: scale(1.3);
}
.hover-image .image-info {
box-sizing: border-box;
position: absolute;
width: 100%;
background-color: rgba(0, 0, 0, 0.5);
padding: 20px;
left: 0;
bottom: -85px;
transition: bottom 0.3s linears;
}
.hover-image:hover .image-info {
bottom: 0;
}
.hover-image .image-info h2,
.hover-image .image-info p {
margin: 0;
padding: 0;
color: #ffffff;
}
.hover-image .image-info h2 {
font-size: 20px;
}
.hover-image .image-info p {
font-size: 15px;
}
👉 결과물
오늘은 css 애니메이션 속성에 대해서 학습했다. css 애니메이션은 많이 다뤄보지 않은 부분이라서 낯설기도 하고 익혀야 할 부분도 굉장히 많았다.하지만, 웹 브라우저에 오브젝트가 움직이고 반응하는 부분이 매우 흥미로웠고 재미있었다! 오늘 어려웠던 점은 슈퍼 마리오 동전 부분과 마지막인 이미지 확대하는 부분이 굉장히 어려웠다. 특히, css레이아웃 속성과 애니메이션 속성을 접목 시킬 때 이해하기가 어려워서 여러번 반복해서 학습했다. 오늘은 학습분량도 굉장히 많아서 내일은 처음부터 다시 강의를 반복해야할 것 같다..🥲 복습 철저히 해서 내일 수업에 지장이 없게끔 해야겠다!