Reszponzív Űrlap Készítése Bootstrap és CSS Grid Segítségével

Az űrlapok a weboldalak egyik legfontosabb interakciós elemei. Egy jól megtervezett, reszponzív űrlap nemcsak esztétikus, de használható is minden eszközön. Ebben a cikkben lépésről lépésre megmutatjuk, hogyan készíthetsz egy modern, reszponzív űrlapot Bootstrap 5 és CSS Grid segítségével, valamint hogyan alkalmazhatod a Bootstrap beépített form validációs lehetőségeit.

1. lépés: Projekt struktúra

Hozz létre egy egyszerű projektet az alábbi struktúrával:

Projekt mappa

├── index.html            # A fő HTML fájl
└── js                    # Egyéni js (opcionális)
    └── script.js         # Egyéni js fájl (opcionális)
└── css                   # Egyéni stílusokhoz (opcionális)
    └── style.css         # Egyéni CSS fájl (opcionális)

2. lépés: Alap HTML űrlap Bootstrap osztályokkal

Az űrlap elemeihez használd a Bootstrap form-osztályait, hogy alapból szép és reszponzív legyen:

<!DOCTYPE html>
<html lang="hu">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Űrlap Validáció</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css" />

    <link rel="stylesheet" href="css/style.css" />
</head>

<body class="p-4">
    <div class="container">
        <h1 class="mb-4">Regisztrációs űrlap</h1>
        <form class="needs-validation" novalidate>

            <!-- Szövegmező -->
            <div class="mb-3">
                <label for="name" class="form-label">Név</label>
                <input type="text" class="form-control" id="name" required />
                <div class="invalid-feedback">Kérjük, add meg a neved!</div>
            </div>

            <!-- Email -->
            <div class="mb-3">
                <label for="email" class="form-label">Email cím</label>
                <input type="email" class="form-control" id="email" required />
                <div class="invalid-feedback">Kérjük, érvényes email címet adj meg!</div>
            </div>

            <!-- Jelszó -->
            <div class="mb-3">
                <label for="password" class="form-label">Jelszó</label>
                <input type="password" class="form-control" id="password" required minlength="6" />
                <div class="invalid-feedback">Legalább 6 karakter szükséges.</div>
            </div>

            <!-- Jelszó megerősítése -->
            <div class="mb-3">
                <label for="confirmPassword" class="form-label">Jelszó megerősítése</label>
                <input type="password" class="form-control" id="confirmPassword" required />
                <div class="invalid-feedback" id="confirmPasswordFeedback">A jelszavak nem egyeznek!</div>
            </div>

            <!-- Telefonszám -->
            <div class="mb-3">
                <label for="phone" class="form-label">Telefonszám</label>
                <input type="tel" class="form-control" id="phone" required />
                <div class="invalid-feedback">Kérjük, add meg a telefonszámod!</div>
            </div>

            <!-- TAJ-szám -->
            <div class="mb-3">
                <label for="taj" class="form-label">TAJ-szám</label>
                <input type="text" class="form-control" id="taj" required />
                <div class="invalid-feedback">Kérjük, add meg a TAJ-számod (9 számjegy)!</div>
            </div>

            <!-- Bankszámlaszám -->
            <div class="mb-3">
                <label for="bankszamla" class="form-label">Bankszámlaszám</label>
                <input type="text" class="form-control" id="bankszamla" required />
                <div class="invalid-feedback">Kérjük, add meg a teljes bankszámlaszámod!</div>
            </div>

            <!-- Dátum -->
            <div class="mb-3">
                <label for="dob" class="form-label">Születési dátum</label>
                <input type="text" class="form-control" id="dob" required />
                <div class="invalid-feedback">Kérjük, válassz dátumot!</div>
            </div>

            <!-- Idő -->
            <div class="mb-3">
                <label for="idopont" class="form-label">Időpont</label>
                <input type="text" class="form-control" id="idopont" required />
                <div class="invalid-feedback">Kérjük, válassz időpontot!</div>
            </div>

            <!-- Szám -->
            <div class="mb-3">
                <label for="quantity" class="form-label">Darabszám</label>
                <input type="number" class="form-control" id="quantity" min="1" max="100" required />
                <div class="invalid-feedback">Kérjük, adj meg egy számot 1 és 100 között!</div>
            </div>

            <!-- Legördülő -->
            <div class="mb-3">
                <label for="select" class="form-label">Válassz kategóriát</label>
                <select class="form-select" id="select" required>
                    <option value="">-- Válassz --</option>
                    <option value="1">Kategória 1</option>
                    <option value="2">Kategória 2</option>
                </select>
                <div class="invalid-feedback">Kérjük, válassz kategóriát!</div>
            </div>

            <!-- Checkbox -->
            <div class="mb-3 form-check">
                <input class="form-check-input" type="checkbox" id="terms" required />
                <label class="form-check-label" for="terms">Elfogadom a feltételeket</label>
                <div class="invalid-feedback">El kell fogadnod a feltételeket!</div>
            </div>

            <!-- Rádiógombok -->
            <div class="mb-3">
                <label class="form-label">Nem</label>
                <div class="form-check">
                    <input class="form-check-input" type="radio" name="gender" id="male" required />
                    <label class="form-check-label" for="male">Férfi</label>
                </div>
                <div class="form-check">
                    <input class="form-check-input" type="radio" name="gender" id="female" required />
                    <label class="form-check-label" for="female">Nő</label>
                </div>
                <div class="invalid-feedback d-block">Kérjük, válassz nemet!</div>
            </div>

            <!-- Szövegterület -->
            <div class="mb-3">
                <label for="message" class="form-label">Üzenet</label>
                <textarea class="form-control" id="message" rows="3" required></textarea>
                <div class="invalid-feedback">Kérjük, írj üzenetet!</div>
            </div>

            <!-- Fájl -->
            <div class="mb-3">
                <label for="fileUpload" class="form-label">Fájl feltöltése</label>
                <input class="form-control" type="file" id="fileUpload" required />
                <div class="invalid-feedback">Kérlek, válassz ki egy fájlt!</div>
            </div>

            <!-- Küldés -->
            <button class="btn btn-primary" type="submit">Küldés</button>
        </form>
    </div>

    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

    <!-- Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>

    <!-- Flatpickr -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css" />
    <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>

    <!-- Magyar lokalizáció -->
    <script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/hu.js"></script>

    <!-- Inputmask (teljes működő build) -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/5.0.9/jquery.inputmask.min.js"></script>

    <!-- Végül a saját script -->
    <script src="js/script.js"></script>

