Managing daily tasks can be overwhelming, but what if you could build your own To-Do App?
In this beginner-friendly guide, we will walk through every step to create a fully functional To-Do App using HTML, CSS, and JavaScript.
What Youβll Learn:
- How to build a simple To-Do App UI
- Using JavaScript to add, view, complete, and delete tasks
- Storing tasks persistently using localStorage
- Writing clean HTML, CSS, and JavaScript code
- Organizing your project for scalability & maintainability
GitHub Repo: To-Do App
π Step 1: Project Setup
Before we start coding, let's set up our project structure.
-
Create a folder named
to-do-app - Inside this folder, create the following files:
to-do-app/
- index.html β Main HTML structure
- styles.css β Styles for the app
- script.js β JavaScript logic
- README.md β Documentation
Now, letβs start coding! π
π Step 2: Creating the HTML Structure
We need a basic UI for our app, with buttons for adding, viewing, completing, and deleting tasks.
π Create an index.html file and add this code:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Minimal To-Do App</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<h2>π To-Do App</h2>
<p>Manage your tasks easily.</p>
<div class="menu">
<button class="view" onclick="viewTasks()">π View Tasks</button>
<button class="add" onclick="addTask()">β Add Task</button>
<button class="complete" onclick="completeTask()">β
Complete Task</button>
<button class="delete" onclick="deleteTask()">β Delete Task</button>
<button class="exit" onclick="exitApp()">πͺ Exit</button>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
Understanding the Code
- Buttons call JavaScript functions to perform actions.
-
CSS is linked (
styles.css) for styling the app. -
JavaScript is linked (
script.js) to add functionality.
π¨ Step 3: Styling the App
Now, letβs make our app look clean and modern.
π Create a styles.css file and add this code:
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&display=swap');
body {
font-family: 'Inter', sans-serif;
background-color: #f4f4f9;
text-align: center;
margin: 0;
padding: 0;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
/* Centered App Container */
.container {
background: #ffffff;
padding: 25px;
border-radius: 12px;
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.1);
max-width: 400px;
width: 90%;
}
h2 {
color: #333;
}
p {
font-size: 14px;
color: #666;
}
/* Buttons */
button {
padding: 12px;
font-size: 16px;
border: none;
cursor: pointer;
width: 100%;
border-radius: 8px;
font-weight: 600;
outline: none;
transition: all 0.3s ease-in-out;
}
.view { background-color: #3498db; color: white; }
.add { background-color: #2ecc71; color: white; }
.complete { background-color: #f1c40f; color: black; }
.delete { background-color: #e74c3c; color: white; }
.exit { background-color: #95a5a6; color: white; }
button:hover {
opacity: 0.85;
transform: translateY(-2px);
}
Key Takeaways
-
Uses
Interfont for modern typography. - Adds hover effects on buttons.
- Applies a centered white card layout for a clean UI.
π Step 4: Adding JavaScript Logic
Now, let's add functionality to our To-Do App.
This guide explains the JavaScript logic used in the To-Do App. Each function plays an important role in managing tasks, storing them, and ensuring they persist even after refreshing the page.
The To-Do App allows users to:
- Add tasks via
prompt() - View tasks using
alert() - Mark tasks as completed
- Delete tasks
- Store tasks persistently using
localStorage
JavaScript is responsible for managing tasks, storing data, and handling user interactions.
Storing and Loading Tasks (localStorage)
Before working with tasks, they need to persist across browser sessions.
- When the app loads, it retrieves saved tasks from
localStorage, ensuring they don't disappear after a refresh. - If no tasks exist, an empty array is initialized.
-
localStorage.getItem("tasks")fetches saved tasks, andJSON.parse()converts the stored string back into an array. -
localStorage.setItem("tasks", JSON.stringify(tasks))updates the task list whenever a change is made.
Viewing Tasks (viewTasks())
This function displays all tasks in an alert box so users can see their to-do list.
- If the task list is empty, an alert notifies the user that no tasks exist.
- The function loops through all tasks and formats them:
- Completed tasks show a checkmark
[β]. - Pending tasks show an empty box
[ ].
- Completed tasks show a checkmark
- Finally, the formatted list is displayed in an alert box.
Key Concepts
- Loops (
forEach) iterate over the task list. - Ternary Operator (
? :) checks if a task is completed.
Adding a Task (addTask())
Users can add a new task to their list using this function.
- A
prompt()asks the user for task input. - The task is stored as an object with
{ text: "task name", completed: false }. - The task is pushed into the array and saved in
localStorageto ensure persistence.
Key Concepts
- User input is taken via
prompt(). - Objects store task details (text and completion status).
-
.push()method adds a new task to the array.
Marking a Task as Completed (completeTask())
Users can mark tasks as completed or undo completion.
- The task list is displayed.
- The user enters the task number they want to complete.
- The taskβs completion status is toggled (if incomplete, it becomes complete and vice versa).
- The updated list is saved in
localStorage.
Key Concepts
- Boolean toggling (
!variable) flipstruetofalseand vice versa. -
parseInt()converts user input into a number.
Deleting a Task (deleteTask())
Users can remove a task from their to-do list.
- The task list is displayed so users can see the task numbers.
- The user enters the task number they want to delete.
- The task is removed using
.splice(). - The updated task list is saved to
localStorage.
Key Concepts
-
.splice(index, 1)removes one item at the given index.
Saving Tasks (saveTasks())
Whenever the task list is updated (added, completed, or deleted), it needs to be saved.
- Converts the
tasksarray into a JSON string usingJSON.stringify(). - Saves it in
localStorageusingsetItem().
Key Concept
-
localStorageonly supports string data, so arrays and objects need conversion.
Exiting the App (exitApp())
This function simply displays a thank-you message when users exit the app.
Key Concept
- Uses
alert()to show a simple exit message.
Summary
By understanding this JavaScript code, you now know:
- How JavaScript manipulates and stores data
- How
localStoragekeeps data persistent - How user input is handled with
prompt() - How tasks are dynamically updated in an array
Now, you fully understand the To-Do Appβs JavaScript logic. Below is the full JavaScript code for reference:
π Create a script.js file and add:
// Load tasks from localStorage
let tasks = JSON.parse(localStorage.getItem("tasks")) || [];
// Function to display tasks
function viewTasks() {
if (tasks.length === 0) {
alert("No tasks yet. Add one!");
return;
}
let taskList = "Your To-Do List:\n";
tasks.forEach((task, index) => {
let status = task.completed ? "[β]" : "[ ]";
taskList += `${index + 1}. ${status} ${task.text}\n`;
});
alert(taskList);
}
// Function to add a task
function addTask() {
let taskText = prompt("Enter your task:");
if (taskText) {
tasks.push({ text: taskText, completed: false });
saveTasks();
alert("Task added successfully!");
}
}
// Function to mark a task as completed
function completeTask() {
viewTasks();
let taskNumber = parseInt(prompt("Enter task number to mark as completed:"));
if (!isNaN(taskNumber) && taskNumber > 0 && taskNumber <= tasks.length) {
tasks[taskNumber - 1].completed = !tasks[taskNumber - 1].completed;
saveTasks();
alert("Task updated!");
}
}
// Function to delete a task
function deleteTask() {
viewTasks();
let taskNumber = parseInt(prompt("Enter task number to delete:"));
if (!isNaN(taskNumber) && taskNumber > 0 && taskNumber <= tasks.length) {
tasks.splice(taskNumber - 1, 1);
saveTasks();
alert("Task deleted!");
}
}
// Function to save tasks to localStorage
function saveTasks() {
localStorage.setItem("tasks", JSON.stringify(tasks));
}
π― Summary
By completing this guide, you now have:
- A working To-Do App
- Basic JavaScript skills
- LocalStorage implementation
- A clean, responsive UI
π Try it out, experiment, and enhance your skills! π

Top comments (0)