HTML / GUIDED PROJECT PRACTICE

Build your first complete HTML webpage

Combine your HTML skills in a personal learning portfolio built in your own files.

Why this practice comes now

You have completed the HTML fundamentals. Combine document structure, accessible content, forms, and metadata in a page of your own.

Concepts to recall

Start with one action

Download and extract the starter. Open index.html in your editor and browser. Add the main page heading inside the body, save, and refresh before building the remaining sections. CSS, JavaScript, and a server are not required.

Your mission

Create a personal learning page with a complete document head, semantic regions, internal navigation, an introduction, a skills list, a three-day schedule, and a labeled demo notes field. Add your own image when available. State clearly that the notes are not sent or saved.

  1. Open the downloaded index.html in your editor and build the page in small stages using the earlier HTML examples.
  2. Check each requirement by interacting with it: follow links, read table headers, and click labels.
  3. Review on a narrow screen and with the keyboard. Save the finished file, reopen it, and explain one choice you made in each section.

Build in your own files. The interactive examples below are references to explore. This project has no in-page code editor or automatic solution checks; use the starter download and self-review checklist.

Before you begin: HTML metadata.

Unfinished starter files for this project. Edit and save your work on your computer. How to run it on your computer →

Plan your build

This project brings the HTML course together. Build a personal learning portfolio that introduces you and records your progress. It is an HTML project: default browser styling is enough, and no JavaScript or browser API is required. You can return later to improve the appearance with CSS.

Plan the content before writing tags. The page needs a main title, a short introduction, a list of skills you are learning, a small learning schedule, and a notes or contact-form demonstration. Add a navigation link to each main section so a reader can move around the page.

Choose a photo you have permission to use, or leave a clearly described place for one until you have a file. Write alternative text that fits its purpose. A media player is an optional extension, not a reason to block your first complete page. If you add spoken media, include its transcript or captions.

Reuse the tags you already know

Remember first

Build one meaningful section at a time. This project combines familiar tags rather than adding new ones.

Build the page first

<header> / <nav>Introduction and navigation
header introduces the page; nav groups a links whose fragments match section ids.
<main> / <section>Content and topics
main holds the primary content. section groups a topic under its heading.
<h1> / <h2> / <p>Readable outline
h1 names the page; h2 names its sections; p contains paragraphs.
<ul> / <li>Skills list
ul groups the collection; each li wraps one skill.

Add the supporting pieces

<table>Learning schedule
caption names it; thead and tbody group tr rows; th identifies headers and td contains values.
<label> / <textarea>Demo notes field
Connect for and id. Textarea accepts notes but does not save them.
<footer>Closing information
Holds authorship or other closing content.
<html> / <head> / <body>Complete document
Reuse the document shell. Keep title and meta in head, and the visible page in body.

Explore the target in stages

Build a complete page in small stages

Follow the internal links in each stage. Compare what the schedule and labeled notes field add to the same page.

Code to notice

<header aria-label="Lesson example">
<h1>Sam’s learning notebook</h1>
<nav aria-label="Main">
<a href="#about">About</a> · <a href="#skills">Skills</a>
</nav>
</header>
<main aria-label="Lesson example">
<section id="about">
<h2>About me</h2>
<p>I am learning HTML.</p>
</section>
<section id="skills">
<h2>Skills</h2>
<ul>
<li>Headings</li>
<li>Links</li>
</ul>
</section>
</main>
<footer aria-label="Lesson example">
<p>© 2026 Sam</p>
</footer>

Live result

Lesson example
index.htmlPreview

What changed: Start with meaningful regions, headings, a list, and links whose fragments match section ids.

A starting body fragment

html
<header>
  <h1>Sam’s learning notebook</h1>
  <nav aria-label="Main">
    <a href="#about">About</a> · <a href="#skills">Skills</a> ·
    <a href="#notes">Notes</a>
  </nav>
