프로젝트/개인프로젝트

Todo_List 만들기.

후누피 2023. 12. 5. 13:50
728x90
코테를 처음 보러갔는데, 알고리즘 문제가 나올 줄 알았는데,
TodoList만들기 문제가나와, html,css만 작성하고 js를 작성하지못하고 시간을 다 써버렸다.

부족한 점이 많은 것 같아 한번 혼자 TodoList를 만들어보기로 했다.

🔎  완성

 

 

🔎  구현 기능

  • input창에 입력 후 +버튼을 클릭하면 할일이 추가됨.
  • 삭제 버튼 클릭시 해당 목록 삭제
  • 할일 완료 클릭 시 해당 목록 줄 긋기
  • 입력창에 아무것도 입력안하고 +버튼 클릭시 alert창으로 경고창

 

 

🔎  구현 방법

 

- 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="index.css" />
  </head>
  <body>
    <div class="head_tit">TodoList</div>
    <div class="Wrapper">
      <div class="input_F">
        <input type="text" id="addValue" placeholder="내용을 입력하세요" />
        <button id="add_btn" onclick="addTodo()">+</button>
      </div>
      <div id="result"></div>
    </div>
    <script src="index.js"></script>
  </body>
</html>

 

1. <head>태그에 <link>태그를 사용하여 css파일을 연결해준다.

2. <body>태그에 크게 두개의 div영역으로 나눈다. 첫번째는 타이틀 제목, 두번째는 입력창,버튼,결과물이보여질 영역이 포함되어있다.

 

3. Wrapper 태그안에서 input_F 영역과 result영역 두가지로 나눈다.

4. input_F영역에서 인풋창에 입력 후 버튼을 클릭했을 때 onclick="addTodo()" 설정을하여, addTodo함수가 실행되도록 해준다.

 

5. addTodo함수가 최종적으로 실행되고 result 영역에 추가되도록 설정하여 result에는 추가된 할일들이 자리잡게 된다.

 

6.마지막에 script태그를 통해 index.js와 연결하여, 함수들이 실행될수 있도록 설정해준다.

 

 

-CSS-

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
body {
  height: 100vh;
  width: 100%;
  /*linear-gradient : 그라데이션주기*/
  background: linear-gradient(to bottom, #e6e6fa 0%, #fff0f5);
}

.head_tit {
  text-align: center;
  font-family: "Courier New", Courier, monospace;
  font-weight: bold;
  font-size: 30px;
  margin-top: 50px;
}

.Wrapper {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  .input_F {
    height: 40px;
    margin-top: 10px;
    #addValue {
      outline: none;
      width: 400px;
      height: 100%;
    }
    #add_btn {
      font-size: 20px;
      font-weight: bold;
      border: none;
      margin-left: 10px;
      cursor: pointer;
    }
  }
  #result {
    width: 400px;
    margin-top: 20px;
    > div {
      margin-top: 10px;
      height: 40px;
      width: 100%;
      background-color: beige;
    }
  }
}

 

 

1. box-sizing : border-box;를 설정하여 padding이나 border 등 테두리,여백등을 지정한사이즈에 포함시켜 설정해준다.

 

ex) width:100px , height: 100px  , padding:20px , border : 10px solid black;

 = 기본 설정일때 : width: 100px + 20px + 10px. = 130px. height: 100px + 20px + 10px = 130px

 = box-sizing : border-box일때 :  width : 100px height: 100px;

 

2. background :liner-gradient ( to-bottom , #e6e6fa 0% , #fff0f5);

배경색을 그라데이션 효과를 주는것이다.

 1) to-bottom 그라데이션 방향설정.

2) #e6e6fa는 시작위치의 색상 설정.

3)0% 그라디언트 효과의 시작점을 설정

4) #fff0f5 끝 위치의 색상 설정

 

3.outline:none 인풋창을 클릭 했을 시 인풋창 테두리가 굵게 변하지않게 설정해준다.

 

4. #result 안에 >div 태그에 대한 css설정은 , addTodo()함수를 통해 추가된 div(즉 입력을 통해 추가 될 할일 리스트)의 css를 설정해 준 부분이다.

 

 

-JS-

 

