๋ง์ฐ์ค ์ดํํธ 02 : GSAP
์ด๋ฒ ์๊ฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ด์ง ๋ค๋ฅธ GSAP๋ฅผ ์ด์ฉํ์ฌ ๋ง์ฐ์ค ์ดํํธ๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
HTML ์์ค
header, main(๋ง์ฐ์ค ์ปค์ 2๊ฐ & ๋ช ์ธ), footer(๋ชจ๋ฌ ๋ฐ์ค) ํฌ๊ฒ 3๊ฐ์ง๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. footer์ ๋ชจ๋ฌ ๋ฐ์ค ๋ด์ฉ์ ๋๋ฌด ๊ธธ์ด์ง๋ฏ๋ก ์๋ตํ๋ค. ๋ชจ๋ฌ ๋ฐ์ค๋ฅผ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ด์ ์ ์ ๋ก๋ํ ์ฌ๋ผ์ด๋ ์ดํํธ ๊ฒ์๋ฌผ์ ์ฐธ์กฐํ ๊ฒ.
<body class="img04"> <!-- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ด๋ฏธ์ง / CSS๋ก ์ด๋ฏธ์ง ์ถ๋ ฅ์ํด -->
<header id="header">
<h1>JAVASCRIPT MOUSE EFFECT 02</h1>
<p>๋ง์ฐ์ค ์ดํํธ - ๋ง์ฐ์ค ๋ฐ๋ผ๋ค๋๊ธฐ(GSAP)</p>
<ul>
<li><a href="mouseEffect01.html">01</a></li>
<li class="active"><a href="mouseEffect02.html">02</a></li>
<li><a href="mouseEffect03.html">03</a></li>
<li><a href="mouseEffect04.html">04</a></li>
<li><a href="mouseEffect05.html">05</a></li>
<li><a href="mouseEffect06.html">06</a></li>
<li><a href="mouseEffect07.html">07</a></li>
</ul>
</header>
<!-- //header -->
<main id="main">
<section id="mouseType">
<div class="mouse__cursor"></div>
<div class="mouse__cursor2"></div>
<div class="mouse__wrap">
<p><span class="style1">The future</span> depends on <span class="style2">what we do</span> in the <span class="style3">present</span>.</p>
<p><span class="style4">๋ฏธ๋</span>๋ <span class="style5">ํ์ฌ</span> ์ฐ๋ฆฌ๊ฐ <span class="style6">๋ฌด์์ ํ๋๊ฐ</span>์ ๋ฌ๋ ค ์๋ค.</p>
</div>
</section>
</main>
<!-- //main -->
<footer>
<!-- ๋ชจ๋ฌ ๋ฐ์ค ๋ด์ฉ ๋ค์ด๊ฐ ๊ณณ. ๊ธธ์ด์ง๋ฏ๋ก ์๋ต. -->
</footer>
<!-- //footer -->
</body>
CSS ์์ค
๋ง์ฐ์ค ์ปค์ ๋ ๊ฐ(mouse__cursor, mouse__cursor2)์ ๋ชจ์์ ๋ง๋ ๋ค. ํด๋์ค๊ฐ active๊ฐ ๋ถ์์ ๋์ ๋ชจ์๋ ํจ๊ป ๊ธฐ์ ํ๋ค. ๊ณตํต/์ด๊ธฐํ CSS ์์ค๋ ํ๋จ์ [CSS ์์ค ๋ณด๊ธฐ]๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ณผ ์ ์๋ค.
.mouse__cursor {
position: absolute;
left: 0;
top: 0;
width: 10px;
height: 10px;
z-index: 9999;
border-radius: 50%;
background: rgba(255,255,255,0.1);
user-select: none;
pointer-events: none;
transition: transform 0.3s, opacity 0.2s;
}
.mouse__cursor2 {
position: absolute;
left: 0;
top: 0;
width: 30px;
height: 30px;
z-index: 9998;
border-radius: 50%;
background: rgba(255,255,255,0.3);
user-select: none;
pointer-events: none;
transition: transform 0.3s, opacity 0.2s;
}
.mouse__cursor.active {
transform: scale(0);
}
.mouse__cursor2.active {
transform: scale(5);
background: rgba(255,166,0,0.6);
}
JS ์์ค
GSAP ๋ฐฉ์์ ์ด์ฉํด์ ๋ง์ฐ์ค ์ปค์๊ฐ ์์ง์์ ๋์ ์คํ์ผ(CSS)์ ์ ํ์ฃผ๋๋ก ํ๋ค. (๊ธฐ์กด ๋ฐฉ์๊ณผ ํจ๊ป ๊ธฐ์ ํ์์) ๊ทธ๋ฐ ๋ค์, ๋ง์ฐ์ค ์ปค์๊ฐ ํน์ ๋ฌธ๊ตฌ ์์ ์ฌ๋ผ๊ฐ์ ๋(= hover ๋์ ๋) active ํจ๊ณผ๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์ปค์๊ฐ ๋ ๋ฌ์ ๋๋ active ํจ๊ณผ๋ฅผ ์ ๊ฑฐํด์ฃผ๋๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์งฐ๋ค.
const cursor = document.querySelector(".mouse__cursor");
const cursor2 = document.querySelector(".mouse__cursor2");
const span = document.querySelectorAll(".mouse__wrap span")
window.addEventListener("mousemove", e => {
// ์ปค์ ์ขํ๊ฐ ํ ๋น
// cursor.style.left = e.pageX -5+ "px";
// cursor.style.top = e.pageY -5+ "px";
// cursor2.style.left = e.pageX -15+ "px";
// cursor2.style.top = e.pageY -15+ "px";
// GSAP
gsap.to(cursor, {duration: 0.3, left: e.pageX -5, top:e.pageY -5});
gsap.to(cursor2, {duration: 0.8, left: e.pageX -15, top:e.pageY -15});
// ์ค๋ฒ ํจ๊ณผ
// mouseenter / mouseover / ์ด๋ฒคํธ ๋ฒ๋ธ๋ง
span.forEach(span => {
span.addEventListener("mouseenter", () => {
cursor.classList.add("active");
cursor2.classList.add("active");
});
span.addEventListener("mouseleave", () => {
cursor.classList.remove("active");
cursor2.classList.remove("active");
});
});
});
๊ฒฐ๊ณผ
'Effect > Mouse Effect' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Mouse Efffect] ๋ง์ฐ์ค ์ดํํธ 06 (2) | 2022.09.29 |
---|---|
[Mouse Effect] ๋ง์ฐ์ค ์ดํํธ 05 - ๊ธฐ์ธ๊ธฐ ํจ๊ณผ / ๊ธ์จ ๋ฐ์ ํจ๊ณผ (3) | 2022.09.28 |
[Mouse Effect] ๋ง์ฐ์ค ์ดํํธ 04 - ์ด๋ฏธ์ง ํจ๊ณผ (5) | 2022.09.22 |
[Mouse Effect] ๋ง์ฐ์ค ์ดํํธ 03 - ์กฐ๋ช ํจ๊ณผ (4) | 2022.09.22 |
[Mouse Effect] ๋ง์ฐ์ค ์ดํํธ 01 (6) | 2022.09.05 |
๋๊ธ