</header>
<main>
  <section id="about">
    <h2>About me</h2>
    <p>I am learning to build webpages.</p>
  </section>
  <section id="skills">
    <h2>Skills</h2>
    <ul>
      <li>Headings</li>
      <li>Links</li>
    </ul>
  </section>
  <section id="notes">
    <h2>Notes</h2>
    <label for="note">My next goal</label
    ><textarea id="note" name="note"></textarea>
    <p>Demo only: this note is not saved.</p>
  </section>
</main>
<footer><p>&copy; 2026 Sam</p></footer>

This is a starting body fragment, not a finished answer to every requirement. Put it inside the complete document from lesson 2. The navigation targets match section ids. Each section has a heading. The notes field has a visible label, and the page tells the truth about its behavior: typing does not save anything.

Build and check one part at a time

First complete the document head with a useful title and description. Then write your introduction and headings. Add lists and internal links next. When the structure reads clearly, add a schedule with a caption and header associations. This order makes it easier to find a mistake than pasting a large finished page and changing everything at once.

A contact form needs a working service to deliver messages. For this HTML-only project, label it as a demonstration and use a non-submitting button or no button. Do not show Message sent when nothing was sent. If you later connect a service, revisit validation, privacy, and error handling.

Before calling the page finished, follow every link, inspect the image path, read the heading outline, and test keyboard navigation. Open it at a narrow width too. A code validator can help find invalid nesting, but it cannot tell you whether the writing is understandable or whether alternative text fits the image.

Before you call it finished

A polished-looking template can hide gaps in understanding. You should be able to explain why each heading, list, table, and label exists. Avoid adding unexplained scripts or styling simply to make the result look like another website.

Use the preview to inspect the page in stages: structure, schedule, then a demo notes field. Follow its navigation and use the field's label. Decide which part you will build next in your own file.

Need a hint?

Open one hint, try a change, and test it before opening the next. The explained example follows separately.

Hint 1

Plan: list the visible regions before writing markup. Which content belongs in the header, main area, and footer?

Hint 2

Connect: compare each navigation fragment with a section id, then each label’s for value with a control id. Do the pairs match?

Hint 3

Structure: give the schedule a caption and headers. Does each data cell have a clear row or column heading?

Hint 4

Verify: save and refresh, then follow every link and use the keyboard to reach the notes field. Review the metadata last; it belongs in head, not body.

Compare with an explained example when you are ready
html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Sam’s learning page</title>
    <meta name="description" content="My first HTML learning portfolio." />
  </head>
  <body>
    <header>
      <h1>Sam’s learning page</h1>
      <nav aria-label="Main">
        <a href="#about">About</a> · <a href="#plan">Plan</a>
      </nav>
    </header>
    <main>
      <section id="about">
        <h2>About me</h2>
        <p>I am learning HTML.</p>
        <ul>
          <li>Links</li>
          <li>Tables</li>
        </ul>
      </section>
      <section id="plan">
        <h2>Learning plan</h2>
        <table>
          <caption>
            Three days of practice
          </caption>
          <tr>
            <th scope="col">Day</th>
            <th scope="col">Topic</th>
          </tr>
          <tr>
            <th scope="row">Monday</th>
            <td>Links</td>
          </tr>
          <tr>
            <th scope="row">Tuesday</th>
            <td>Tables</td>
          </tr>
          <tr>
            <th scope="row">Wednesday</th>
            <td>Review</td>
          </tr>
        </table>
      </section>
      <section>
        <h2>Notes</h2>
        <label for="goal">My next goal</label
        ><textarea id="goal" name="goal"></textarea>
        <p>Demo only: nothing is sent or saved.</p>
      </section>
    </main>
    <footer><p>&copy; 2026 Sam</p></footer>
  </body>
</html>

The example combines the required structures in a readable document. Your wording and subject should differ. Supply your own image when available and verify its path and alternative text. Completing the HTML project does not require the optional browser APIs detour.

Review your project

This is a self-review of the files you built locally. Tuklas cannot inspect those files or automatically check this project. Tick each item only after testing it yourself.

Test each requirement before recording completion.

Choose another practice →