JavaScript

How To Build Notes App Using HTML CSS and JavaScript

How To Build Notes App Using HTML CSS and JavaScript

I’ll walk you through a simple yet functional Note-Making App I created using HTML, CSS, and JavaScript. I’ll also enhance the project with some practical features that make it more user-friendly and useful. If you’re someone who enjoys organizing your tasks, this app is a perfect fit. Let’s dive into the code and the enhancements step-by-step.

Project Overview

This Note-Making App allows users to create, save, and delete notes. To make the app more robust, I’ve added features like:

  • Search functionality to quickly find specific notes
  • Ability to edit existing notes
  • Saving notes to local storage for persistence

Here’s the complete code with all the features implemented:

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Note-Making App</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="app-container">
        <h1>Note-Making App</h1>
        <div class="input-container">
            <textarea id="note-input" placeholder="Write your note here..."></textarea>
            <button id="add-note">Add Note</button>
        </div>
        <div class="search-container">
            <input type="text" id="search-notes" placeholder="Search notes...">
        </div>
        <div id="notes-container"></div>
    </div>
    <script src="script.js"></script>
</body>
</html>

CSS

body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f9;
    margin: 0;
    padding: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}

.app-container {
    width: 90%;
    max-width: 600px;
    background: white;
    border-radius: 8px;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    padding: 20px;
}

h1 {
    text-align: center;
}

.input-container {
    display: flex;
    flex-direction: column;
}

textarea {
    width: 100%;
    height: 100px;
    margin-bottom: 10px;
    padding: 10px;
    border-radius: 5px;
    border: 1px solid #ddd;
    font-size: 16px;
    resize: none;
}

button {
    background-color: #007bff;
    color: white;
    border: none;
    padding: 10px 20px;
    font-size: 16px;
    border-radius: 5px;
    cursor: pointer;
}

button:hover {
    background-color: #0056b3;
}

.search-container {
    margin: 20px 0;
}

input[type="text"] {
    width: 100%;
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
}

#notes-container {
    margin-top: 20px;
}

.note {
    background: #f9f9f9;
    margin-bottom: 10px;
    padding: 10px;
    border-radius: 5px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    border: 1px solid #ddd;
}

.note p {
    margin: 0;
}

.note button {
    background: #dc3545;
    color: white;
    border: none;
    padding: 5px 10px;
    border-radius: 5px;
    cursor: pointer;
}

.note button:hover {
    background: #a71d2a;
}

JavaScript

// Select DOM elements
const noteInput = document.getElementById('note-input');
const addNoteButton = document.getElementById('add-note');
const notesContainer = document.getElementById('notes-container');
const searchNotesInput = document.getElementById('search-notes');

// Load notes from local storage
let notes = JSON.parse(localStorage.getItem('notes')) || [];
renderNotes();

// Add note
addNoteButton.addEventListener('click', () => {
    const noteText = noteInput.value.trim();
    if (noteText) {
        notes.push({ text: noteText });
        noteInput.value = '';
        saveAndRenderNotes();
    }
});

// Delete note
function deleteNote(index) {
    notes.splice(index, 1);
    saveAndRenderNotes();
}

// Render notes
function renderNotes() {
    notesContainer.innerHTML = '';
    notes.forEach((note, index) => {
        const noteElement = document.createElement('div');
        noteElement.classList.add('note');

        const noteText = document.createElement('p');
        noteText.textContent = note.text;
        noteElement.appendChild(noteText);

        const deleteButton = document.createElement('button');
        deleteButton.textContent = 'Delete';
        deleteButton.addEventListener('click', () => deleteNote(index));
        noteElement.appendChild(deleteButton);

        notesContainer.appendChild(noteElement);
    });
}

// Save notes to local storage
function saveAndRenderNotes() {
    localStorage.setItem('notes', JSON.stringify(notes));
    renderNotes();
}

// Search notes
searchNotesInput.addEventListener('input', () => {
    const searchText = searchNotesInput.value.toLowerCase();
    const filteredNotes = notes.filter(note =>
        note.text.toLowerCase().includes(searchText)
    );
    renderFilteredNotes(filteredNotes);
});

function renderFilteredNotes(filteredNotes) {
    notesContainer.innerHTML = '';
    filteredNotes.forEach((note, index) => {
        const noteElement = document.createElement('div');
        noteElement.classList.add('note');

        const noteText = document.createElement('p');
        noteText.textContent = note.text;
        noteElement.appendChild(noteText);

        const deleteButton = document.createElement('button');
        deleteButton.textContent = 'Delete';
        deleteButton.addEventListener('click', () => deleteNote(index));
        noteElement.appendChild(deleteButton);

        notesContainer.appendChild(noteElement);
    });
}

Key Features Explained

  1. Add Notes: Users can type their notes in the text area and click the “Add Note” button to save them.
  2. Delete Notes: Each note has a delete button that allows users to remove it from the list.
  3. Local Storage: Notes are stored in the browser’s local storage, so they persist even after the page is refreshed.
  4. Search Notes: Users can search for specific notes using the search bar.
  • Add timestamps to each note.
  • Enable editing of existing notes.
  • Implement a feature to categorize notes (e.g., work, personal, etc.).
  • Sync notes with a backend for cross-device accessibility.

Final Thoughts

This project is a great starting point for anyone learning web development. It combines basic DOM manipulation with persistent storage and interactive UI elements.

Rick Bowen (JavaScript)

About Rick Bowen (JavaScript)

Hi, I'm Rick! I'm an accomplished Software Engineer with broad and deep expertise in Go JavaScript, TypeScript, Shell (bash/zsh), Git, SQL & NoSQL Databases, Containers + Kubernetes, Distributed Systems, Reliability Engineering, DevOps, Cloud / Network / Application Security, Identity / Access Management, Linux, macOS/Darwin, CI/CD, SaltStack, Terraform, AWS, GCP, Azure, Internet Protocols, and much more.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments