Learn how to create a live character counter for a text box using HTML, CSS, and JavaScript. Perfect for web forms, tweets, or input validations.
When you're filling out a form that limits your text to a certain number of characters — like a tweet or feedback form — it's helpful to see a live character counter. This shows how many characters you've typed or how many you have left.
In this tutorial, we'll build a simple but effective live character counter using HTML, CSS, and JavaScript. We’ll break everything down step-by-step so even beginners can follow along.
You'll build a text box that:
Counts characters in real time
Shows how many characters are remaining
Changes color when approaching or exceeding the limit
A code editor (like VS Code)
A browser (like Chrome)
Basic knowledge of HTML, CSS, and JavaScript
First, let’s set up the basic structure in HTML.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Live Character Counter</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Write Your Message</h2>
<textarea id="textbox" maxlength="100" placeholder="Type your message here..."></textarea>
<p id="counter">0 / 100 characters</p>
</div>
<script src="script.js"></script>
</body>
</html>
What’s happening:
We added a <textarea>
with a maxlength
of 100.
There’s a <p>
tag to show the live character count.
CSS and JavaScript files are linked.
Let’s make it look clean and modern.
/* styles.css */
body {
font-family: Arial, sans-serif;
background: #f4f4f4;
padding: 20px;
}
.container {
max-width: 400px;
margin: 0 auto;
background: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
textarea {
width: 100%;
height: 100px;
padding: 10px;
font-size: 16px;
resize: none;
border: 1px solid #ccc;
border-radius: 5px;
}
#counter {
text-align: right;
margin-top: 10px;
font-size: 14px;
color: #555;
}
.warning {
color: orange;
}
.exceeded {
color: red;
}
What’s happening:
Basic styling for readability and layout.
We added .warning
and .exceeded
classes for color changes when character count increases.
Now let’s make it interactive.
// script.js
const textbox = document.getElementById('textbox');
const counter = document.getElementById('counter');
const maxLength = textbox.getAttribute('maxlength');
textbox.addEventListener('input', () => {
const currentLength = textbox.value.length;
counter.textContent = `${currentLength} / ${maxLength} characters`;
// Change color based on count
if (currentLength >= maxLength) {
counter.classList.remove('warning');
counter.classList.add('exceeded');
} else if (currentLength >= maxLength * 0.8) {
counter.classList.remove('exceeded');
counter.classList.add('warning');
} else {
counter.classList.remove('warning', 'exceeded');
}
});
Explanation:
We get the textarea and counter elements using getElementById
.
We listen for the input
event, which triggers whenever the user types.
We calculate how many characters are used and update the counter text.
Based on the count, we add or remove CSS classes to change the counter's color.
If you want a different character limit, just change the maxlength
in the HTML:
<textarea id="textbox" maxlength="200"></textarea>
And JavaScript will automatically pick it up using:
const maxLength = textbox.getAttribute('maxlength');
No code change needed elsewhere!
When you run the code:
You’ll see a styled text box.
As you type, the character count updates instantly.
The counter turns orange at 80% and red when the limit is reached.
Tweet composers
Contact or feedback forms
Description fields in user profiles
Anywhere character limits matter!
We just created a live character counter that’s responsive, clean, and user-friendly. By combining HTML for structure, CSS for style, and JavaScript for interactivity, you’ve built a real-world component that can be used in many applications.
Thank you for visiting! Enjoy exploring our diverse collection of blogs, crafted with passion and insight to inspire and inform. Happy reading!