์์์ ๊ฑฐ๋ฆฌ๊ฐ์ ์ค์ ์๊ทผ๋ฒ์ ๋ํ๋ด์ฃผ๋ perspective ์์ฑ์ ๊ณต๋ถํ๋ฉด์ ์, ๋ท๋ฉด์ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ค์ ๋ค์งํ๋ ์นด๋๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฌ์ค์ ์์๋ค..๐!
๋น์ฅ ์กฐ์์ ์ ์์..ใ
ใ
์นด๋๋ฅผ ๋ง๋ค์ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์ด์ ๋ง๋ค์ด๋ด
<div class='front'>
, <div class='back'>
์ ๊ฐ์ธ๋ <div>
2๊ฐ๋ฅผ ๋ง๋๋ ์ด์ ๋ ๋์ค์ animation ๋ ๊ฐ๋ฅผ ์ค์ผํ๊ธฐ ๋๋ฌธ<div class="container">
<div class="flip">
<div class="front">์๋ฉด</div>
<div class="back">๋ท๋ฉด</div>
</div>
</div>
.container {
width: 300px;
height: 460px;
animation-name: changeScale;
animation-delay: 0;
animation-duration: 2s;
animation-iteration-count: 1;
}
.container:hover {
transform: scale(1.1);
}
.flip {
perspective: 1000px;
width: 100%;
height: 100%;
position: relative;
animation-name: changeTranslation;
animation-delay: 2s;
animation-duration: 2s;
animation-iteration-count: infinite;
animation-timing-function: cubic-bezier(0.2, 0.15, 0.48, 1.02);
}
.flip:hover {
animation-play-state: paused;
}
.front,
.back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
}
.front {
animation-name: ํ๋ฆฌ๋ฆญ-front;
animation-delay: 0;
animation-duration: 2s;
animation-iteration-count: 1;
}
.back {
transform: rotateY(180deg);
animation-name: ํ๋ฆฌ๋ฆญ-back;
animation-delay: 0;
animation-duration: 2s;
animation-iteration-count: 1;
}
@keyframes changeScale {
0% {
transform: scale(0);
}
100% {
transform: scale(1);
}
}
@keyframes ํ๋ฆฌ๋ฆญ-front {
100% {
transform: rotateY(720deg);
}
}
@keyframes ํ๋ฆฌ๋ฆญ-back {
100% {
transform: rotateY(900deg);
}
}
@keyframes changeTranslation {
35% {
transform: translateY(-50px);
}
90% {
transform: translateY(0px);
}
}
1. ํ๋ฉด ๋ก๋ฉ์ ํ๋ฉด ์ค์์์ ํ๋ฆฌ๋ฆญ ๋ค์งํ๋ฉด์ ์ ์ ์ปค์ง
.container
์ changeScale
animation ์ค
ํ์ด์ง ๋ก๋ ๋์๋ง์ 1๋ฒ ์คํ
2์ด๋์ ํฌ๊ธฐ 0 -> ์๋ํฌ๊ธฐ ๋ก ํค์
.container {
animation-name: changeScale;
animation-delay: 0;
animation-duration: 2s;
animation-iteration-count: 1;
}
@keyframes changeScale {
0% {
transform: scale(0);
}
100% {
transform: scale(1);
}
}
.front
์ ํ๋ฆฌ๋ฆญ-front
animation ์ค.front {
backface-visibility: hidden;
animation-name: ํ๋ฆฌ๋ฆญ-front;
animation-delay: 0;
animation-duration: 2s;
animation-iteration-count: 1;
}
@keyframes ํ๋ฆฌ๋ฆญ-front {
100% {
transform: rotateY(720deg);
}
}
.back
์ ์ด๊ธฐ๊ฐ์ 180deg ๋๋ ค ๋ท๋ฉด์ผ๋ก ๋ฐฐ์นํ๋ฆฌ๋ฆญ-back
animation์ผ๋ก ๋๊ฐ์ด 2์ด๋์ 720deg ํ์ .back {
backface-visibility: hidden;
transform: rotateY(180deg);
}
@keyframes ํ๋ฆฌ๋ฆญ-back {
100% {
transform: rotateY(900deg);
}
}
backface-visibility
- ์์์ ๋ท๋ฉด์ ๋ณด์ฌ์ค ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์
- ๊ธฐ๋ณธ๊ฐ : visible
- ์ฌ๊ธฐ์
backface-visibility: hidden
์ ๋ท๋ฉด์ ์๋ณด์ด๊ฒ ์ค์
2. ์ผ์ ํฌ๊ธฐ์ ๋๋ฌํ๋ฉด ๊ทธ ์๋ฆฌ์์ ๋ฅ๋ฅ ๋ ๋ค๋
.flip
์ ๋ฅ๋ฅ ๋ ๋ค๋๋ changeTranslation
animation์ ์ค
1๋ฒ ํจ๊ณผ๊ฐ ๋ค ๋๋ ๋ค์ธ 2์ด ์ง๋์๋ถํฐ ์์
๋ฉ์ถ์ง ์๊ณ ๊ณ์ ์คํ
cf) perspective: 3d ํจ๊ณผ ๋ด๋ฉด์ rotate
.flip {
perspective: 1000px;
animation-name: changeTranslation;
animation-delay: 2s;
animation-duration: 2s;
animation-iteration-count: infinite;
animation-timing-function: cubic-bezier(0.2, 0.15, 0.48, 1.02);
}
@keyframes changeTranslation {
35% {
transform: translateY(-50px);
}
90% {
transform: translateY(0px);
}
}
.flip
์ ๋ฅ๋ฅ๋ ๋ค๋๋ animation ์ค์ง.container
์ ํฌ๊ธฐ ํค์.container:hover {
transform: scale(1.1);
}
.flip:hover {
animation-play-state: paused;
}
์ ์นด๋ ํ๋ํ์ค ํ์ฌ ๊ตฌํฉ๋๋ค~~ใ ใ โจ