ब्रैंड के हिसाब से फ़ॉर्म

वेब की सुविधाएं: accent-color

चेकबॉक्स और रेडियो बटन जैसे स्टैंडर्ड एचटीएमएल फ़ॉर्म एलिमेंट को पसंद के मुताबिक बनाना, पहले से ही मुश्किल रहा है. डेवलपर को अक्सर ब्राउज़र के डिफ़ॉल्ट कॉम्पोनेंट इस्तेमाल करने या नए कस्टम कॉम्पोनेंट बनाने में से किसी एक को चुनना पड़ता था. कस्टम कंट्रोल बनाने में समय लगता है. साथ ही, इनमें सुलभता से जुड़ी समस्याएं आ सकती हैं या कुछ स्थितियां छूट सकती हैं. जैसे, चेकबॉक्स के लिए तय न की गई स्थिति.

सीएसएस प्रॉपर्टी accent-color की मदद से, सीएसएस की एक लाइन का इस्तेमाल करके, पहले से मौजूद एचटीएमएल फ़ॉर्म इनपुट में अपने ब्रैंड का रंग आसानी से जोड़ा जा सकता है. इसके लिए, सुलभता या ब्राउज़र की पहले से मौजूद सुविधाओं से समझौता करने की ज़रूरत नहीं पड़ती.

इन्हें कैसे लागू करें

फ़ॉर्म कंट्रोल पर अपने ब्रैंड का रंग लागू करने के लिए:

  1. अपने ब्रैंड का रंग चुनें: ऐसा रंग चुनें जो आपके ब्रैंड को दिखाता हो.
  2. accent-color प्रॉपर्टी लागू करें: अपने सीएसएस में, एलिमेंट या कंटेनर एलिमेंट (जैसे, body या कोई खास फ़ॉर्म) में accent-color जोड़ें.
  3. गहरे रंग वाले मोड की सुविधा उपलब्ध कराएं (ज़रूरी नहीं, लेकिन हमारा सुझाव है कि आप इसे इस्तेमाल करें): color-scheme का इस्तेमाल करके, ब्राउज़र को बताएं कि आपकी साइट पर गहरे रंग वाला मोड काम करता है. साथ ही, बेहतर कंट्रास्ट के लिए, ज़रूरत पड़ने पर accent-color में बदलाव करें.

कोड का उदाहरण: ब्रैंड के हिसाब से फ़ॉर्म कंट्रोल

: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>

रणनीति को लागू करने के तरीके और सबसे सही तरीके

  • अपने ब्रैंड के हिसाब से फ़ॉर्म कंट्रोल की थीम को आसानी से सेट करने के लिए, accent-color का इस्तेमाल करें.
  • कंट्रास्ट को हैंडल करने के लिए, ब्राउज़र पर आंखें बंद करके भरोसा न करें. ब्राउज़र, ज़रूरी कंट्रास्ट कलर अपने-आप तय करते हैं. हालांकि, Safari (WebKit गड़बड़ी 244233) और Android Chrome (Chromium गड़बड़ी 343503163) जैसे ब्राउज़र में मौजूद गड़बड़ियों की वजह से, सही के निशान के रंग नहीं बदल पाते. इससे, बैकग्राउंड के हिसाब से ज़रूरी कंट्रास्ट वाले रंग इस्तेमाल न करने पर, कंट्रोल नहीं दिखते या उन्हें देखना मुश्किल हो जाता है. जैसे, हल्के रंग वाले मोड में हल्के रंग या गहरे रंग वाले मोड में गहरे रंग.
  • accent-color को color-scheme: light dark के साथ जोड़ें, ताकि फ़ॉर्म कंट्रोल, हल्के और गहरे रंग वाली थीम, दोनों में अच्छे दिखें.ऐसा करना ज़रूरी है.
  • बैकग्राउंड के रंग से मिलता-जुलता रंग इस्तेमाल न करें. भले ही, ब्राउज़र कंट्रास्ट को बेहतर बनाने की कोशिश करते हैं, लेकिन बेहतर बेस कंट्रास्ट वाला रंग इस्तेमाल करना सबसे सही रहता है.
  • यह न मानें कि accent-color, फ़ॉर्म के सभी एलिमेंट पर काम करता है. फ़िलहाल, यह सिर्फ़ checkbox, radio, range, और progress एलिमेंट को टिंट करता है.

फ़ॉलबैक रणनीति

accent-color के साथ काम न करने वाले ब्राउज़र के लिए, फ़ॉर्म कंट्रोल ब्राउज़र के डिफ़ॉल्ट लुक पर वापस आ जाते हैं. सभी प्लैटफ़ॉर्म पर ब्रैंड की पहचान को एक जैसा बनाए रखने और ज़्यादा विश्वसनीयता के लिए, आपको "विज़ुअल तौर पर छिपे हुए इनपुट" की तकनीक का इस्तेमाल करके, कस्टम फ़ॉलबैक रणनीति लागू करनी होगी.

@supports not के साथ परतदार वृद्धि

आपको @supports not नियम का इस्तेमाल करना होगा, ताकि कस्टम फ़ॉलबैक स्टाइल सिर्फ़ तब लागू हों, जब accent-color काम न करे. इससे यह पक्का होता है कि आपको मॉडर्न ब्राउज़र के लिए, accent-color की आसान सुविधाओं का फ़ायदा मिले. साथ ही, पुराने ब्राउज़र के लिए ब्रैंड के हिसाब से एक जैसा अनुभव मिले.

1. एचटीएमएल स्ट्रक्चर

पक्का करें कि आपके लेबल, टेक्स्ट को <span> में रैप करें, ताकि सीएसएस में सिबलिंग सिलेक्टर का इस्तेमाल किया जा सके:

<label for="subscribe-fallback">
  <input type="checkbox" id="subscribe-fallback" class="visually-hidden" checked>
  <span>Subscribe to newsletter</span>
</label>

2. सीएसएस फ़ॉलबैक

@supports not ब्लॉक में पसंद के मुताबिक स्टाइल लागू करना:

/* 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 फ़ॉलबैक में डाइनैमिक रेंज की प्रोग्रेस

Webkit ब्राउज़र (accent-color के बिना) में रेंज स्लाइडर पर थंब के साथ प्रोग्रेस फ़िल को मूव करने के लिए, सीएसएस वैरिएबल और JavaScript का थोड़ा सा इस्तेमाल किया जा सकता है.

  1. सीएसएस अपडेट करना: ग्रेडिएंट स्टॉप के लिए, सीएसएस वैरिएबल का इस्तेमाल करें:

    input[type="range"]::-webkit-slider-runnable-track {
      background: linear-gradient(to right, var(--brand-color) var(--progress, 0%), #ccc var(--progress, 0%));
    }
    
  2. JavaScript जोड़ें: input इवेंट पर वैरिएबल को अपडेट करें:

if (!CSS.supports('accent-color')) {
  const slider = document.getElementById('volume');
  slider.addEventListener('input', (e) => {
    e.target.style.setProperty('--progress', `${e.target.value}%`);
  });
}