Do you love stylish fonts and personalized art? How about combining the two to create your own handwritten name image generator? In this tutorial, we’ll build a fun web app that lets you type in your name, pick a handwriting-style font, and download the output as an image — all using basic HTML, CSS, and JavaScript!
Let’s break down how it works from top to bottom.
Video Tutorial:
HTML: The Structure
HTML is the skeleton of your web app — it defines what elements appear on the screen.
Here’s what we’ve included:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Handwritten Text</title>
    <link
      href="https://fonts.googleapis.com/css2?family=Alex+Brush&family=Dancing+Script:wght@400..700&family=Pacifico&display=swap"
      rel="stylesheet"
    />
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div class="container">
      <h2>Handwriting Style Name</h2>
      <input type="text" id="nameInput" placeholder="Enter your Name" />
      <select id="fontSelector">
        <option value="Alex Brush">Alex Brush</option>
        <option value="Dancing Script">Dancing Script</option>
        <option value="Pacifico">Pacifico</option>
      </select>
      <br />
      <canvas id="nameCanvas" width="400" height="100"></canvas>
      <br />
      <button onclick="downloadImage()">Download Image</button>
    </div>
    <script src="script.js"></script>
  </body>
</html>
Explanation:
- 
Google Fonts link: Loads beautiful handwriting fonts like Alex Brush, Dancing Script, and Pacifico. 
- 
Input field: Lets the user type in their name. 
- 
Select dropdown: Allows users to choose from the loaded fonts. 
- 
Canvas: This is where the name is drawn using the selected font. 
- 
Button: On clicking, it triggers the download of the canvas as an image. CSS: The Styling 
 CSS makes everything look nice. It defines colors, positioning, spacing, fonts, and layout styles. Here’s the full CSS:
body {
  background-color: #01dd8f;
  font-family: "Poppins", sans-serif;
  text-align: center;
}
.container {
  background-color: #151729;
  width: min(500px, 90vw);
  position: absolute;
  transform: translate(-50%, -50%);
  left: 50%;
  top: 50%;
  padding: 30px;
  border-radius: 10px;
}
h2 {
  color: #ffffff;
  font-weight: 400;
  letter-spacing: 3px;
}
button {
  background-color: #01dd8f;
  padding: 15px 30px;
  border: none;
  outline: none;
  border-radius: 5px;
}
canvas {
  background-color: #ffffff;
  border: none;
  margin-top: 20px;
  border-radius: 5px;
}
input {
  background-color: #2a2a46;
  border: none;
  outline: none;
  padding: 15px 30px;
  color: #ffffff;
}
input::placeholder {
  color: #ffffff;
}
select {
  outline: none;
  padding: 15px;
  background-color: #01dd8f;
  color: #ffffff;
}
Explanation:
- 
Body: Sets a vibrant green background and a clean sans-serif font. 
- 
Container: Centers the content with padding and a dark background. 
- 
Typography: Headings and placeholders have subtle customizations for readability and style. 
- 
Canvas: Has a white background to clearly display the text. 
- 
Buttons/Inputs: Styled to match the overall neon/dark theme with rounded corners and easy-to-read colors. 
JavaScript: The Functionality
JavaScript is where the magic happens. It handles everything interactive — drawing on canvas, updating fonts, and downloading the image.
function drawName() {
  let canvas = document.getElementById("nameCanvas");
  let ctx = canvas.getContext("2d");
  let name = document.getElementById("nameInput").value;
  let font = document.getElementById("fontSelector").value;
  document.fonts.ready.then(() => {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.font = `50px ${font}`;
    ctx.fillStyle = "black";
    ctx.textAlign = "center";
    ctx.fillText(name, canvas.width / 2, canvas.height / 2 + 15);
  });
}
document.getElementById("fontSelector").addEventListener("change", () => {
  document.fonts
    .load(`50px ${document.getElementById("fontSelector").value}`)
    .then(drawName);
});
document.getElementById("nameInput").addEventListener("input", () => {
  document.fonts
    .load(`50px ${document.getElementById("fontSelector").value}`)
    .then(drawName);
});
function downloadImage() {
  let canvas = document.getElementById("nameCanvas");
  let link = document.createElement("a");
  link.download = "handwritten-name.png";
  link.href = canvas.toDataURL("image/png");
  link.click();
}
- 
drawName(): Gets the input text and selected font, and draws it on the canvas using fillText().
- 
document.fonts.ready: Ensures the font is fully loaded before drawing to avoid default fallbacks. 
- 
Event listeners: Watch for changes in the input field and dropdown menu, and automatically redraw the canvas in real time. 
- 
downloadImage(): Converts the canvas to a PNG image and triggers a download using an invisible anchor tag. 
✅ Final Thoughts
This project is a great way to practice real-world web development skills:
- 
✅ Handling user input 
- 
✅ Drawing with canvas 
- 
✅ Working with web fonts 
- 
✅ Dynamically updating the UI 
- 
✅ Exporting graphics as images 
It’s a fun and creative app that you can share with friends or even use in your own portfolio.


