#2 마우스오버 이벤트를 이용하여 메뉴 슬라이더를 만들어보자.

2020. 5. 14. 16:01Javascript/응용

1. 완성본

 이번 강의에서 만들 완성본 영상입니다.

 

 

2. HTML, CSS

 이번에는 스케치 없이도 바로 구조가 어떻게되있는지 알 수 있기 때문에 따로 하지 않겠습니다.

 

 그래서 먼저 HTML과 CSS를 이용해서 다음과 같은 메뉴 디자인만 만들어보려고 합니다.

 

메뉴 디자인

 

코드는 다음과 같습니다(CSS 헷갈리시는 분들을 위해 약간의 주석을 달아놓았습니다.).

 

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <div class="menu slide" id="jsMenu">
      <h1>Menu Slide</h1>
      <ul class="menu__list">
        <li class="item">Menu 1</li>
        <li class="item">Menu 2</li>
        <li class="item">Menu 3</li>
        <li class="item">Menu 4</li>
        <li class="item">Menu 5</li>
        <li class="item">Menu 6</li>
      </ul>
    </div>
    <script type="text/javascript" src="index.js"></script>
  </body>
</html>

CSS

// 전체 태그에 box-sizing을 적용합니다. box-sizing에 border 박스를 하면
// 전체 픽셀을 유지한 채로 padding이나 border의 크기만을 늘릴 수 있습니다.
// 예를 들면, 가로 300px, 세로, 300px의 블록이 있고, border(테두리)에 1px의 크기를 주면
// 블록의 전체 크기는 테두리를 포함해 가로 301px, 세로 301px가 되지요.
// 하지만 box-sizing:border-box를 적용하면,
// 가로 300px, 세로 300px을 그대로 유지한채로 테두리가 부여됩니다.

* {
  box-sizing: border-box;
}

html,
body {
  height: 100%;
  margin: 0;
}

// ex) <div class = "menu">, <div class = "lala menu">에 적용 
// position:absolute, .menu position:relative를 따로 설정해 준 부모요소가 없기 때문에
// body를 기준으로 위치를 조정할 수 있습니다.
// 저는 메뉴가 화면의 왼쪽 끝에 완전히 붙게하기 위하여 left:0, top:0의 위치를 부여했습니다.

.menu {
  position: absolute;
  width: 300px;
  height: 100%;
  top: 0;
  left: 0px;
  background-color: black;
  transition: 0.3s;
}

// <div class = "menu"> <h1></h1> </div>
// 의 경우에만 적용
.menu h1 {
  color: white;
  text-align: center;
}

// <div class = "menu"> 
//  <div class = "menu__list">
//  </div>
// </div>
// 에만 적용 가능, div태그가 아니어도 클래스 이름만 동일하면 적용!
.menu .menu__list {
  width: 100%;
  padding: 15px 0;
  border-width: 1px 0;
  border-style: solid;
  border-color: rgb(121, 121, 121);
}

// <div class = "menu"> 
//  <div class = "menu__list">
//   <div class = "item">
//   <div class = "item">
//  </div>
// </div>

//의 경우에서 모든 item에 적용
.menu .menu__list .item {
  font-size: 20px;
  font-weight: 600;
  color: white;
  margin-bottom: 15px;
  text-align: center;
}

// 마지막 item에만 적용
.menu .menu__list .item:last-child {
  margin-bottom: 0px;
}

 

3. 자바스크립트

 디자인을 만들었으니, 동작을 구현해줄 때가 왔습니다.

 

 코드는 다음과 같습니다.

 

 1. 먼저, css에서 .menu 부분의 left를 0px에서 -300px로 바꾸어주시기 바랍니다.

.menu {
  left: -300px;
}

 왜냐하면, 우리는 웹에 접속하고 커서를 끝으로 이동하고서 메뉴를 보기 원하지

 

접속하자마자 바로 메뉴를 보기 원하지 않기 때문입니다.

 

 2. 그리고 js코드를 다음과 같이 입력합니다.

const menu = document.getElementById("jsMenu");

// .menu의 css에서 left의 값을 -300으로 설정해줍니다.
function slideDown() {
  menu.style.left = "-300px";
}

// .menu의 css에서 left의 값을 0으로 설정해줍니다.
function slideUp() {
  menu.style.left = "0";
}

function handleMouseMove(event) {
// console.log(event)를 이용하여
// clientX 속성과 screenX 속성이 어떻게 다른지 파악하시는 것이 중요합니다.

  let clientX = event.clientX;
  
  // 커서가 0이상 10안에 있는 clientX 범위에 위치할 때
  if (clientX >= 0 && clientX <= 10) {
    slideUp();
  } else if (clientX > 310) {
    slideDown();
  }
}

function init() {
  document.addEventListener("mousemove", handleMouseMove);
}

init();