Onay kutuları ve radyo düğmeleri gibi standart HTML form öğelerini özelleştirmek geçmişte zordu. Geliştiriciler genellikle tarayıcı varsayılanlarını kullanmak veya sıfırdan özel bileşenler oluşturmak arasında seçim yapmak zorunda kalıyordu. Özel kontroller oluşturmak zaman alır ve kolayca erişilebilirlik sorunlarına veya eksik durumlara (onay kutuları için belirsiz durum gibi) yol açabilir.
CSS özelliği accent-color, erişilebilirlikten veya yerleşik tarayıcı özelliklerinden ödün vermeden tek bir CSS satırıyla marka renginizi yerleşik HTML form girişlerine getirmenin basit bir yolunu sunar.
Nasıl uygulanır?
Marka renginizi form kontrollerine uygulamak için:
- Marka renginizi belirleyin: Markanızı temsil eden bir renk seçin.
accent-colorözelliğini uygulayın: CSS'nizdeki öğeye veya bir kapsayıcı öğeye (bodyya da belirli bir form gibi)accent-colorekleyin.- Koyu modu destekleyin (isteğe bağlı ancak önerilir): Tarayıcıya sitenizin koyu modu desteklediğini bildirmek için
color-schemekullanın ve daha iyi kontrast için gerekirseaccent-colordeğerini ayarlayın.
Örnek Kod: Markayla Tutarlı Form Kontrolleri
:root {
--brand-color: #6200ee;
}
/* Apply accent-color to the body or a specific container */
body {
accent-color: var(--brand-color);
}
/* Optional: Adjust for dark mode if needed */
@media (prefers-color-scheme: dark) {
:root {
--brand-color: #bb86fc; /* A lighter shade for dark mode */
}
}
<form>
<!-- Checkbox -->
<label for="subscribe">
<input type="checkbox" id="subscribe" checked>
Subscribe to newsletter
</label>
<!-- Radio Buttons -->
<label for="plan-monthly">
<input type="radio" id="plan-monthly" name="plan" value="monthly">
Monthly
</label>
<label for="plan-yearly">
<input type="radio" id="plan-yearly" name="plan" value="yearly" checked>
Yearly
</label>
<!-- Range Slider -->
<label for="volume">Volume:</label>
<input type="range" id="volume" min="0" max="100" value="70">
<!-- Progress Bar -->
<label for="file">Upload Progress:</label>
<progress id="file" max="100" value="70">70%</progress>
</form>
Stratejik Uygulama ve En İyi Uygulamalar
- Form kontrollerini markanıza uyacak şekilde kolayca temalandırmak için
accent-colorKULLANIN. - Kontrastı ayarlama konusunda tarayıcıya körü körüne GÜVENMEYİN. Tarayıcıların uygun bir kontrast rengini otomatik olarak belirlemesi gerekir ancak Safari (WebKit hatası 244233) ve Android Chrome (Chromium hatası 343503163) gibi uygulamalardaki bilinen hatalar, onay işareti renklerini tersine çeviremeyebilir.Bu durum, arka plana göre yeterli kontrasta sahip olmayan renkler (ör. açık modda açık renkler veya koyu modda koyu renkler) kullanıldığında kontrollerin görünmez olmasına veya zor görünmesine neden olur.
- Form denetimlerinin hem açık hem de koyu temalarda iyi görünmesi için
accent-colorilecolor-scheme: light dark'yi BİRLİKTE KULLANIN. - Arka plan rengine çok yakın bir renk KULLANMAYIN. Tarayıcılar kontrastı garanti etmeye çalışsa da iyi bir temel kontrasta sahip bir renk kullanmak en iyisidir.
accent-colorözelliğinin tüm form öğelerinde çalıştığını varsaymayın. Şu anda yalnızcacheckbox,radio,rangeveprogressöğelerini renklendirir.
Yedek strateji
accent-color özelliğini desteklemeyen tarayıcılarda form kontrolleri, tarayıcının varsayılan görünümüne geri döner. Tüm ortamlarda tam marka tutarlılığı ve yüksek güvenilirlik sağlamak için, yerleşik "görsel olarak gizli giriş" tekniğini kullanarak özel bir yedek strateji uygulamanız GEREKİR.
@supports not ile Progresif Geliştirme
Özel yedek stillerini yalnızca accent-color desteklenmediğinde uygulamak için @supports not kuralını KULLANMANIZ GEREKİR. Bu sayede, modern tarayıcılar için accent-color'nin basitliğinden yararlanırken eski tarayıcılar için tutarlı bir markalı deneyim sunabilirsiniz.
1. HTML Yapısı
CSS'de eş seçicilere izin vermek için etiketlerinizin metni bir <span> içine aldığından emin olun:
<label for="subscribe-fallback">
<input type="checkbox" id="subscribe-fallback" class="visually-hidden" checked>
<span>Subscribe to newsletter</span>
</label>
2. CSS Yedek
@supports not bloğuna özel stiller uygulama:
/* Fallback for older browsers without accent-color */
@supports not (accent-color: var(--brand-color)) {
/* Visually hide the native input using the canonical accessible recipe */
form input[type="checkbox"].visually-hidden {
position: absolute !important;
clip-path: inset(50%) !important;
overflow: hidden !important;
width: 1px !important;
height: 1px !important;
margin: -1px !important;
padding: 0 !important;
border: 0 !important;
white-space: nowrap !important;
}
/* Style the wrapper label */
label {
position: relative;
padding-left: 2rem;
cursor: pointer;
display: inline-flex;
align-items: center;
}
/* Custom box for checkbox */
input[type="checkbox"] + span::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 1.2rem;
height: 1.2rem;
border: 2px solid #ccc;
background: white;
border-radius: 4px;
box-sizing: border-box;
transition: all 0.2s ease;
}
/* Ensure custom checkbox shows focus for keyboard users */
input[type="checkbox"]:focus-visible + span::before {
outline: 2px solid #000;
outline-offset: 2px;
}
/* Checked State */
input[type="checkbox"]:checked + span::before {
background-color: var(--brand-color, #6200ee);
border-color: var(--brand-color, #6200ee);
}
/* Checkmark (Unicode) */
input[type="checkbox"]:checked + span::after {
content: "✓";
position: absolute;
left: 0.25rem;
top: 50%;
transform: translateY(-50%);
color: white;
font-weight: bold;
font-size: 0.9rem;
}
/* Fallback for Range Slider */
input[type="range"] {
-webkit-appearance: none;
appearance: none;
background: transparent;
}
/* Webkit (Chrome, Safari, Edge) */
input[type="range"]::-webkit-slider-runnable-track {
width: 100%;
height: 8px;
/* Use gradient to show progress for a static value (e.g., 70%) or update with JS */
background: linear-gradient(to right, var(--brand-color, #6200ee) 70%, #ccc 70%);
border-radius: 4px;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: var(--brand-color, #6200ee);
cursor: pointer;
margin-top: -4px; /* Center vertically */
}
/* Firefox */
input[type="range"]::-moz-range-track {
width: 100%;
height: 8px;
background: #ccc;
border-radius: 4px;
}
input[type="range"]::-moz-range-thumb {
height: 16px;
width: 16px;
border-radius: 50%;
background: var(--brand-color, #6200ee);
cursor: pointer;
}
/* Firefox specific progress bar */
input[type="range"]::-moz-range-progress {
background-color: var(--brand-color, #6200ee);
height: 8px;
border-radius: 4px;
}
/* Fallback for Progress Bar */
progress {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border: none;
background: #ccc;
height: 8px;
border-radius: 4px;
}
progress::-webkit-progress-bar {
background-color: #ccc;
border-radius: 4px;
}
progress::-webkit-progress-value {
background-color: var(--brand-color, #6200ee);
border-radius: 4px;
}
progress::-moz-progress-bar {
background-color: var(--brand-color, #6200ee);
border-radius: 4px;
}
}
Webkit Yedek Modunda Dinamik Aralık İlerlemesi
Webkit tarayıcılarda (accent-color olmadan) ilerleme dolgusunun aralık kaydırıcısındaki kaydırma çubuğuyla birlikte hareket etmesini sağlamak için bir CSS değişkeni ve az miktarda JavaScript kullanabilirsiniz.
CSS'yi güncelleme: Gradyan durak noktası için bir CSS değişkeni kullanın:
input[type="range"]::-webkit-slider-runnable-track { background: linear-gradient(to right, var(--brand-color) var(--progress, 0%), #ccc var(--progress, 0%)); }JavaScript ekleyin:
inputetkinliğindeki değişkeni güncelleyin:
if (!CSS.supports('accent-color')) {
const slider = document.getElementById('volume');
slider.addEventListener('input', (e) => {
e.target.style.setProperty('--progress', `${e.target.value}%`);
});
}