Snippets Form

Bootstrap 5 Registration Form Layouts

A registration form shown in three modern layouts, compact, split with a brand panel, and detailed two-column, with built-in validation and a dark mode that follows the theme.

Bootstrap 5 No jQuery Nov 2020 1.5K views

<section class="wdw-stage">
  <div class="container" style="max-width:1040px">
    <div class="text-center mb-4">
      <span class="wdw-eyebrow">Sign up</span>
      <h1 class="wdw-heading h2 mt-1 mb-3">Registration form layouts</h1>
      <ul class="nav nav-pills d-inline-flex p-1 rounded-pill bg-body border" id="rf-tabs" role="tablist" aria-label="Choose a layout">
        <li class="nav-item" role="presentation"><button type="button" class="nav-link rounded-pill px-4 active" id="rf-t-split" data-bs-toggle="pill" data-bs-target="#rf-p-split" role="tab" aria-controls="rf-p-split" aria-selected="true">Split</button></li>
        <li class="nav-item" role="presentation"><button type="button" class="nav-link rounded-pill px-4" id="rf-t-compact" data-bs-toggle="pill" data-bs-target="#rf-p-compact" role="tab" aria-controls="rf-p-compact" aria-selected="false" tabindex="-1">Compact</button></li>
        <li class="nav-item" role="presentation"><button type="button" class="nav-link rounded-pill px-4" id="rf-t-detailed" data-bs-toggle="pill" data-bs-target="#rf-p-detailed" role="tab" aria-controls="rf-p-detailed" aria-selected="false" tabindex="-1">Detailed</button></li>
      </ul>
    </div>

    <div class="alert alert-success d-flex align-items-center gap-2 mx-auto rf-ok" role="status" aria-live="polite" style="max-width:460px" hidden>
      <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="flex-shrink-0"><circle cx="12" cy="12" r="10"/><path d="m8 12 3 3 5-6"/></svg>
      <span>Thanks! Your registration was received.</span>
    </div>

    <div class="tab-content">
    <!-- Compact -->
    <div class="tab-pane fade" id="rf-p-compact" role="tabpanel" aria-labelledby="rf-t-compact" tabindex="0">
      <form class="wdw-card p-4 p-md-5 mx-auto needs-validation" style="max-width:460px" novalidate>
        <h2 class="h4 fw-bold mb-1">Create your account</h2>
        <p class="wdw-muted small mb-4">It takes less than a minute.</p>
        <div class="form-floating mb-3">
          <input type="text" class="form-control" id="c-name" placeholder="Name" minlength="2" required autocomplete="name">
          <label for="c-name">Full name</label>
          <div class="invalid-feedback">Please enter your name.</div>
        </div>
        <div class="form-floating mb-3">
          <input type="email" class="form-control" id="c-email" placeholder="Email" required autocomplete="email">
          <label for="c-email">Email address</label>
          <div class="invalid-feedback">Enter a valid email address.</div>
        </div>
        <div class="row g-3 mb-3">
          <div class="col-5">
            <div class="form-floating">
              <input type="number" class="form-control" id="c-age" placeholder="Age" min="16" max="120" required>
              <label for="c-age">Age</label>
              <div class="invalid-feedback">16 or older.</div>
            </div>
          </div>
          <div class="col-7">
            <div class="form-floating">
              <input type="tel" class="form-control" id="c-tel" placeholder="Phone" pattern="[0-9+()\- ]{7,}" required autocomplete="tel">
              <label for="c-tel">Telephone</label>
              <div class="invalid-feedback">Enter a valid number.</div>
            </div>
          </div>
        </div>
        <div class="form-check mb-4 d-flex align-items-center gap-2 ps-0" style="min-height:44px">
          <input class="form-check-input mt-0 ms-0 flex-shrink-0" type="checkbox" id="c-agree" required>
          <label class="form-check-label small" for="c-agree">I accept the privacy policy</label>
          <div class="invalid-feedback">You must accept to continue.</div>
        </div>
        <button class="btn btn-primary rounded-pill w-100" type="submit">Create account</button>
      </form>
    </div>

    <!-- Split -->
    <div class="tab-pane fade show active" id="rf-p-split" role="tabpanel" aria-labelledby="rf-t-split" tabindex="0">
      <div class="wdw-card overflow-hidden">
        <div class="row g-0">
          <div class="col-lg-5 wdw-aurora p-4 p-md-5 d-flex flex-column justify-content-between">
            <span class="fw-bold d-inline-flex align-items-center gap-2">
              <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2l3 7h7l-5.5 4.5L18.5 21 12 16.5 5.5 21l2-7.5L2 9h7z"/></svg>
              Northwind
            </span>
            <div class="my-4">
              <h2 class="h3 fw-bold mb-2">Join 40,000 designers shipping faster.</h2>
              <p class="mb-0 opacity-75">Free for individuals. No credit card needed.</p>
            </div>
            <ul class="list-unstyled small mb-4 d-grid gap-2">
              <li>✓ Unlimited projects</li>
              <li>✓ Team sharing</li>
              <li>✓ Cancel anytime</li>
            </ul>
            <figure class="rf-quote rounded-4 p-3 mb-0">
              <blockquote class="small mb-3">“We moved our whole design workflow over in an afternoon. Handoff is finally painless.”</blockquote>
              <figcaption class="d-flex align-items-center gap-3">
                <span class="d-flex">
                  <img src="https://i.pravatar.cc/80?img=47" width="36" height="36" class="rounded-circle border border-2 border-white" alt="">
                  <img src="https://i.pravatar.cc/80?img=12" width="36" height="36" class="rounded-circle border border-2 border-white" alt="" style="margin-left:-10px">
                  <img src="https://i.pravatar.cc/80?img=32" width="36" height="36" class="rounded-circle border border-2 border-white" alt="" style="margin-left:-10px">
                </span>
                <span class="small"><strong class="d-block">Maya Lindqvist</strong><span class="opacity-75">Design lead, Fjord Studio</span></span>
              </figcaption>
            </figure>
          </div>
          <div class="col-lg-7">
            <form class="p-4 p-md-5 needs-validation" novalidate>
              <h2 class="h4 fw-bold mb-4">Your details</h2>
              <div class="row g-3">
                <div class="col-sm-6">
                  <label for="s-first" class="form-label small fw-semibold">First name</label>
                  <input type="text" class="form-control" id="s-first" required autocomplete="given-name">
                  <div class="invalid-feedback">Required.</div>
                </div>
                <div class="col-sm-6">
                  <label for="s-last" class="form-label small fw-semibold">Last name</label>
                  <input type="text" class="form-control" id="s-last" required autocomplete="family-name">
                  <div class="invalid-feedback">Required.</div>
                </div>
                <div class="col-12">
                  <label for="s-email" class="form-label small fw-semibold">Work email</label>
                  <input type="email" class="form-control" id="s-email" placeholder="[email protected]" required autocomplete="email">
                  <div class="invalid-feedback">Enter a valid email address.</div>
                </div>
                <div class="col-12">
                  <label for="s-pass" class="form-label small fw-semibold">Password</label>
                  <div class="input-group has-validation">
                    <input type="password" class="form-control" id="s-pass" minlength="8" required autocomplete="new-password" aria-describedby="s-pass-hint">
                    <button class="btn btn-outline-secondary" type="button" data-rf-reveal="s-pass" aria-label="Show password" aria-pressed="false">Show</button>
                    <div class="invalid-feedback">Use 8 characters or more.</div>
                  </div>
                  <div class="progress mt-2" style="height:4px" aria-hidden="true"><div class="progress-bar rf-meter" style="width:0"></div></div>
                  <div class="form-text" id="s-pass-hint">Password strength: <span class="rf-meter-label">enter a password</span></div>
                </div>
                <div class="col-12">
                  <div class="form-check">
                    <input class="form-check-input" type="checkbox" id="s-agree" required>
                    <label class="form-check-label small" for="s-agree">I agree to the <a href="#">terms</a> and <a href="#">privacy policy</a></label>
                    <div class="invalid-feedback">You must agree to continue.</div>
                  </div>
                </div>
              </div>
              <button class="btn btn-primary rounded-pill px-4 mt-4" type="submit">Create account</button>
            </form>
          </div>
        </div>
      </div>
    </div>

    <!-- Detailed -->
    <div class="tab-pane fade" id="rf-p-detailed" role="tabpanel" aria-labelledby="rf-t-detailed" tabindex="0">
      <form class="wdw-card p-4 p-md-5 mx-auto needs-validation" style="max-width:760px" novalidate>
        <h2 class="h4 fw-bold mb-1">Registration</h2>
        <p class="wdw-muted small mb-4">Tell us a little about yourself.</p>
        <div class="row g-3">
          <div class="col-md-6">
            <label for="d-first" class="form-label small fw-semibold">First name</label>
            <input type="text" class="form-control" id="d-first" required>
            <div class="invalid-feedback">Required.</div>
          </div>
          <div class="col-md-6">
            <label for="d-last" class="form-label small fw-semibold">Last name</label>
            <input type="text" class="form-control" id="d-last" required>
            <div class="invalid-feedback">Required.</div>
          </div>
          <div class="col-md-6">
            <label for="d-pass" class="form-label small fw-semibold">Password</label>
            <input type="password" class="form-control" id="d-pass" minlength="8" required>
            <div class="invalid-feedback">At least 8 characters.</div>
          </div>
          <div class="col-md-6">
            <label for="d-pass2" class="form-label small fw-semibold">Confirm password</label>
            <input type="password" class="form-control" id="d-pass2" required data-match="d-pass">
            <div class="invalid-feedback">Passwords do not match.</div>
          </div>
          <div class="col-md-6">
            <label for="d-email" class="form-label small fw-semibold">Email</label>
            <input type="email" class="form-control" id="d-email" required>
            <div class="invalid-feedback">Enter a valid email address.</div>
          </div>
          <div class="col-md-6">
            <label for="d-gender" class="form-label small fw-semibold">Gender</label>
            <select class="form-select" id="d-gender" required>
              <option value="" selected disabled>Select</option>
              <option>Female</option><option>Male</option><option>Non-binary</option><option>Prefer not to say</option>
            </select>
            <div class="invalid-feedback">Please choose one.</div>
          </div>
          <div class="col-12">
            <label for="d-addr" class="form-label small fw-semibold">Address</label>
            <input type="text" class="form-control" id="d-addr" autocomplete="street-address">
          </div>
          <div class="col-md-6">
            <label for="d-tel" class="form-label small fw-semibold">Phone</label>
            <input type="tel" class="form-control" id="d-tel" autocomplete="tel">
          </div>
          <div class="col-md-6">
            <label for="d-zip" class="form-label small fw-semibold">Postal code</label>
            <input type="text" class="form-control" id="d-zip" autocomplete="postal-code">
          </div>
          <div class="col-12">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" id="d-agree" required>
              <label class="form-check-label small" for="d-agree">I agree to the terms and conditions</label>
              <div class="invalid-feedback">You must agree to continue.</div>
            </div>
          </div>
        </div>
        <button class="btn btn-primary rounded-pill px-5 mt-4" type="submit">Register</button>
      </form>
    </div>
    </div>
  </div>
</section>

Built on Bootstrap 5.3.8 with plain JavaScript — no jQuery. Supports light and dark mode via data-bs-theme.

Free to use in personal and commercial projects under the MIT license.