Neler yeni
XenForo Bannerlar
Modern AdBlock Uyarısı

Foruma hoş geldin, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Web geliştirme HTML Form Tasarımı: Gelişmiş Form Kodları ve Stil İpuçları

Fatih Bulut

Süper Üye
Katılım
6 Kas 2021
Mesajlar
3,276
Tepkime puanı
4,783
Puanları
113
Yaş
31
Konum
Türkiye
Dc
fatihbulut

HTML Form Tasarımı: Gelişmiş Form Kodları ve Stil İpuçları​

Modern web uygulamalarında formlar, kullanıcı etkileşiminin en kritik noktalarından biridir. Bu kapsamlı rehberde, profesyonel düzeyde HTML form tasarım tekniklerini, gelişmiş CSS stillerini ve kullanıcı deneyimini artıran ipuçlarını inceleyeceğiz.

1. Semantik HTML5 Form Yapısı​

Modern formlar için doğru HTML5 elementlerinin kullanımı temel önem taşır.

Temel Form Yapısı​

HTML:
<form id="signup-form" class="form-container" novalidate>
  <fieldset>
    <legend>Kişisel Bilgiler</legend>
    
    <div class="form-group">
      <label for="fullname">Tam Adınız</label>
      <input type="text" id="fullname" name="fullname" required
             placeholder="Ad ve soyadınızı yazın"
             pattern="[A-Za-zğüşıöçĞÜŞİÖÇ\s]{3,}">
      <span class="form-hint">En az 3 karakter</span>
    </div>
    
    <div class="form-group">
      <label for="email">E-posta <span class="required">*</span></label>
      <input type="email" id="email" name="email" required
             placeholder="ornek@mail.com">
    </div>
  </fieldset>
 
  <!-- Diğer form alanları -->
</form>
Önemli Özellikler:
  • novalidate: Tarayıcı validasyonunu devre dışı bırakarak kendi validasyonumuzu uygulayabiliriz
  • fieldset ve legend: İlgili alanları gruplamak için
  • required: Zorunlu alan belirtme
  • pattern: Özel validasyon kuralları

2. Gelişmiş Form Kontrolleri​

Özel Input Tipleri​

HTML:
<!-- Tarih Seçici -->
<div class="form-group">
  <label for="birthdate">Doğum Tarihi</label>
  <input type="date" id="birthdate" name="birthdate"
         min="1900-01-01" max="2023-12-31">
</div>

<!-- Renk Seçici -->
<div class="form-group">
  <label for="favcolor">Favori Renginiz</label>
  <input type="color" id="favcolor" name="favcolor" value="#6a5acd">
</div>

<!-- Aralık Seçici -->
<div class="form-group">
  <label for="volume">Ses Seviyesi: <span id="volume-value">50</span>%</label>
  <input type="range" id="volume" name="volume"
         min="0" max="100" value="50" step="5"
         oninput="document.getElementById('volume-value').textContent = this. Value">
</div>

Gelişmiş Select Öğeleri​

HTML:
<div class="form-group">
  <label for="country">Ülke</label>
  <select id="country" name="country" required>
    <option value="" disabled selected>Ülke seçiniz</option>
    <optgroup label="Avrupa">
      <option value="tr">Türkiye</option>
      <option value="de">Almanya</option>
    </optgroup>
    <optgroup label="Asya">
      <option value="jp">Japonya</option>
    </optgroup>
  </select>
</div>

<!-- Çoklu Seçim -->
<div class="form-group">
  <label for="skills">Yetenekler</label>
  <select id="skills" name="skills" multiple size="4">
    <option value="html">HTML</option>
    <option value="css">CSS</option>
    <option value="js">JavaScript</option>
  </select>
</div>

3. Modern CSS Stilleme Teknikleri​

Flexbox ile Form Düzeni​

CSS:
.form-container {
  max-width: 800px;
  margin: 0 auto;
  padding: 2rem;
  background: #fff;
  border-radius: 10px;
  box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}

.form-group {
  display: flex;
  flex-direction: column;
  margin-bottom: 1.5rem;
}

@media (min-width: 768px) {
  .form-group {
    flex-direction: row;
    align-items: center;
  }
 
  .form-group label {
    flex: 0 0 200px;
    margin-right: 1rem;
    text-align: right;
  }
 
  .form-group input,
  .form-group select,
  .form-group textarea {
    flex: 1;
  }
}

Input Stilleme​


CSS:
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
select, textarea {
  padding: 12px 15px;
  border: 1px solid #ddd;
  border-radius: 6px;
  font-size: 16px;
  transition: all 0.3s ease;
  background-color: #f9f9f9;
}

input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: #4a6fa5;
  box-shadow: 0 0 0 3px rgba(74, 111, 165, 0.2);
  background-color: #fff;
}

