11. Мини-проект: To-Do список
Что будем создавать
To-Do список — это простое, но полезное приложение, в котором можно добавлять, удалять и отмечать выполненные задачи. Все данные сохраняются прямо в браузере с помощью localStorage.Этот мини-проект покажет, как JavaScript, HTML и CSS работают вместе. После этого вы сможете создавать свои собственные интерактивные приложения!
Шаг 1. Создаём структуру HTML
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>To-Do List</title>
<style>
body { font-family: Arial, sans-serif; background: #f7f7f7; padding: 30px; }
h1 { text-align: center; }
.todo-container { max-width: 400px; margin: 0 auto; background: #fff; padding: 20px; border-radius: 10px; box-shadow: 0 2px 6px rgba(0,0,0,0.1); }
input, button { padding: 10px; border: none; border-radius: 5px; }
input { width: 70%; border: 1px solid #ccc; }
button { background: #28a745; color: white; cursor: pointer; }
ul { list-style: none; padding: 0; margin-top: 20px; }
li { display: flex; justify-content: space-between; padding: 8px; border-bottom: 1px solid #eee; }
li.done { text-decoration: line-through; color: gray; }
.delete { color: red; cursor: pointer; margin-left: 10px; }
</style>
</head>
<body>
<div class="todo-container">
<h1>📋 Мой To-Do список</h1>
<input id="taskInput" placeholder="Введите задачу">
<button id="addBtn">Добавить</button>
<ul id="taskList"></ul>
</div>
<script src="app.js"></script>
</body>
</html>
Шаг 2. Подключаем JavaScript
Создайте файл app.js рядом с HTML-страницей.
let input = document.querySelector('#taskInput');
let addBtn = document.querySelector('#addBtn');
let taskList = document.querySelector('#taskList');let tasks = JSON.parse(localStorage.getItem('tasks')) || [];
function renderTasks() {
taskList.innerHTML = '';
tasks.forEach((task, index) => {
let li = document.createElement('li');
li.textContent = task.text;
if (task.done) li.classList.add('done');
li.addEventListener('click', () => {
task.done = !task.done;
saveTasks();
});
let del = document.createElement('span');
del.textContent = '✖';
del.classList.add('delete');
del.addEventListener('click', (e) => {
e.stopPropagation();
tasks.splice(index, 1);
saveTasks();
});
li.appendChild(del);
taskList.appendChild(li);
});
}
function saveTasks() {
localStorage.setItem('tasks', JSON.stringify(tasks));
renderTasks();
}
addBtn.addEventListener('click', () => {
let text = input.value.trim();
if (text === '') return alert('Введите задачу!');
tasks.push({ text: text, done: false });
input.value = '';
saveTasks();
});
renderTasks();
Шаг 3. Как это работает
- Все задачи сохраняются в localStorage, поэтому они остаются даже после перезагрузки страницы.
- При каждом клике на задачу она отмечается как выполненная.
- Можно удалить задачу, нажав на крестик.
Пояснение к коду
- tasks — массив, где хранятся все задачи.
- renderTasks() — отрисовывает задачи из массива на страницу.
- saveTasks() — сохраняет данные в localStorage и вызывает обновление интерфейса.
- addBtn.addEventListener('click') — добавляет новую задачу при клике на кнопку.
Шаг 4. Добавим немного магии ✨
Чтобы приложение выглядело современно, добавим небольшие эффекты и стили.
li { transition: all 0.3s ease; }
li:hover { background: #f0f8ff; }
button:hover { background: #218838; }
.delete:hover { transform: scale(1.2); }
Теперь при наведении элементы будут плавно подсвечиваться.
Шаг 5. Идеи для улучшения
- Добавить фильтр: показывать все / выполненные / невыполненные задачи.
- Добавить дату и время добавления задачи.
- Сделать возможность редактировать задачу.
- Подключить Bootstrap или Tailwind для современного дизайна.
Мини-практика
- Создай кнопку «Очистить всё» для удаления всех задач.
- Добавь автоматическую нумерацию задач.
- Измени фон на тёмный режим при помощи переключателя (используй localStorage для запоминания темы).
Пример функции очистки
let clearBtn = document.createElement('button');
clearBtn.textContent = 'Очистить всё';
clearBtn.style.marginTop = '10px';
clearBtn.addEventListener('click', () => {
if (confirm('Удалить все задачи?')) {
tasks = [];
saveTasks();
}
});
document.querySelector('.todo-container').appendChild(clearBtn);
Советы новичкам
- Не бойтесь экспериментировать: добавляйте кнопки, эффекты, фильтры.
- Следите за чистотой кода: разделяйте логику и визуальную часть.
- localStorage — отличное решение для простых офлайн-приложений.
- Сохраняйте промежуточные версии проекта — это поможет отследить ошибки.
Итоги урока
Теперь вы умеете:- Работать с DOM и событиями.
- Сохранять данные в localStorage.
- Создавать простые интерактивные приложения.
- Добавлять визуальные эффекты и улучшения.
Поздравляем! Вы создали свой первый полноценный проект на JavaScript — To-Do список! Теперь вы можете улучшать его, как захотите — это ваш первый шаг к созданию настоящих веб-приложений.