Top

024 CSS3 공부 (3) transition, transform, animation

Daily Study/Web Dev

2021. 3. 4.

반응형
<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>transition</title>
	<style>
		body {
			fonot: 12px 'Malgun Gothic', sans-serif;
		}
		#wrap {
			width: 900px;
			margin: 0 auto;
		}
		.box {
			width: 100px;
			height: 100px;
			background-color: lime;
			/*transition: all 3s 1s linear;*/
			/* 적용할 속성, duration, delay, timing-function 순서*/
			/* all하면 다 3초에 걸쳐서 변화, 아래 hover에 있는 속성만 적으면 그거만 적용 */

			/*transition-property: width;*/
			/* 어떤 속성을 변화시킬건가 */
			/*transition-duration: 3s;*/
			/* 몇 초에 걸쳐서 변화시킬건가 */
			/*transition-delay: 1s;*/
			/* 실행 대기 시간 */
			/*transition-timing-function: linear;*/
			/* linear | ease | ease-in | ease-out | ease-in-out | steps(1, start) | steps(1,end) */

			/*transition:
				width 3s linear,
				height 1s 3s,
				background-color 2s 4s;*/

			/*transition: all 1s cubic-bezier(0.42, 0.0, 1.0, 1.0);*/
			transition: all 1s steps(5) ;

		}
		.box:hover {
			width: 100%;
		
		}
	</style>
</head>
<body>
	<div id="wrap">
		<div class="box">
			
		</div>
	</div>
</body>
</html>

호버하면 width가 100%까지 1초에 걸쳐서 5단계에 걸쳐서 transition하게 하기


<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>transition</title>
	<style>
	#wrap {
		width: 700px;
		margin: 0 auto;
	}
	.box {
		position: relative;
		width: 700px;
		height: 500px;
		box-sizing: border-box;
		background: url(img/wendy.jpg) 0 0 / cover;
	}
	.pic1 {
		width: 700px;
		height: 100px;
		background-color: rgba(255,255,255,1);
		transition: width 0.3s steps(5);
	}

	.box:hover .pic1 {

		width: 0px;
		background-color: rgba(255,255,255,1);
	}

	.pic2 {
		position: absolute;
		top: 100px;
		width: 700px;
		height: 100px;
		background-color: rgba(255,255,255,1);
		transition: width 0.3s 0.3s steps(5);
	}

	.box:hover .pic2 {
		width: 0px;
		background-color: rgba(255,255,255,1);
	}

	.pic3 {
		position: absolute;
		top: 200px;
		width: 700px;
		height: 100px;
		background-color: rgba(255,255,255,1);
		transition: width 0.3s 0.6s steps(5);
	}

	.box:hover .pic3 {
		width: 0px;
		background-color: rgba(255,255,255,1);
	}

	.pic4 {
		position: absolute;
		top: 300px;
		width: 700px;
		height: 100px;
		background-color: rgba(255,255,255,1);
		transition: width 0.3s 0.9s steps(5);
	}

	.box:hover .pic4 {
		width: 0px;
		background-color: rgba(255,255,255,1);
	}

	.pic5 {
		position: absolute;
		top: 400px;
		width: 700px;
		height: 100px;
		background-color: rgba(255,255,255,1);
		transition: width 0.3s 1.2s steps(5);
	}

	.box:hover .pic5 {
		width: 0px;
		background-color: rgba(255,255,255,1);
	}

	</style>
</head>
<body>

	<div id="wrap">
		<div class="box">
			<div class="pic1"></div>
			<div class="pic2"></div>
			<div class="pic3"></div>
			<div class="pic4"></div>
			<div class="pic5"></div>
		</div>
	</div>
	
</body>
</html>

steps로 움직이는 transition을 보니까 갑자기 고전게임 로딩되는거처럼

삐리릭삐리릭 이미지나 텍스트가 나타나는걸 표현해보고 싶어서 한 연습

 

근데 한 방향 말고 왼쪽 오른쪽 왼쪽 오른쪽 주거니받거니 하게 하고 싶었는데