/* Özel Checkbox ve Radio Butonları */
input[type="checkbox"], input[type="radio"] {
  appearance: none;
  width: 20px;
  height: 20px;
  border: 2px solid #ddd;
  margin-right: 10px;
  position: relative;
  cursor: pointer;
}

input[type="checkbox"]:checked {
  background-color: #4a6fa5;
  border-color: #4a6fa5;
}

input[type="radio"] {
  border-radius: 50%;
}

input[type="radio"]:checked {
  background-color: #4a6fa5;
  border-color: #4a6fa5;
}

/* Özel Select Ok Simgesi */
select {
  appearance: none;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
  background-repeat: no-repeat;
  background-position: right 10px center;
  background-size: 1em;
  padding-right: 2.5em;
}

4. Validasyon ve Geri Bildirim​

HTML5 Validasyon Özellikleri​

HTML:
<input type="text" id="username" name="username"
       minlength="3" maxlength="20"
       pattern="[A-Za-z0-9_]+"
       title="Sadece harf, sayı ve alt çizgi kullanabilirsiniz">

Özel Validasyon Stilleri​


CSS:
/* Geçerli ve geçersiz durumlar */
input:valid {
  border-color: #4CAF50;
}

input:invalid:not(:placeholder-shown) {
  border-color: #f44336;
}

/* Hata ve uyarı mesajları */
.form-group {
  position: relative;
}

.error-message {
  color: #f44336;
  font-size: 0.85rem;
  margin-top: 0.25rem;
  display: none;
}

input:invalid:not(:placeholder-shown) ~ .error-message {
  display: block;
}

/* Zorunlu alan göstergesi */
.required {
  color: #f44336;
  margin-left: 0.25rem;
}

5. Etkileşimli Form Elementleri​

Dinamik Etiket Animasyonu​

HTML:
<div class="form-group floating-label">
  <input type="text" id="username" name="username" placeholder=" ">
  <label for="username">Kullanıcı Adı</label>
</div>
CSS:
.floating-label {
  position: relative;
}

.floating-label input {
  padding-top: 1.5rem;
}

.floating-label label {
  position: absolute;
  top: 1rem;
  left: 1rem;
  color: #999;
  transition: all 0.3s ease;
  pointer-events: none;
}

.floating-label input:focus + label,
.floating-label input:not(:placeholder-shown) + label {
  top: 0.25rem;
  left: 0.75rem;
  font-size: 0.75rem;
  color: #4a6fa5;
}

Şifre Güç Göstergesi​


HTML:
<div class="form-group">
  <label for="password">Şifre</label>
  <input type="password" id="password" name="password" required
         pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}">
  <div class="password-strength">
    <div class="strength-bar"></div>
    <span class="strength-text">Şifre gücü: zayıf</span>
  </div>
</div>
CSS:
.password-strength {
  margin-top: 0.5rem;
  width: 100%;
}

.strength-bar {
  height: 5px;
  background: #eee;
  border-radius: 3px;
  margin-bottom: 0.25rem;
  overflow: hidden;
}

.strength-bar::after {
  content: '';
  display: block;
  height: 100%;
  width: 0%;
  background: #f44336;
  transition: width 0.3s ease, background 0.3s ease;
}

.strength-text {
  font-size: 0.75rem;
  color: #f44336;
}
JavaScript:
document.getElementById('password').addEventListener('input', function(e) {
  const password = e.target.value;
  const strengthBar = document.querySelector('.strength-bar');
  const strengthText = document.querySelector('.strength-text');
 
  let strength = 0;
  if (password.length > 0) strength += 1;
  if (password.length >= 8) strength += 1;
  if (/[A-Z]/.test(password)) strength += 1;
  if (/\d/.test(password)) strength += 1;
  if (/[^A-Za-z0-9]/.test(password)) strength += 1;
 
  const width = strength * 20;
  strengthBar.style.width = width + '%';
 
  if (strength <= 2) {
    strengthBar.style.backgroundColor = '#f44336';
    strengthText.textContent = 'Şifre gücü: zayıf';
    strengthText.style.color = '#f44336';
  } else if (strength <= 4) {
    strengthBar.style.backgroundColor = '#ff9800';
    strengthText.textContent = 'Şifre gücü: orta';
    strengthText.style.color = '#ff9800';
  } else {
    strengthBar.style.backgroundColor = '#4CAF50';
    strengthText.textContent = 'Şifre gücü: güçlü';
    strengthText.style.color = '#4CAF50';
  }
});

6. Çok Adımlı Formlar​


