Neste tutorial vamos aprender a desenvolver um todo-list em html, css e javascript

Codigo-de-Estudante


index.html

<!DOCTYPE html>

<html lang="en" >

<head>

<meta charset="UTF-8">

<title> Todo List</title>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css">

<link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Nunito:600,700&amp;display=swap'>

<link rel='stylesheet' href='https://use.fontawesome.com/releases/v5.7.2/css/all.css'>

   <link rel="stylesheet" href="style.css" />

</head>


<div class="todoList">

  <div class="cover-img">

    <div class="cover-inner">

      <h3>Todo List</h3>

    </div>

  </div>

  <div class="content">

    <form class="add">

      <input type="text" name="add" placeholder="Add item...">

      <div class="input-buttons">

        <a href="#0" class="add-todo">

          <i class="fas fa-plus add"></i>

        </a>

      </div>

    </form>

    <ul class="todos">

      <li>

        <input type="checkbox" id="todo_1">

        <label for="todo_1">

          <span class="check"></span>

          Fazer compras

        </label>

        <i class="far fa-trash-alt delete"></i>

      </li>

      <li>

        <input type="checkbox" id="todo_2">

        <label for="todo_2">

          <span class="check"></span>

          Encontrar pessoas

        </label>

        <i class="far fa-trash-alt delete"></i>

      </li>

      <li>

        <input type="checkbox" id="todo_3">

        <label for="todo_3">

          <span class="check"></span>

          Procure lugares para ir

        </label>

        <i class="far fa-trash-alt delete"></i>

      </li>

      <li>

        <input type="checkbox" id="todo_4">

        <label for="todo_4">

          <span class="check"></span>

          Faça uma viagem

        </label>

        <i class="far fa-trash-alt delete"></i>

      </li>

    </ul>

  </div>

</div>

<script src="script.js"></script>

</body>

</html>

style.css

*, *::before, *::after {

  box-sizing: border-box;

  margin: 0;

}

body {

  min-height: 450px;

  height: 100vh;

  margin: 0;

 background: url('https://i.postimg.cc/9M4h8Bjc/imagem.jpg');

  color: #fff;

  font-family: 'Nunito', serif;

}

button, input, select, textarea {

  font-family: inherit;

  font-size: inherit;

  line-height: inherit;

}

.todoList {

  position: absolute;

  top: 50%;

  left: 50%;

  transform: translate(-50%, -50%);

  width: 320px;

  height: 500px;

  background: #fff;

  border-radius: 10px;

  box-shadow: 0 7px 30px rgba(62, 9, 11, .3);

}

.cover-img .cover-inner {

 background: url('https://i.postimg.cc/9M4h8Bjc/imagem.jpg');

  height: 190px;

  background-size: cover;

  background-position: 10% 20%;

  border-top-left-radius: 10px;

  border-top-right-radius: 10px;

  position: relative;

}

.cover-img .cover-inner::after {

  background: rgba(0, 0, 0, .3);

  content: '';

  top: 0;

  left: 0;

  position: absolute;

  width: 100%;

  height: 100%;

  border-top-left-radius: 10px;

  border-top-right-radius: 10px;

}

.cover-img h3 {

  position: absolute;

  top: 50%;

  left: 50%;

  transform: translate(-50%, -50%);

  font-family: 'Nunito', sans-serif;

  text-transform: uppercase;

  font-size: 2.8rem;

  z-index: 10;

  font-weight: 700;

}

.content {

  padding: 10px 20px;

}

.content form {

  display: flex;

  justify-content: space-between;

  margin-bottom: 15px;

  padding: 0 10px 0 5px;

  border-bottom: 1px solid #8e979c;

}

.content form > * {

  background: transparent;

  border: none;

  height: 35px;

}

.content input[type='text'] {

  padding: 0 5px;

  font-weight: 700;

  font-size: 1.2rem;

  color: #6c717b;

  outline: none;

}

.content .input-buttons a{

  text-decoration: none;

}

.content .input-buttons i {

  margin-top: 5px;

  font-size: 20px;

  color: #8e979c;

}

.content ul.todos {

  margin-left: 0;

  padding: 0;

  letter-spacing: none;

  height: 220px;

  overflow: auto;

}

.content li {

  user-select: none;

  margin-bottom: 10px;

  display: flex;

  justify-content: space-between;

}

.content li i {

  color: #6c717b;

  font-size: 15px;

  cursor: pointer;

  padding: 5px 10px;

}

.content input[type="checkbox"] {

  display: none;

}

.content input[type="checkbox"] + label {

  color: #6c717b;

  font-size: 15px;

  cursor: pointer;

  position: relative;

  border-radius: 3px;

  display: inline-block;

  padding: 5px 5px 5px 30px;

}

.content input[type="checkbox"] + label:hover {

  color: #353a42;

  background-color: #f4f7fa;

}

.content input[type="checkbox"] + label span.check {

  left: 4px;

  top: 50%;

  position: absolute;

  transform: translatey(-50%);

  width: 18px;

  height: 18px;

  display: block;

  background: white;

  border-radius: 3px;

  border: 1px solid #b8bfcc;

  box-shadow: 0 2px 3px #f0f4f8;

}

.content input[type="checkbox"]:checked + label {

  color: #aeb7c6;

  text-decoration: line-through;

}

.content input[type="checkbox"]:checked + label span.check {

  background-color: transparent;

  border-color: transparent;

  box-shadow: none;

}

.content input[type="checkbox"] + label span.check::after {

  width: 100%;

  height: 100%;

  content: '';

  display: block;

  position: absolute;

  background-image: url('tick.svg');

  background-repeat: no-repeat;

  background-position: center;

  background-size: 16px 16px;

  transform: scale(0);

  transition: transform 300ms cubic-bezier(.3, 0, 0, 1.5);

}

.content input[type="checkbox"]:checked + label span.check::after {

  transform: scale(1);

}

.content input[type="checkbox"] + label span.check::before {

  top: 0;

  left: 0;

  width: 100%;

  height: 100%;

  display: block;

  content: '';

  position: absolute;

  border-radius: 50%;

  background: #8798aa;

  opacity: .8;

  transform: scale(0);

}

.content input[type="checkbox"]:checked + label span.check::before {

  opacity: 0;

  transform: scale(1.3);

  transition: opacity 300ms cubic-bezier(0.2, 0, 0, 1), transform 400ms cubic-bezier(0.3, 0, 0, 1.4);

}

script.js

const submitForm = document.querySelector('.add');

const addButton = document.querySelector('.add-todo');

const todoList = document.querySelector('.todos');

const list = document.querySelectorAll('.todos li'); 

let listLenght = list.lenght;

const generateTempalate = (todo) => {

   const html = `<li>

                  <input type="checkbox" id="todo_${listLenght}">

                  <label for="todo_${listLenght}">

                    <span class="check"></span>

                    ${todo}

                  </label>

                  <i class="far fa-trash-alt delete"></i>

                </li>`

  todoList.innerHTML += html;

};


function addTodos(e) {

  e.preventDefault();

  const todo = submitForm.add.value.trim();

  if (todo.length) {

    listLenght = listLenght + 1;

    generateTempalate(todo);

    submitForm.reset();

  }

}

submitForm.addEventListener('submit', addTodos);

addButton.addEventListener('click', addTodos);

function deleteTodos(e) {

  if (e.target.classList.contains('delete')) {

    e.target.parentElement.remove();

  }

}

todoList.addEventListener('click', deleteTodos);