</body>

</html>

3. lépés: CSS Grid az űrlap elrendezéséhez

A CSS Grid segítségével egyszerűen készíthetsz több oszlopos elrendezést nagyobb képernyőkre, miközben mobilon egy oszlopos marad:

form {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}

@media (min-width: 768px) {
  form {
    grid-template-columns: 1fr 1fr;
  }

  /* Az üzenet mező és a gomb teljes szélességűek legyenek */
  form > div:nth-last-child(2),
  form > button {
    grid-column: 1 / -1;
  }
}

4. lépés: Bootstrap form validáció használata

Bootstrap beépített validációs osztályait használhatod JavaScript segítségével, hogy a felhasználói hibákat azonnal jelezze az űrlap:

(() => {
  'use strict';

  const form = document.querySelector('.needs-validation');
  if (!form) return;

  const password = form.querySelector('#password');
  const confirmPassword = form.querySelector('#confirmPassword');
  const confirmFeedback = form.querySelector('#confirmPasswordFeedback');

  form.addEventListener('submit', event => {
    event.preventDefault(); // <- Mindig megakadályozza az elküldést
    event.stopPropagation();

    const isPasswordMatch = password.value === confirmPassword.value;

    if (!form.checkValidity() || !isPasswordMatch) {
      if (!isPasswordMatch) {
        confirmPassword.classList.add('is-invalid');
        confirmFeedback.style.display = 'block';
      } else {
        confirmPassword.classList.remove('is-invalid');
        confirmFeedback.style.display = 'none';
      }
    } else {
      confirmPassword.classList.remove('is-invalid');
      confirmFeedback.style.display = 'none';

      // 💡 Ide jöhet a saját logikád pl. AJAX küldés
      console.log('Űrlap sikeresen validált!');
    }

    form.classList.add('was-validated');
  }, false);
})();

window.addEventListener("DOMContentLoaded", function () {
  // Csak ha már minden betöltődött
  if (typeof Inputmask !== "undefined") {
    Inputmask({"mask": "+36 (99) 999-9999"}).mask("#phone");
    Inputmask({"mask": "999999999"}).mask("#taj");
    Inputmask({"mask": "99999999-99999999-99999999"}).mask("#bankszamla");
  } else {
    console.error("Inputmask nincs betöltve!");
  }

  if (typeof flatpickr !== "undefined") {
    flatpickr("#dob", {
      dateFormat: "Y-m-d",
      maxDate: "today",
      locale: "hu"
    });

    flatpickr("#idopont", {
      enableTime: true,
      noCalendar: true,
      dateFormat: "H:i",
      time_24hr: true,
      locale: "hu"
    });
  } else {
    console.error("Flatpickr nincs betöltve!");
  }
});

Összegzés

Egy reszponzív űrlap CSS Grid és Bootstrap kombinációjával könnyen elkészíthető, amely minden eszközön jól működik. A Bootstrap validációs osztályai pedig egyszerűvé teszik a felhasználói hibák kezelését és megjelenítését.

Letöltés