방법을 못찾았다.

 


<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>animation</title>
	<style>
		body {
			font: 12px 'Malgun Gothic',sans-serif;
		}
		#wrap {
			margin-top: 30px;
			width: 900px;
			margin: 0 auto;
		}
		.box {
			margin-top: 100px;
			width: 100px;
			height: 100px;
			background-color: green;
			/*animation-name: ani;
			animation-duration: 3s;
			animation-delay: 1s;
			animation-fill-mode: backwards;*/
			/* 애니메이션이 끝나면 어디에 고정될지, forwards 맨앞상황, backwards 맨뒤상*/
			/*animation-direction: reverse;
			animation-timing-function: ease;
			animation-iteration-count: 5;*/

			/*animation:
				ani 3s 1s infinite alternate,
				ani2 1s 1s infinite alternate;*/
			animation: ani3 2s infinite steps(5);
		}
		.box:hover {
			animation-play-state: paused;
			/* 마우스 올렸을 떄 일시정지 */
		}

		@keyframes ani {
			0% {width: 100px;}
			100% {width: 100%;}
		}
		@keyframes ani2 {
			0% {height: 100px;}
			100% {height: 200px;}
		}
		@keyframes ani3 {
			0% {transform: rotateZ(0deg);}
			100% {transform: rotateZ(360deg);}
		}
	</style>
</head>
<body>
	<div id="wrap">
		<div class="box">
			
		</div>
	</div>
	
</body>
</html>

transform 적용한 애니메이션

 


<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>animation exer</title>
	<style>
	
	body h1,h2,h3,p,em {
		margin: 0 auto;
		padding: 0;
		font: 12px 'malgun gothic',sans-serif;
		text-decoration: none;
		font-style: normal;
	}

	#wrap {
		width: 500px;
		margin: 0 auto;
		margin-top: 20px;
	}
	.pic {
		position: relative;
		width: 500px;
		height: 500px;
		background: url(img/wendy5.png);
	}

	.pic div {
		background-color: white;
	}

	.box1 {
		position: absolute;
		top: 0;
		left: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani1 1s steps(15);
	}

	@keyframes ani1 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box2 {
		position: absolute;
		top: 50px;
		right: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani2 1s 1s steps(15);
	}

	@keyframes ani2 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box3 {
		position: absolute;
		top: 100px;
		left: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani3 1s 2s steps(15);
	}

	@keyframes ani3 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box4 {
		position: absolute;
		top: 150px;
		right: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani4 1s 3s steps(15);
	}
	@keyframes ani4 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box5 {
		position: absolute;
		top: 200px;
		left: 0;
		width: 500px;
		height: 50px;
	animation: forwards ani5 1s 4s steps(15);
	}
	@keyframes ani5 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box6 {
		position: absolute;
		top: 250px;
		right: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani6 1s 5s steps(15);
	}
	@keyframes ani6 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box7 {
		position: absolute;
		top: 300px;
		left: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani7 1s 6s steps(15);
	}
	@keyframes ani7 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box8 {
		position: absolute;
		top: 350px;
		right: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani8 1s 7s steps(15);
	}
	@keyframes ani8 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box9 {
		position: absolute;
		top: 400px;
		left: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani9 1s 8s steps(15);
	}
	@keyframes ani9 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.box10 {
		position: absolute;
		top: 450px;
		right: 0;
		width: 500px;
		height: 50px;
		animation: forwards ani10 1s 9s steps(15);
	}
	@keyframes ani10 {
		0%{width: 500px;}
		100%{width: 0px;}
	}

	.text {
		position: relative;
		margin-top: 20px;
		width: 500px;
		height: 150px;
		box-sizing: border-box;
		border: 5px double lightblue;
		/*border-style: double;*/
		border-radius: 10px;
	}

	.text h1 {
		padding-top: 15px;
		padding-bottom: 10px;
		font: 2em bold Baskerville,serif;
		color: rgba(0,0,255,.6);
		text-align: center;
	}

	.text h2 {
		font: 1em '바탕체',serif;
		text-align: center;
	}

	.text h3 {
		font: .8em '바탕체',serif;
		text-align: center;
		letter-spacing: -1.3px;
	}

	.text p {
		padding-top: 10px;
		text-align: center;
	}

	.textbox1 {
		position: absolute;
		top: -5px;
		left: -5px;
		width: 500px;
		height: 50px;
		background-color: white;
		animation: textani1 forwards 1s 10s steps(15);
	}

	@keyframes textani1 {
		0% {width: 500px;}
		100% {width: 0px;}
	}

	.textbox2 {
		position: absolute;
		top: 45px;
		right: -5px;
		width: 500px;
		height: 50px;
		background-color: white;
		animation: textani2 forwards 1s 11s steps(15);
	}

	@keyframes textani2 {
		0% {width: 500px;}
		100% {width: 0px;}
	}

	.textbox3 {
		position: absolute;
		top: 95px;
		left: -5px;
		width: 500px;
		height: 50px;
		background-color: white;
		animation: textani3 forwards 1s 12s steps(15);
	}

	@keyframes textani3 {
		0% {width: 500px;}
		100% {width: 0px;}
	}

	</style>
