- 자 오늘은 마우스 효과를 사용해서 페이지를 만들어 보겠습니다.
- 동그란 원이 마우스 커서를 대신하는 효과인 것이죠~
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="view-transitionn" content="same-origin">
<title>01. 마우스 이펙트</title>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/mouse.css">
<style>
.mouse__wrap {
cursor: none;
}
.mouse__cursor {
position: absolute;
left: 0;
top: 0;
width: 50px;
height: 50px;
border-radius: 50%;
border: 5px solid #fff;
background-color: rgba(255, 255, 255, 0.1);
user-select: none;
pointer-events: none;
transition:
background-color 0.3s,
border-color 0.3s,
transform 0.6s,
border-radius 0.6s,
border 0.6s
;
}
.mouse__cursor.s1 {
background-color: rgba(158, 100, 100, 0.7);
border-color: #ac5454;
}
.mouse__cursor.s2 {
background-color: rgba(158, 100, 100, 0.7);
border-color: #b82b2b;
transform: scale(2) rotateY(720deg);
}
.mouse__cursor.s3 {
background-color: rgba(87, 135, 32, 0.7);
border-color: #5ab82b;
transform: scale(2) rotateX(545deg);
}
.mouse__cursor.s4 {
background-color: rgba(32, 135, 128, 0.7);
border-color: #2bb89e;
transform: scale(6);
border-radius: 30%;
}
.mouse__cursor.s5 {
background-color: rgba(87, 135, 32, 0.7);
border-color: #5ab82b;
transform: scale(2) skew(1080deg);
}
.mouse__cursor.s6 {
background-color: rgba(32, 37, 135, 0.7);
border-color: #2b55b8;
transform: scale(0.1);
}
.mouse__text {
width: 100%;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.mouse__text p {
font-size: 2vw;
line-height: 1.5;
}
.mouse__text p:last-child {
font-size: 3vw;
}
.mouse__text p span {
color: #34abcd;
}
.mouse__info {
position: absolute;
left: 0;
bottom: 0;
padding: 20px;
font-size: 16px;
line-height: 1.6;
}
</style>
</head>
<body class="img01 bg01 font01">
<header id="header">
<h1>Javascript Mouse Effect01</h1>
<p>마우스 이펙트 - 마우스 따라다니기</p>
<ul>
<li class="active"><a href="mouseEffect01.html">1</a></li>
<li><a href="mouseEffect02.html">2</a></li>
<li><a href="mouseEffect03.html">3</a></li>
<li><a href="mouseEffect04.html">4</a></li>
<li><a href="mouseEffect05.html">5</a></li>
</ul>
</header>
<!-- //heaver -->
<main id="main">
<div class="mouse__wrap">
<div class="mouse__cursor"></div>
<div class="mouse__text">
<p><span class="s1">Traveling</span> is <span class="s2">making</span> new <span class="s3">memories</span> .</p>
<p><span class="s4">여행</span>은 새로운 <span class="s5">추억</span>을 <span class="s6">쌓는 것</span>이다.</p>
</div>
</div>
<div class="mouse__info">
<ul>
<li>clientX : <span class="clientX">px</span></li>
<li>clientY : <span class="clientY">px</span></li>
<li>offsetX : <span class="offsetX">px</span></li>
<li>offsetY : <span class="offsetY">px</span></li>
<li>pageX : <span class="pageX">px</span></li>
<li>pageY : <span class="pageY">px</span></li>
<li>screenX : <span class="screenX">px</span></li>
<li>screenY : <span class="screenY">px</span></li>
</ul>
</div>
</main>
<!-- //main -->
<footer id="footer">
<a href="mailto:imkebab00@gmail.com">im.kebab00@gmail.com</a>
</footer>
<!-- //footer -->
<script>
window.addEventListener("mousemove", function(event){
document.querySelector(".clientX").innerHTML = event.clientX;
document.querySelector(".clientY").innerHTML = event.clientY;
document.querySelector(".offsetX").innerHTML = event.offsetX;
document.querySelector(".offsetY").innerHTML = event.offsetY;
document.querySelector(".pageX").innerHTML = event.pageX;
document.querySelector(".pageY").innerHTML = event.pageY;
document.querySelector(".screenX").innerHTML = event.screenX;
document.querySelector(".screenY").innerHTML = event.screenY;
})
//선택자
// document.querySelectorAll(".mouse__info ul li span").forEach((el,index) => {
// el.innerHTML = index+i + "00";
// });
const cursor = document.querySelector(".mouse__cursor");
window.addEventListener("mousemove", function(e){
cursor.style.left = e.clientX -25 +"px";
cursor.style.top = e.clientY -25 +"px";
});
// document.querySelector(".s1").addEventListener("mouseover", function(){
// cursor.classList.add("s1");
// })
// document.querySelector(".s1").addEventListener("mouseout", function(){
// cursor.classList.remove("s1");
// })
// document.querySelector(".s2").addEventListener("mouseover", function(){
// cursor.classList.add("s2");
// })
// document.querySelector(".s2").addEventListener("mouseout", function(){
// cursor.classList.remove("s2");
// })
// document.querySelector(".s3").addEventListener("mouseover", function(){
// cursor.classList.add("s3");
// })
// document.querySelector(".s3").addEventListener("mouseout", function(){
// cursor.classList.remove("s3");
// })
// document.querySelector(".s4").addEventListener("mouseover", function(){
// cursor.classList.add("s4");
// })
// document.querySelector(".s4").addEventListener("mouseout", function(){
// cursor.classList.remove("s4");
// })
// document.querySelector(".s5").addEventListener("mouseover", function(){
// cursor.classList.add("s5");
// })
// document.querySelector(".s5").addEventListener("mouseout", function(){
// cursor.classList.remove("s5");
// })
// document.querySelector(".s6").addEventListener("mouseover", function(){
// cursor.classList.add("s6");
// })
// document.querySelector(".s6").addEventListener("mouseout", function(){
// cursor.classList.remove("s6");
// })
// //for
// for(let i =1; i<7; i++){
// document.querySelector("s"+i).addEventListener("mouseover", function(){
// cursor.classList.add("s"+i);
// });
// document.querySelector("s"+i).addEventListener("mouseout", function(){
// cursor.classList.remove("s"+i);
// });
// }
//forEach
// document.querySelectorAll(".mouse__text span").forEach(function(span, num){
// span.addEventListener("mouseover", function(){
// cursor.classList.add("s"+(num+1));
// });
// span.addEventListener("mouseout", function(){
// cursor.classList.remove("s"+(num+1));
// });
// });
// getAttribute()
document.querySelectorAll(".mouse__text span").forEach(function(span){
let attr = span.getAttribute("class");
// attr = s1 s2 s3 s4 s5 s6
span.addEventListener("mouseover",function(){
cursor.classList.add(attr);
});
span.addEventListener("mouseout",function(){
cursor.classList.remove(attr);
});
});
// set Attribute
</script>
</body>
</html>
- 자 이것이 위에 있는 페이지의 코드입니다.
- 눈에 띄는 것은 마우스를 움직일 때마다 마우스의 좌표를 알려주는 것이고 커서를 특정 단어 위에 올려두었을 때 커서에 효과가 있는 것입니다.
- 스크립트 부분을 보시죠
<script>
window.addEventListener("mousemove", function(event){
document.querySelector(".clientX").innerHTML = event.clientX;
document.querySelector(".clientY").innerHTML = event.clientY;
document.querySelector(".offsetX").innerHTML = event.offsetX;
document.querySelector(".offsetY").innerHTML = event.offsetY;
document.querySelector(".pageX").innerHTML = event.pageX;
document.querySelector(".pageY").innerHTML = event.pageY;
document.querySelector(".screenX").innerHTML = event.screenX;
document.querySelector(".screenY").innerHTML = event.screenY;
})
//선택자
// document.querySelectorAll(".mouse__info ul li span").forEach((el,index) => {
// el.innerHTML = index+i + "00";
// });
const cursor = document.querySelector(".mouse__cursor");
window.addEventListener("mousemove", function(e){
cursor.style.left = e.clientX -25 +"px";
cursor.style.top = e.clientY -25 +"px";
});
// document.querySelector(".s1").addEventListener("mouseover", function(){
// cursor.classList.add("s1");
// })
// document.querySelector(".s1").addEventListener("mouseout", function(){
// cursor.classList.remove("s1");
// })
// document.querySelector(".s2").addEventListener("mouseover", function(){
// cursor.classList.add("s2");
// })
// document.querySelector(".s2").addEventListener("mouseout", function(){
// cursor.classList.remove("s2");
// })
// document.querySelector(".s3").addEventListener("mouseover", function(){
// cursor.classList.add("s3");
// })
// document.querySelector(".s3").addEventListener("mouseout", function(){
// cursor.classList.remove("s3");
// })
// document.querySelector(".s4").addEventListener("mouseover", function(){
// cursor.classList.add("s4");
// })
// document.querySelector(".s4").addEventListener("mouseout", function(){
// cursor.classList.remove("s4");
// })
// document.querySelector(".s5").addEventListener("mouseover", function(){
// cursor.classList.add("s5");
// })
// document.querySelector(".s5").addEventListener("mouseout", function(){
// cursor.classList.remove("s5");
// })
// document.querySelector(".s6").addEventListener("mouseover", function(){
// cursor.classList.add("s6");
// })
// document.querySelector(".s6").addEventListener("mouseout", function(){
// cursor.classList.remove("s6");
// })
// //for
// for(let i =1; i<7; i++){
// document.querySelector("s"+i).addEventListener("mouseover", function(){
// cursor.classList.add("s"+i);
// });
// document.querySelector("s"+i).addEventListener("mouseout", function(){
// cursor.classList.remove("s"+i);
// });
// }
//forEach
// document.querySelectorAll(".mouse__text span").forEach(function(span, num){
// span.addEventListener("mouseover", function(){
// cursor.classList.add("s"+(num+1));
// });
// span.addEventListener("mouseout", function(){
// cursor.classList.remove("s"+(num+1));
// });
// });
// getAttribute()
document.querySelectorAll(".mouse__text span").forEach(function(span){
let attr = span.getAttribute("class");
// attr = s1 s2 s3 s4 s5 s6
span.addEventListener("mouseover",function(){
cursor.classList.add(attr);
});
span.addEventListener("mouseout",function(){
cursor.classList.remove(attr);
});
});
// set Attribute
</script>
- 처음은 동그라미가 커서를 대신하는 것과 좌표 값을 나타내주는 방법입니다. 전혀 어렵지 않습니다.
const cursor = document.querySelector(".mouse__cursor");
window.addEventListener("mousemove", function(e){
cursor.style.left = e.clientX -25 +"px";
cursor.style.top = e.clientY -25 +"px";
});
- 동그라미 도형을 만들고 그 도형에게 mouse__cursor이라는 클라스를 준다음, 그도형을 cursor라는 선택자에 넣어 주었습니다.
그리고 addEventListener중에서 마우스가 움직였을 때 작동하는 효과를 준 후 cursordml 위치를 입력받는 좌표의 위치로 바꾸어주고 커서를 가려주면 끝! 이제 동그라미가 커서를 대신하게 됩니다!! 동그라이 중앙이 커서의 위치가 되게 하려면 반지름 만큼 빼주어야합니다!!
window.addEventListener("mousemove", function(event){
document.querySelector(".clientX").innerHTML = event.clientX;
document.querySelector(".clientY").innerHTML = event.clientY;
document.querySelector(".offsetX").innerHTML = event.offsetX;
document.querySelector(".offsetY").innerHTML = event.offsetY;
document.querySelector(".pageX").innerHTML = event.pageX;
document.querySelector(".pageY").innerHTML = event.pageY;
document.querySelector(".screenX").innerHTML = event.screenX;
document.querySelector(".screenY").innerHTML = event.screenY;
})
- 좌표값을 나타내는 방법입니다.
- 여기서 저희가 처음보는건 event.clientX 같은 것 밖에 없네요
- event.clientX는 마우스 이벤트에서 마우스 커서의 X 좌표 값을 나타내는 속성입니다.
Tip !
clientX/Y | 현재 보여지는 영역을 기준으로 좌표를 알려줍니다 |
offsetX/Y | 요소를 기준으로 좌표를 알려줍니다. |
pageX/Y | 전체 문서를 기준으로 좌표를 알려줍니다. |
screenX/Y | 모니터 화면을 기준으로 좌표를 알려줍니다. |
- 이제 마우스 효과 부분입니다!! 사실 마우스에게 효과를 주는 것은 어렵지않습니다.
- css에 효과가 있는 클라스를 하나 만들어 둔 뒤 함수를 통해 마우스가 올라가 있을 때 클라스를 추가해 주면 되기 때문입니다.
- 하지만 6개의 글자에 효과를 준 만큼 그것을 쓰는 방법도 여러가지가 있습니다.
- 하나씩 알아보도록하죠
document.querySelector(".s1").addEventListener("mouseover", function(){
cursor.classList.add("s1");
})
document.querySelector(".s1").addEventListener("mouseout", function(){
cursor.classList.remove("s1");
})
document.querySelector(".s2").addEventListener("mouseover", function(){
cursor.classList.add("s2");
})
document.querySelector(".s2").addEventListener("mouseout", function(){
cursor.classList.remove("s2");
})
document.querySelector(".s3").addEventListener("mouseover", function(){
cursor.classList.add("s3");
})
document.querySelector(".s3").addEventListener("mouseout", function(){
cursor.classList.remove("s3");
})
document.querySelector(".s4").addEventListener("mouseover", function(){
cursor.classList.add("s4");
})
document.querySelector(".s4").addEventListener("mouseout", function(){
cursor.classList.remove("s4");
})
document.querySelector(".s5").addEventListener("mouseover", function(){
cursor.classList.add("s5");
})
document.querySelector(".s5").addEventListener("mouseout", function(){
cursor.classList.remove("s5");
})
document.querySelector(".s6").addEventListener("mouseover", function(){
cursor.classList.add("s6");
})
document.querySelector(".s6").addEventListener("mouseout", function(){
cursor.classList.remove("s6");
})
- 첫번째는 일일이 다 적어주는 노가다 방식입니다.
- 초보자도 할 수 있지만 손이 아프죠
- 타자가 빠르다면 머리가 고생할 필요가 없는 전형적인 유형입니다.
//for문
for(let i =1; i<7; i++){
document.querySelector("s"+i).addEventListener("mouseover", function(){
cursor.classList.add("s"+i);
});
document.querySelector("s"+i).addEventListener("mouseout", function(){
cursor.classList.remove("s"+i);
});
}
- for 문 방식입니다.
- 개인적으로는 다른 방식들 보다 제일 만만하다고 느끼는 방식입니다.
- 1-6까지 숫자가 들어가는 부분을 for문을 써서 i로 대체해준 방법입니다.
// forEach문
document.querySelectorAll(".mouse__text span").forEach(function(span, num){
span.addEventListener("mouseover", function(){
cursor.classList.add("s"+(num+1));
});
span.addEventListener("mouseout", function(){
cursor.classList.remove("s"+(num+1));
});
});
- forEach 문입니다.
- querySelectorAll를 써서 여러 개의 태그를 한번에 선택을 해준 뒤 1-6까지의 숫자를 index값(num)에 1을 더한 후 입력해 준 것입니다.
- 사실 for문보다 어려워서 제가 쓴다면 쓰지는 않을 것 같지만 알아볼 수 있어야 하기 때문에 알아두시는 편이 좋습니다.
// getAttribute()
document.querySelectorAll(".mouse__text span").forEach(function(span){
let attr = span.getAttribute("class");
// attr = s1 s2 s3 s4 s5 s6
span.addEventListener("mouseover",function(){
cursor.classList.add(attr);
});
span.addEventListener("mouseout",function(){
cursor.classList.remove(attr);
});
});
- 마지막은 새로운 방법인데 getAttribute()를 사용하는 방법입니다.
- getAttribute()는 태그에서 지정한 속성의 값을 가져올 수 있습니다.
- let attr = span.getAttribute("class"); 를 통해 mouse__text span 태그에 있는 class값을 가져왔습니다.
그리고 변수 attr에 저장했죠 그런 다음 함수를 통해서 커서가 올라갔을 때 클라스를 추가해 주면 됩니다.
- 끝!