[ํ๋ก ํธ์๋] ์์ง์ด๋ 3D ์นด๋ ํจ๊ณผ ๋ง๋ค๊ธฐ
๊ธ ์์ฑ์: ๋ฅํด๋ฒ .
๋ฐ์ํ
๋ณธ ํฌ์คํ ์ ์๋ ์ฝ๋ฉ์ ํ๋์ ๋์์ '๋ฐ๋ก ์ฟ ํก ์ทจ์ ๊ฐ๋ฅํ ํฌํธํด๋ฆฌ์ค ๋ง๋ค๊ธฐ'๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์์ต๋๋ค.
https://youtu.be/YDCCauu4lIk?si=hYyzxZVK5CIwoprZ
0. ์ค๋น
- ์นด๋๋ก ์ฌ์ฉํ ์ด๋ฏธ์ง 1์ฅ(images/3vx2.webp)
- HTML ํ์ผ(index.html)
1. ์นด๋ ์ด๋ฏธ์ง ํ์ผ ์ถ๋ ฅ
<div class="container">
<div class="card"></div>
</div>
<style>
.container {
width: 220px;
height: 310px;
}
.card {
width: 220px;
height: 310px;
background-image: url(images/3vx2.webp);
background-size: cover;
}
</style>
2. ๋ง์ฐ์ค ์์ง์์ ๋ฐ๋ผ ์นด๋ ์ด๋ฏธ์ง ํ์
<script>
var container = document.querySelector('.container')
container.addEventListener('mousemove', function(e) {
var x = e.offsetX
var y = e.offsetY
var rotateX = 4/30 * y - 20
var rotateY = -1/5 * x + 20
container.style = `transform: perspective(350px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`
})
</script>
container์์ญ์ ๋ง์ฐ์ค์ ์ขํ(e.offsetX, e.offsetY)์ ๋ฐ๋ผ์ transform ์์ฑ์ ์ค์ ์นด๋ ์ด๋ฏธ์ง๋ฅผ ํ์ ์ํจ๋ค.
transform: ์์์ ๋ณํ์ ์ ์ํ๋ CSS ์์ฑ์ ๋๋ค.
ํ์ , ์ด๋, ํฌ๊ธฐ ์กฐ์ , ๊ธฐ์ธ์ ๋ฑ์ ํจ๊ณผ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
perspective(350px): 3D ๋ณํ ํจ๊ณผ๋ฅผ ์ค ๋ ์๊ทผ๊ฐ์ ์ค์ ํฉ๋๋ค.
๊ฐ์ด ์์์๋ก ์๊ทผ๊ฐ์ด ๊ฐํด์ ธ์ ๋ ๊ทน์ ์ธ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
rotateX(${rotateX}deg): ์์๋ฅผ X์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ์ํต๋๋ค.
์ฆ, ๋ง์ฐ์ค๊ฐ ์์๋๋ก ์์ง์ผ ๋ ์์๊ฐ X์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ํฉ๋๋ค.
rotateY(${rotateY}deg): ์์๋ฅผ Y์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ์ํต๋๋ค.
์ฆ, ๋ง์ฐ์ค๊ฐ ์ข์ฐ๋ก ์์ง์ผ ๋ ์์๊ฐ Y์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ํฉ๋๋ค..
3. ์นด๋ ์ด๋ฏธ์ง์ ๊ด์(๋น) ํจ๊ณผ ์ฃผ๊ธฐ
<div class="container">
<div class="overlay"></div>
<div class="card"></div>
</div>
<script>
var container = document.querySelector('.container')
var overlay = document.querySelector('.overlay')
container.addEventListener('mousemove', function(e) {
var x = e.offsetX
var y = e.offsetY
var rotateX = 4/30 * y - 20
var rotateY = -1/5 * x + 20
overlay.style = `background-position: ${x/5 + y/5}%`
container.style = `transform: perspective(350px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`
})
container.addEventListener('mouseout', function() {
overlay.style = 'filter: opacity(0)'
container.style = 'transform: perspective(350px) rotateY(0deg) rotateX(0deg)'
})
</script>
<style>
.container {
width: 220px;
height: 310px;
}
.overlay {
position: absolute;
width: 220px;
height: 310px;
background: linear-gradient(105deg,
transparent 40%,
rgba(255, 219, 112, 0.8) 45%,
rgba(32, 50, 255, 0.6) 50%,
transparent 54%);
filter: brightness(1.2) opacity(0.8);
mix-blend-mode: color-dodge;
background-size: 150% 150%;
background-position: 100%;
transition: all 0.1s;
}
.card {
width: 220px;
height: 310px;
background-image: url(images/3vx2.webp);
background-size: cover;
}
</style>
์นด๋ ์ด๋ฏธ์ง์ ๊ด์ ํจ๊ณผ๋ฅผ ์ฃผ๋ ์๋ฆฌ๋ ์นด๋ ์ด๋ฏธ์ง ์์ ๊ด์ ์ด๋ฏธ์ง(overlay)๋ฅผ ํฌ๋ช ํ๊ฒ ๋ฎ๋ ์๋ฆฌ๋ค.
position: absolute;:
์ด ์์ฑ์ .overlay ์์๋ฅผ ๋ถ๋ชจ ์์(.container)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋์ ์ธ ์์น์ ๋ฐฐ์นํฉ๋๋ค.
์ฆ, .overlay๋ .container ๋ด๋ถ์์ ์์ ๋กญ๊ฒ ์ด๋ํ๊ณ ๋ฐฐ์น๋ ์ ์์ต๋๋ค.
background: linear-gradient(105deg, transparent 40%, rgba(255, 219, 112, 0.8) 45%, rgba(32, 50, 255, 0.6) 50%, transparent 54%);:
์ด ์์ฑ์ .overlay์ ์ ํ ๊ทธ๋ผ๋ฐ์ด์ ๋ฐฐ๊ฒฝ์ ์ ์ฉํฉ๋๋ค.105deg๋ ๊ทธ๋ผ๋ฐ์ด์ ์ ๋ฐฉํฅ์ ์ค์ ํฉ๋๋ค.
transparent 40% : ํฌ๋ช ํ ์์์ด 40%์ง์ ๊น์ง ์ ์ฉ๋ฉ๋๋ค.
rgba(255, 219, 112, 0.8) 45% :
๋ ธ๋์์ ๊ฐ๊น์ด ์์์ด 45%์ง์ ๊น์ง ์ ์ฉ๋ฉ๋๋ค. alpha๊ฐ์ด 0.8์ด๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ํฌ๋ช ํ ์ํ์ ๋๋ค.
rgba(32, 50, 255, 0.6) 50% : ํ๋์์ ๊ฐ๊น์ด ์์์ด 50%์ง์ ๊น์ง ์ ์ฉ๋ฉ๋๋ค.
alpha๊ฐ์ด 0.6์ด๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ํฌ๋ช ํ ์ํ์ ๋๋ค.
transparent 54% : ํฌ๋ช ํ ์์์ด 54%์ง์ ๊น์ง ์ ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ์ค์ ์ ํตํด, .overlay๋ ํน์ ๊ฐ๋๋ก ์์์ด ๋ณํํ๋ ๋น๋๋ ํจ๊ณผ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
filter: brightness(1.2) opacity(0.8);:
brightness(1.2)๋ ์์์ ๋ฐ๊ธฐ๋ฅผ 1.2๋ฐฐ๋ก ์ฆ๊ฐ์์ผ ๋ ๋ฐ๊ฒ ๋ง๋ญ๋๋ค.
opacity(0.8)์ ์์์ ํฌ๋ช ๋๋ฅผ 0.8๋ก ์ค์ ํ์ฌ ์ฝ๊ฐ ํฌ๋ช ํ๊ฒ ๋ง๋ญ๋๋ค.
mix-blend-mode: color-dodge;:
์ด ์์ฑ์ ๋ฐฐ๊ฒฝ์๊ณผ ์์์ ์์์ ํผํฉํ๋ ๋ฐฉ์์ ์ค์ ํฉ๋๋ค.
color-dodge๋ ๋ฐ์ ์์์ ๋ ๋ฐ๊ฒ ๋ง๋ค๊ณ ์ด๋์ด ์์์ ๊ฑฐ์ ๋ณํ์ํค์ง ์์ ๋น๋๋ ํจ๊ณผ๋ฅผ ์ค๋๋ค.
background-size: 150% 150%;:
๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง(์ด ๊ฒฝ์ฐ์๋ ๊ทธ๋ผ๋ฐ์ด์ )์ ํฌ๊ธฐ๋ฅผ ์์์ ํฌ๊ธฐ๋ณด๋ค 150% ํฌ๊ฒ ์ค์ ํฉ๋๋ค.
์ด๊ฒ์ ๊ทธ๋ผ๋ฐ์ด์ ์ด ์์ ์์์ ์์ง์ด๋ ํจ๊ณผ๋ฅผ ๋ด๋๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
background-position: 100%;:
๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง์ ์ด๊ธฐ ์์น๋ฅผ ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก 100% ์์น์ ์ค์ ํฉ๋๋ค.
transition: all 0.1s;:
์ด ์์ฑ์ ์์์ ์์ฑ ๋ณํ์ 0.1์ด์ ์ ํ ํจ๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค.
์ฆ, .overlay์ ์คํ์ผ์ด ๋ณ๊ฒฝ๋ ๋ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ํจ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
๋ฐ์ํ
'Development > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Ubuntu] Wordpress ํ๋ฌ๊ทธ์ธ ์ค์น/์ญ์ ์ FTP ์ ๋ณด ์ ๋ ฅ ์ฐฝ์ด ๋์ฌ ๋(Connection Information)
[Ubuntu] Wordpress ํ๋ฌ๊ทธ์ธ ์ค์น/์ญ์ ์ FTP ์ ๋ณด ์ ๋ ฅ ์ฐฝ์ด ๋์ฌ ๋(Connection Information)
2023.10.17 -
[Ubuntu] ์๋ํ๋ ์ค(Wordpress), LAMP(Linux, Apache, MySQL, PHP) ์คํ ์ค์น
[Ubuntu] ์๋ํ๋ ์ค(Wordpress), LAMP(Linux, Apache, MySQL, PHP) ์คํ ์ค์น
2023.10.16 -
[Ubuntu] Let's Encrypt๋ฅผ ํตํด HTTPS(SSL) ๋ฌด๋ฃ๋ก ๊ตฌ์ถํ๊ธฐ
[Ubuntu] Let's Encrypt๋ฅผ ํตํด HTTPS(SSL) ๋ฌด๋ฃ๋ก ๊ตฌ์ถํ๊ธฐ
2023.10.16 -
SPA(Single Page Application), MPA(Multi Page Application)
SPA(Single Page Application), MPA(Multi Page Application)
2022.11.20