let addValue = document.getElementById("addValue");
let result = document.getElementById("result");
function addTodo() {
  if (addValue.value == "") {
    alert("입력된 내용이 없습니다.");
  } else {
    let newDiv = document.createElement("div");
    let newSpan = document.createElement("span");
    let delete_btn = document.createElement("button");
    newSpan.innerHTML = addValue.value;
    newDiv.appendChild(newSpan);
    newDiv.appendChild(delete_btn);
    result.appendChild(newDiv);
    newDiv.style.alignItems = "center";
    delete_btn.textContent = "X";
    delete_btn.style.border = "none";
    delete_btn.style.float = "right";
    delete_btn.style.fontSize = "20px";
    delete_btn.style.backgroundColor = "beige";
    delete_btn.addEventListener("click", delete_content);
    newDiv.addEventListener("click", function () {
      newDiv.style.textDecoration = "line-through";
      newDiv.style.color = "gray";
    });
    addValue.value = "";
    addValue.focus();
  }
}

function delete_content(e) {
  let remove_One = e.target.parentElement;
  remove_One.remove();
}

 

1. 맨 위 상단에 addValue(입력창) , result(입력한 할일이 추가될 영역)을 선언해준다.

2.addTodo()

  1) if문을 통해 입력창에 값이 없을경우 alter창으로 경고문을 나타내준다.

  2) 값이 있을 경우 else문이 실행되고

      newDiv(추가된 할일의 영역), newSpan(추가된 할일의 내용) , delete_btn(추가된 할일 삭제버튼)을 선언해준다.

  3) newSpan에 innerHTML을 통해 addValue.value 즉 입력값을 넣어준다.

  4) newDiv.appendChild(newSpan)을 통해 newDiv에 newSpan을 자식태그로 넣어준다.

  5) newDiv.appendChild(delete_btn) 마찬가지로, newDiv에 delete_btn을 자식태그로 넣어준다.

  6) result.appendChild(newDiv) 마지막으로, 새로추가된 할일을 result 결과영역에 자식태그로 추가시켜준다.

 
  <div id="result"> 
    <newDiv>
       <newSpan>입력값</newSpan>
       <delete_btn/>
    </newDiv>
  </div>

이렇게 확인하면 더 쉽게 이해가될것같다.

7) 그리고 delete_btn.style.~~~ 을 통해 삭제버튼에 대한 style을 설정해준다.

8) deltebtn_addEventListener("click", delete_content); 를 통해

    deletebtn 버튼을 클릭 시 dete_content함수를 실행하도록 설정해준다.

9 ) newDiv.addEventListener("click" , function() { 실행내용}

 을 통해 추가된 할일 목록을 클릭시에 글씨 중앙을 통과하는 가로선과 색상변경설정을 해준다.

10 ) delte_content함수를 만들어 8번에 delete_btn을 클릭했을 시 함수내용을 정의해준다.

이때 e는 매개변수로, e.target은 delete_btn을 가르키고
e.target.parentElement는 delete_btn의 부모태그 즉 newDiv를 가르킨다.
따라서 let remove_One = newDiv가 되고
remove_One.remove();는 newDiv를 삭제하게되어
delete_content()함수는 newDiv를 삭제하는 함수이다.

여기서, newDiv는 입력창을 통해 입력된 할일 목록이다.

 

🔎  결론

구글링을 통해 
참고 블로그 이 분의 글을 많이 참고하여 만들게되었다.
코딩테스트를 보러가서, html,css부분만 건드리지 못해 아쉬웠는데
만들기 전에는 난감하고 어려웠는데, 막상 만들어보고 글을쓰면서 정리해보니
해볼만(?) 하다고 생각이 들었다.

다음에는 여기서 더 추가로 기능을 보완하는 방향으로 진행해봐야겠다.

 

JavaScript를 이용한 TodoList만들기

아직 다른 다양한 프레임워크는 접하지 못해서 지금까지 배운 javascript,html,css를 이용해서 두 번째로 무엇을 만들어볼까 고민하던 중 간단한 todolist를 골랐고, 이 언어들이 익숙해 지도록 이것 저

velog.io

 

💁🏻 완성코드

728x90