Forem

Cover image for Mastering createElement in JavaScript (In a Way That Actually Sticks)
Kathirvel S
Kathirvel S

Posted on

Mastering createElement in JavaScript (In a Way That Actually Sticks)

Let’s be honest.

Writing static HTML is easy.
But the moment someone says

“make it dynamic,”

things start getting confusing.

That’s exactly where createElement() becomes your friend.

Instead of just writing HTML, you start building it live using JavaScript. And once you get this, everything—from to-do apps to real-world projects—starts making sense.

Let’s build this step by step, like you're actually doing it.


First, What Are We Even Doing?

We’re going to:

  • Create elements using JavaScript
  • Add content inside them
  • Style them a bit
  • Place them exactly where we want (before, after, inside)
  • And understand what’s happening behind the scenes

Step 1: Create Something (But It’s Invisible)

let heading = document.createElement("h1");
Enter fullscreen mode Exit fullscreen mode

Right now, nothing shows up.

What’s happening behind the scenes?

  • The browser creates an object in memory (inside the DOM)
  • This object represents an <h1> element
  • But it is not attached to the page yet

Think of it like building a LEGO piece in your hand… but not placing it on the board.


Step 2: Give It Life (Add Text)

heading.textContent = "Hello, World!";
Enter fullscreen mode Exit fullscreen mode

Now your element actually has meaning.

Behind the scenes:

  • A text node is created
  • That text node is placed inside the <h1> element
  • The DOM structure now looks like:
<h1>Hello, World!</h1>
Enter fullscreen mode Exit fullscreen mode

Still invisible though, because it's not connected to the document.


Step 3: Make It Look Decent

heading.style.color = "blue";
heading.style.fontSize = "40px";
Enter fullscreen mode Exit fullscreen mode

Behind the scenes:

  • You’re modifying the element’s inline style object
  • The browser updates its internal CSS representation
  • But again—since it's not in the document, nothing renders yet

So yes, you're styling it… but it’s still off-screen.


Step 4: Put It on the Page

document.body.appendChild(heading);
Enter fullscreen mode Exit fullscreen mode

Now it finally shows up.

Behind the scenes:

  • The <h1> node is attached to the DOM tree
  • The browser detects a DOM change
  • It triggers:

    • Reflow (layout calculation)
    • Repaint (drawing pixels on screen)

Output:

Hello, World!
Enter fullscreen mode Exit fullscreen mode

That moment when it appears? That’s the browser saying:

“Okay, now I know where to render this.”


Creating Multiple Elements (The Smart Way)

Real apps don’t create just one element—they create many.

let fruits = ["Apple", "Banana", "Mango"];

let ul = document.createElement("ul");

fruits.forEach(function(fruit) {
    let li = document.createElement("li");
    li.textContent = fruit;
    ul.appendChild(li);
});

document.body.appendChild(ul);
Enter fullscreen mode Exit fullscreen mode

Output:

• Apple
• Banana
• Mango
Enter fullscreen mode Exit fullscreen mode

Behind the scenes:

  • Each loop creates a new <li> node
  • Text nodes are inserted into each <li>
  • All <li> elements are attached to <ul>
  • Then <ul> is added to the DOM in one operation

Efficient and clean.


Placement Control (This Is Where It Gets Powerful)

Appending everything at the end is basic.

Let’s control exactly where things go.


Case 1: Add Before an Element

<p id="target">I am the target</p>
Enter fullscreen mode Exit fullscreen mode
let newPara = document.createElement("p");
newPara.textContent = "I appear before the target.";

let target = document.getElementById("target");

document.body.insertBefore(newPara, target);
Enter fullscreen mode Exit fullscreen mode

Output:

I appear before the target.
I am the target
Enter fullscreen mode Exit fullscreen mode

Behind the scenes:

  • The browser finds the target node
  • Inserts the new node right before it in the DOM tree
  • Internally, it just adjusts node positions—no full rebuild

Case 2: Add After an Element

let newDiv = document.createElement("div");
newDiv.textContent = "I come after the target.";

let target = document.getElementById("target");

target.insertAdjacentElement("afterend", newDiv);
Enter fullscreen mode Exit fullscreen mode

Output:

I am the target
I come after the target.
Enter fullscreen mode Exit fullscreen mode

Behind the scenes:

  • The browser calculates the position after the target node
  • Inserts your element exactly there in the DOM hierarchy

Case 3: Insert Exactly Where You Want

target.insertAdjacentElement("beforebegin", newDiv); // before element
target.insertAdjacentElement("afterbegin", newDiv);  // inside (top)
target.insertAdjacentElement("beforeend", newDiv);   // inside (bottom)
target.insertAdjacentElement("afterend", newDiv);    // after element
Enter fullscreen mode Exit fullscreen mode

Behind the scenes:

You are giving precise instructions to the DOM:

  • Insert relative to this node
  • Update only that part of the tree

This is efficient and powerful.


Let’s Make It Interactive

let button = document.createElement("button");
button.textContent = "Click Me";

document.body.appendChild(button);
Enter fullscreen mode Exit fullscreen mode

Output:

[ Click Me ]
Enter fullscreen mode Exit fullscreen mode

button.addEventListener("click", function() {
    alert("You clicked the button!");
});
Enter fullscreen mode Exit fullscreen mode

Output:

Click →

You clicked the button!
Enter fullscreen mode Exit fullscreen mode

Behind the scenes:

  • An event listener is attached
  • The browser listens for a click event
  • When triggered, your function runs

This is the foundation of interactivity on the web.


Common Mistakes (Everyone Hits These Once)

  • Created element but forgot appendChild() → nothing appears
  • Appended to wrong parent → layout issues
  • Typo in tag name → unexpected behavior
  • Overusing innerHTML instead of textContent

Quick Recap

  • createElement() → creates node in memory
  • textContent → adds text node
  • appendChild() → attaches to DOM
  • insertBefore() → places before
  • insertAdjacentElement() → precise placement

Your Turn

Try this:

  • Create a heading
  • Create 3 paragraphs using a loop
  • Insert one before the heading and one after

If you can do that without looking back, you’ve understood this properly.


Final Thought

At first, this feels like just creating elements.

But what you’re really learning is how the browser builds and updates a page internally.

Once this clicks, frameworks like React or Vue start making a lot more sense.

Now go try things. Break them. Fix them.

That’s where real learning happens.

Top comments (0)