곰돌이의 자취를 느낄 수 있는 todo list!
리스트를 추가할때마다 곰돌이가 발자국을 남기며 내려가는 투두리스트를 만들어보았다!
사실 원래 목표는 여러 리스트 박스를 추가할 수 있는 페이지를 만드는 것이었다.
하지만.. ㅠㅠ
새로 생성된 리스트가 기능을 하지 못했고.. 어떻게 구현해야할지 해결책을 찾지 못했다..
결국 새로 생성하기보다는 하나의 리스트에 만족하기로 하며 페이지를 마무리해보았다
-> 이것도 미래의 내가 구현해주겠지 ㅎ_ㅎ
//set the title of list
const addform = document.querySelector('.title-form');
addform.addEventListener('submit', function(e) {
e.preventDefault();
const title = addform.elements.title.value;
const todoBox = document.querySelector('.todo-box');
const todoCont = document.querySelector('.todo-cont');
const colorBtn = document.querySelector('.col');
addtitle(title);
todoBox.classList.remove('init');
todoCont.classList.remove('init');
colorBtn.classList.remove('init');
addform.elements.title.value = ''
})
const addtitle = (title) => {
const titleInList = document.querySelector('p.goal');
const newTitle = document.createElement('span');
newTitle.append(title);
titleInList.innerText = newTitle.innerText;
}
addtitle
이라는 함수로, input값을 span안에 담아서 list안의 title의 텍스트로 교체해주었다..
을 생략해야한다! classList에서 삭제할 아이를 알려주는 것이니까 그냥 class name만 입력하는 건가보다..? // creating lists
const listform = document.querySelector('.list-form');
listform.addEventListener('submit', function(e) {
//next page로 가지 않게 멈추기 : stop default behavior
e.preventDefault();
//입력 값을 todo로 선언
const todo = listform.elements.todos.value;
//addlist 실행
addList(todo);
//입력값 초기화
listform.elements.todos.value = '';
});
const addList = (todo) => {
//li 안에 입력 값을 넣고, 이미 존재하는 ul에 집어넣기
const newTodo = document.createElement('li');
const todoLists = document.querySelector('ul.todo-lists');
newTodo.append(todo);
todoLists.appendChild(newTodo);
}
append와 appendChild의 차이
const addList = (todo) => {
const newTodo = document.createElement('li');
const todoLists = document.querySelector('ul.todo-lists');
newTodo.append(todo);
todoLists.appendChild(newTodo);
//done and delete
newTodo.addEventListener('click', ()=>{
newTodo.classList.toggle('done')
})
newTodo.addEventListener('dblclick', ()=>{
newTodo.classList.toggle('init')
})
}
done
(:밑줄 추가)과init
(:display none) class를 부여했다.//changing the colors
const paper = document.querySelector('.todo-box');
const btnY = document.querySelector('.yellow');
const btnB = document.querySelector('.blue');
const btnG = document.querySelector('.green');
btnY.addEventListener('click',() =>{
paper.setAttribute("style", "background-color: #ffe268;");
})
btnB.addEventListener('click',() =>{
paper.setAttribute("style", "background-color: #a7c5eb;");
})
btnG.addEventListener('click',() =>{
paper.setAttribute("style", "background-color: #99bbad;");
})
//date in todos
const todosDate = document.querySelector('p.date');
function getTime () {
const dayArr = ['SUN','MON','TUE','WED','THU','FRI','SAT']
let crrDate = new Date();
let month = crrDate.getMonth() + 1;
let date = crrDate.getDate();
let day = dayArr[crrDate.getDay()];
todosDate.innerText = `${month <10? `0${month}` : month
}.${date<10? `0${date}` : date
}.${day}`;
}
getTime();
-> 복습하는 느낌으로 색상 변경하는 기능을 추가하고, 자동으로 현재 날짜가 기록되도록 만들어보았다.
-> 이때 .style.backgroundColor
로는 설정이 안 먹혔는데 이유를 모르겠다.
-> setAttribute / style / getComputedStyle 차이 찾아보기!
-> 가상 선택자를 처음써보았는데 이미지나 이모티콘을 추가할 수 있다는 것을 알게되었다! (nth-last-child로 발자국을 남기는 것 처럼 표현해보았다.)
-> 추가로! list marker는 포지션을 inside로 지정하지 않으면 영역에 포함되지 않으므로 주의하자!!