</head>
<body>
	<div id="wrap">
		<div class="pic">
			<div class="box1"></div>
			<div class="box2"></div>
			<div class="box3"></div>
			<div class="box4"></div>
			<div class="box5"></div>
			<div class="box6"></div>
			<div class="box7"></div>
			<div class="box8"></div>
			<div class="box9"></div>
			<div class="box10"></div>
		</div>

		<div class="text">
			<h1>Wendy</h1>
			<h2>손승완</h2>
			<h3>1994.02.21. ~</h3>
 			<p>대한민국의 가수이다. 5인조 걸그룹 <em>레드벨벳</em>의 멤버이며, 팀에서 <em>메인보컬</em>을 맡고 있다.</p>	
 			<div class="textbox1"></div>
 			<div class="textbox2"></div>
 			<div class="textbox3"></div>
		</div>
	</div>


</body>
</html>

아까 transition으로 표현하려고 했다가 실패했던걸

animation으로 일단 원하던대로는 구현했다.

 

근데 뭔가 이거보다 훨씬 좋은 코드가 있을 것 같긴 한데

 

지금 내 방식은 사진영역이랑 텍스트 영역을 깔고

위에 그 크기 흰색 영역을 세로로 잘게 쪼개고

그 옆으로 길쭉한 쪼개진 영역들이 1초씩 15단계를 거쳐서 0의 폭을 갖도록 애니메이션을 만든건데

 

이러면 일단 사진 부분에만 div가 10개 생기고...

애니메이션도 다 따로 적용시켜야한다.

 

height 값도 손봐야하나 싶기도 하다.

근데 아직까진 머리가 잘 안굴러가서 어떻게 해야될지 잘 모르겠다.

 

걍 저 부분만 덮는거보다 어차피 나중에 일괄로 적용하려면

전체 페이지에 걸쳐서 저 효과가 적용되게 하는게 맞는 것 같기도 하다.

 

실제로 고전게임 로딩도 그 부분만 되는게 아니고

왼쪽 끝부터 오른쪽 끝까지 쭉 위에서 아래로 훑기 때문에

 

나중에 페이지에 올릴 거 다 올려놓고

창 전체를 덮는 박스들을 만들어서 저렇게 애니메이션을 넣으면 될 것 같기도 하다.

물론 창 덮는 애니메이션은 그냥 공통이니까

복사해서 하든 아니면 여러 태그 걸어서 하든 상관없지 않을까 싶다.

 

요전에 블렌더로 맥그로우 만들었을 때처럼

주어진 예제만 하는게 아니고 직접 만들고 생각하려니까 확실히 어려운 것 같지만

배웠던 것들을 실제로 적용하는 데에는 훨씬 도움되는 것 같다.

 

앞으론 애니메이션이 들어간 웹이 많이 나올테니까

gif 위주로 올려야겠다.

반응형