Learn How to Create a “to-do list” with CSS and JavaScript

In this tutorial, we will guide you through the step-by-step process of creating a functional to-do list using the power of CSS and JavaScript. To-do lists are essential tools for keeping track of tasks and maintaining productivity. By the end of this tutorial, you’ll have a fully interactive and stylish to-do list that you can customize to suit your preferences.


To-do lists are indispensable tools for managing your tasks efficiently. In this tutorial, we will combine the power of CSS for styling and JavaScript for interactivity to create a visually appealing and functional to-do list.

Setting Up the HTML Structure

We’ll start by creating the basic HTML structure of our to-do list. This structure will serve as the foundation for our styling and interactivity.

<!DOCTYPE html>
<html lang="en">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="styles.css">
    <title>To-Do List</title>
    <div class="container">
        <h1>To-Do List</h1>
        <input type="text" id="taskInput" placeholder="Add a new task...">
        <ul id="taskList">
            <!-- To-do items will be added here -->
    <script src="script.js"></script>

Applying Stylish CSS

Now, let’s make our to-do list visually appealing using CSS. We’ll style various elements to create a clean and modern design.

/* styles.css */
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    margin: 0;
    padding: 0;

.container {
    max-width: 400px;
    margin: 0 auto;
    padding: 20px;
    background-color: #fff;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    border-radius: 5px;

h1 {
    text-align: center;

input[type="text"] {
    width: 100%;
    padding: 10px;
    border: 1px solid #ccc;
    border-radius: 3px;
    margin-bottom: 10px;

ul {
    list-style-type: none;
    padding: 0;

li {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 10px;
    border-bottom: 1px solid #ccc;

.delete-btn {
    background-color: #ff6347;
    color: white;
    border: none;
    padding: 5px 10px;
    border-radius: 3px;
    cursor: pointer;

Adding Dynamic Interactions with JavaScript

Our to-do list becomes truly powerful when we introduce JavaScript for dynamic interactions. Let’s implement functionalities for adding tasks, marking tasks as completed, and deleting tasks.

Listening for the “Enter” Key

// script.js
const taskInput = document.getElementById('taskInput');
const taskList = document.getElementById('taskList');

taskInput.addEventListener('keydown', function(event) {
    if (event.key === 'Enter' && taskInput.value.trim() !== '') {
        // Add task logic

Adding Tasks to the List

// Inside the "Enter" key event listener
function addTask(taskText) {
    const listItem = document.createElement('li');
    listItem.innerHTML = `
        <button class="delete-btn">Delete</button>

Marking Tasks as Completed

// Inside the "addTask" function
listItem.addEventListener('click', function() {

Deleting Tasks

// Inside the "addTask" function
const deleteButton = listItem.querySelector('.delete-btn');
deleteButton.addEventListener('click', function() {

Best Practices for Clean Code

As you proceed with your to-do list project, remember these best practices:

  • Semantic HTML: Use semantic HTML elements to create a clear structure that aids accessibility and SEO.
  • Modular CSS: Organize your CSS code into manageable sections and use external stylesheets to keep your HTML clean.
  • Efficient JavaScript: Utilize event delegation to optimize performance when dealing with dynamic elements.

Troubleshooting Common Issues

If you encounter challenges during the development process, consider these solutions:

  • Tasks Not Adding: Check your event listeners to ensure they are correctly targeting the relevant elements and using appropriate events.
  • Styles Not Applying: Verify your CSS classes and IDs to ensure they match the elements in your HTML.
  • Interactivity Issues: Double-check event listeners and their associated functions for any typos or logical errors.


Congratulations! You’ve now created a feature-rich to-do list using CSS and JavaScript. By following this tutorial, you’ve gained insights into structuring HTML, styling with CSS, and adding dynamic interactivity with JavaScript. Remember, this is just the beginning – you can further enhance your to-do list with additional features and explore advanced coding techniques. Keep practicing, and happy coding!


Why do I need to use JavaScript for a to-do list?

While HTML and CSS handle the structure and presentation, JavaScript adds interactivity. It allows you to dynamically add tasks, mark them as completed, and remove them. This dynamic behavior significantly improves the user experience of your to-do list.

How can I customize the styling of my to-do list?

You can customize the styling by modifying the CSS properties in the styles.css file. Change colors, fonts, margins, and more to match your preferred design. Experiment with various styles to create a to-do list that suits your taste and the overall theme of your project.

What’s the purpose of event delegation in JavaScript?

Event delegation is a technique where you attach a single event listener to a common parent element of multiple dynamically generated child elements. This optimizes performance by reducing the number of event listeners and is useful for managing events on elements that may be added or removed dynamically, such as tasks in the to-do list.

How can I persist my to-do list across page reloads?

To persist data across page reloads, you can use browser storage mechanisms like localStorage or sessionStorage. These APIs allow you to store data locally in the user’s browser. When the page is loaded again, you can retrieve the stored data and populate your to-do list accordingly.

What are some advanced features I can add to my to-do list?

Once you’ve mastered the basics, you can explore more advanced features like:
Adding due dates and priorities to tasks.
Categorizing tasks into different sections.
Creating multiple to-do lists with different themes.
Implementing drag-and-drop functionality for reordering tasks.
Syncing your to-do list with a backend server for real-time collaboration.

Leave a Comment