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.