HTML:
<div class="multi-step-form">
  <div class="steps">
    <div class="step active" data-step="1">Kişisel Bilgiler</div>
    <div class="step" data-step="2">Ödeme Bilgileri</div>
    <div class="step" data-step="3">Onay</div>
  </div>
 
  <div class="form-step active" id="step-1">
    <!-- 1. adım form alanları -->
    <button type="button" class="next-step">Devam</button>
  </div>
 
  <div class="form-step" id="step-2">
    <!-- 2. adım form alanları -->
    <button type="button" class="prev-step">Geri</button>
    <button type="button" class="next-step">Devam</button>
  </div>
 
  <div class="form-step" id="step-3">
    <!-- 3. adım form alanları -->
    <button type="button" class="prev-step">Geri</button>
    <button type="submit">Gönder</button>
  </div>
</div>
CSS:
.multi-step-form {
  position: relative;
}

.steps {
  display: flex;
  justify-content: space-between;
  margin-bottom: 2rem;
  position: relative;
}

.steps::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  height: 2px;
  background: #ddd;
  z-index: 1;
}

.step {
  position: relative;
  z-index: 2;
  background: #fff;
  padding: 0.5rem 1rem;
  border: 2px solid #ddd;
  border-radius: 50px;
  text-align: center;
  min-width: 120px;
}

.step.active {
  border-color: #4a6fa5;
  color: #4a6fa5;
  font-weight: bold;
}

.form-step {
  display: none;
}

.form-step.active {
  display: block;
  animation: fadeIn 0.5s ease;
}

@keyframes fadeIn {
  from { opacity: 0; transform: translateY(20px); }
  to { opacity: 1; transform: translate(0); }
}
JavaScript:
document.querySelectorAll('.next-step').forEach(button => {
  button.addEventListener('click', () => {
    const currentStep = document.querySelector('.form-step.active');
    const nextStep = currentStep.nextElementSibling;
    
    if (nextStep) {
      currentStep.classList.remove('active');
      nextStep.classList.add('active');
      
      const stepNumber = nextStep.id.split('-')[1];
      document.querySelectorAll('.step').forEach(step => {
        step.classList.remove('active');
        if (step.dataset.step === stepNumber) {
          step.classList.add('active');
        }
      });
    }
  });
});

document.querySelectorAll('.prev-step').forEach(button => {
  button.addEventListener('click', () => {
    const currentStep = document.querySelector('.form-step.active');
    const prevStep = currentStep.previousElementSibling;
    
    if (prevStep) {
      currentStep.classList.remove('active');
      prevStep.classList.add('active');
      
      const stepNumber = prevStep.id.split('-')[1];
      document.querySelectorAll('.step').forEach(step => {
        step.classList.remove('active');
        if (step.dataset.step === stepNumber) {
          step.classList.add('active');
        }
      });
    }
  });
});

7. Form Gönderim Animasyonu​

HTML:
<button type="submit" class="submit-btn">
  <span class="btn-text">Gönder</span>
  <div class="loading-spinner"></div>
</button>
CSS:
.submit-btn {
  position: relative;
  overflow: hidden;
}

.loading-spinner {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 20px;
  height: 20px;
  border: 3px solid rgba(255,255,255,0.3);
  border-radius: 50%;
  border-top-color: #fff;
  animation: spin 1s ease-in-out infinite;
  opacity: 0;
}

@keyframes spin {
  to { transform: translate(-50%, -50%) rotate(360deg); }
}

.submit-btn.loading .btn-text {
  opacity: 0;
}

.submit-btn.loading .loading-spinner {
  opacity: 1;
}
JavaScript:
document.querySelector('form').addEventListener('submit', function(e) {
  e.preventDefault();
 
  const submitBtn = document.querySelector('.submit-btn');
  submitBtn.classList.add('loading');
 
  // Simüle edilmiş AJAX isteği
  setTimeout(() => {
    submitBtn.classList.remove('loading');
    alert('Form başarıyla gönderildi!');
  }, 2000);
});

Sonuç​

Profesyonel düzeyde form tasarımı için dikkat edilmesi gereken temel noktalar:
  1. Semantik HTML: Doğru elementlerin kullanımı (fieldset, legend, uygun input tipleri)
  2. Erişilebilirlik: label'ların doğru kullanımı, ARIA özellikleri, klavye navigasyonu
  3. Kullanıcı Deneyimi: Anlaşılır hata mesajları, doğru yer tutucular, mantıklı form akışı
  4. Görsel Tasarım: Tutarlı stil, uygun boşluklar, odak durumları
  5. Performans: Gereksiz karmaşıklıktan kaçınma, optimize edilmiş JavaScript
Bu teknikleri uygulayarak hem görsel açıdan çekici hem de kullanıcı dostu formlar oluşturabilirsiniz. Form tasarımı sürekli gelişen bir alan olduğundan yeni CSS özelliklerini ve kullanıcı etkileşim modellerini takip etmek önemlidir.
 

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Tema düzenleyici

Tema özelletirmeleri

Grafik arka planlar

Granit arka planlar