코드

html, javascript

<!DOCTYPE html>
<html lang="en">
  <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" />
    <title>체크리스트</title>

    <link rel="stylesheet" href="css/체크리스트.css" />
  </head>

  <body>
    <div id="wrapper">
      <h2>여행준비물 점검목록</h2>
      <form>
        <!-- <input hidden="hidden" /> -->
        <input type="text" id="item" autofocus />
        <button type="button" id="add" class="addBtn">추가</button>
        <button type="button" id="remove_all" class="addBtn">전체삭제</button>
      </form>
      <div id="item_list"></div>
    </div>

    <script>
      // 아이템들을 담을 아이템 리스트
      let itemList = [];
      // 아이템 중복확인 위한 변수
      let dupl;
      // 추가 버튼에 대한 이벤트
      let addBtn = document.querySelector("#add");
      addBtn.addEventListener("click", addList);
      // 전체삭제 버튼에 대한 이벤트
      let removeAllBtn = document.querySelector("#remove_all");
      removeAllBtn.addEventListener("click", removeList);

      // 엔터 입력시 이벤트 발생
      document
        .querySelector("#item")
        .addEventListener("keypress", function (e) {
          if (e.keyCode === 13) {
            e.preventDefault();
            addList();
          }
        });

      // 아이템 추가 메서드
      function addList() {
        // 아이템 값 담음
        let item = document.querySelector("#item").value;
        // console.log(item);

        // 중복체크 실행
        checkDupl(item);

        // 조건을 확인하고 아이템 리스트에 푸시
        if (item != "" && dupl) {
          itemList.push(item);
          // console.log(itemList);

          // 아이템 input 창 초기화
          document.querySelector("#item").value = "";
          document.querySelector("#item").focus();

          // 아이템 리스트 출력
          showList();
        }
      }

      // 중복확인 메서드
      function checkDupl(item) {
        // 입력한 아이템이 아이템 리스트에 있는지 확인
        if (itemList.includes(item)) {
          alert("이미 담은 준비물입니다.");
          document.querySelector("#item").value = "";
          document.querySelector("#item").focus();
          dupl = false;
        } else {
          dupl = true;
        }
      }

      // 아이템리스트 출력 메서드 (테이블)
      function showList() {
        // 아이템 리스트를 for 문을 돌면서 테이블 태그로 생성
        let list = "<table>";
        for (let i = 0; i < itemList.length; i++) {
          list += `<tr>
            <td class="i">${itemList[i]}</td>
            <td class="x" id="${i}">X</td>
            </tr>`;
        }
        list += "</table>";

        // 테이블 태그 출력
        document.querySelector("#item_list").innerHTML = list;

        // 아이템 리스트에서 삭제를 위한 X 태그들을 담음
        let xMarks = document.querySelectorAll(".x");
        for (let i = 0; i < xMarks.length; i++) {
          // 여러 개 xMarks 중 유저가 xMark 를 선택하면 해당 xMark 에서 삭제 이벤트 발생
          xMarks[i].addEventListener("click", removeOne);
        }
      }

      // xMark 누르면 삭제 메서드
      function removeOne() {
        // getAttribute() -> 파라미터에 해당하는 속성을 가져옴
        // this -> xMarks[i] 에서 선택되는 아이
        let id = this.getAttribute("id");
        // itemList 에서 해당 id 의 품목 삭제
        itemList.splice(id, 1);
        showList();
      }

      // 전체 삭제 메서드
      function removeList() {
        // 아이템 리스트 전체 삭제
        itemList.splice(0, itemList.length);
        showList();
      }
    </script>
  </body>
</html>

 

css

@font-face {
  font-family: bm;
  src: url(../font/bamin/BMJUA_ttf.ttf);
}

* {
  box-sizing: border-box;
  font-family: bm;
}

#wrapper {
  width: 60%;
  margin: 0 auto;
}

h2 {
  text-align: center;
}

form {
  background-color: #007acc;
  padding: 30px 40px;
  text-align: center;
}

input {
  border: none;
  width: 350px;
  padding: 10px;
  font-size: 16px;
}

.addBtn {
  padding: 10px;
  width: 70px;
  border: none;
  background-color: #fff;
  box-shadow: 1px 2px 4px #167dae;
  color: #222;
  text-align: center;
  font-size: 14px;
  cursor: pointer;
  margin-left: 10px;
}

.addBtn:hover {
  background-color: black;
  color: white;
}

/* ul li 로 아이템 리스트 작업 */
ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

ul li {
  cursor: pointer;
  position: relative;
  padding: 12px 8px 12px 40px;
  background-color: #eee;
  font-size: 18px;
}

ul li:nth-child(odd) {
  background-color: #f9f9f9;
}

ul li:hover {
  background-color: #ddd;
}

.close {
  position: absolute;
  right: 0;
  top: 0;
  padding: 12px 16px;
}

.close:hover {
  background-color: #007acc;
  color: white;
}
/* ul li 로 아이템 리스트 작업 끝 */

/* table 로 아이템 리스트 작업 */
table {
  border-collapse: collapse;
  /* border: 1px solid #000; */
  width: 100%;
  font-size: 25px;
  background-color: #f9f9f9;
}

/* q - 이거 왜 따로 해야되지? */
tr:hover {
  background-color: black;
  color: white;
}

tr:nth-child(2n + 1) {
  background-color: #e9e9e9;
}

tr:nth-child(2n + 1):hover {
  background-color: black;
}

.i {
  width: 95%;
  padding-left: 10px;
}

.x:hover {
  background-color: #007acc;
  color: white;
}

.x {
  text-align: center;
  cursor: pointer;
  padding-top: 15px;
}
/* table 로 아이템 리스트 작업 끝 */

 

실행화면

 

 

 

- Just Do It -

 

반응형
복사했습니다!