ब्रैंड के हिसाब से रेंज स्लाइडर

वेब सुविधाएं: accent-color <input type="range"> appearance progress() attr() :dir()

नेटिव रेंज इनपुट का इस्तेमाल करना

<div> एलिमेंट या कस्टम पॉइंटर हैंडलर की मदद से स्लाइडर को फिर से बनाने के बजाय, लेबल किए गए <input type="range"> का इस्तेमाल करें. नेटिव कंट्रोल, कीबोर्ड और पॉइंटर इंटरैक्शन, टच व्यवहार, और सुलभता सहायता को सुरक्षित रखता है. इस्तेमाल के उदाहरण के लिए, min, max, step, और value को कॉन्फ़िगर करें.

<label for="range-slider">Volume</label>
<input type="range" id="range-slider" value="70"/>

अगर वैल्यू के लिए फ़ॉर्मैट किए गए लेबल या यूनिट की ज़रूरत है, तो उसे सामान्य डीओएम कॉन्टेंट में दिखाएं. साथ ही, बदलाव होने पर aria-valuetext को अपडेट करें. स्लाइडर के सूडो-एलिमेंट पर ::before या ::after का इस्तेमाल न करें. ऐसा इसलिए, क्योंकि फ़ॉर्म कंट्रोल पर जनरेट किया गया कॉन्टेंट, इंटरऑपरेबल नहीं होता. अगर थंब के साथ टूलटिप की ज़रूरत है, तो उसे सीएसएस ऐंकर पोज़िशनिंग की मदद से थंब पर ऐंकर करें. ऐसे टूलटिप के लिए पोज़िशन अवेयर टूलटिप देखें जो फ़्लिप होने पर सही ओरिएंटेशन में रहते हैं.

स्टाइलिंग का तरीका चुनना

रंग को आसानी से पसंद के मुताबिक बनाने के लिए, ब्रैंड के मुताबिक फ़ॉर्म का इस्तेमाल करें और ब्राउज़र की नेटिव रेंडरिंग को बनाए रखें:

input[type="range"] {
  accent-color: var(--brand-color);
}

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

ट्रैक और थंब को स्टाइल करना

appearance: none, margin: 0, और border: 0 की मदद से, ओएस की डिफ़ॉल्ट स्टाइल को रीसेट करें. क्रॉस-ब्राउज़र रेंडरिंग को सामान्य बनाने के लिए, WebKit और Firefox के सूडो-एलिमेंट को अलग-अलग नियम ब्लॉक में तय करें. साथ ही, margin-block-start: calc((var(--slider-track-size) - var(--slider-thumb-size)) / 2) का इस्तेमाल करके WebKit थंब को बीच में रखें. Firefox, थंब को अपने-आप बीच में रखता है. उपभोक्ता को दिखने वाली वैल्यू को इनपुट पर कस्टम प्रॉपर्टी के तौर पर रखें, ताकि थीम सीधे तौर पर सूडो-एलिमेंट को टारगेट न करें.

input[type="range"] {
  --slider-track-size: 0.5rem;
  --slider-thumb-size: 1.25rem;
  --slider-track-radius: 999px;
  --slider-thumb-radius: 50%;
  --slider-track-color: #d9d9d9;
  --slider-fill-color: #06c;
  --slider-thumb-color: var(--slider-fill-color);
  --slider-direction: to right;

  /* reverse gradient direction for right-to-left layouts */
  &:dir(rtl) {
    --slider-direction: to left;
  }

  /* Read min and max from attributes; --control-value is synced by the script below. */
  --attr-min: attr(min type(<number>), 0);
  --attr-max: attr(max type(<number>), 100);
  --control-value: attr(value type(<number>), 50);
  --slider-progress: calc(
    progress(var(--control-value), var(--attr-min), var(--attr-max)) * 100%
  );

  appearance: none;
  inline-size: 100%;
  block-size: 2.5rem; /* Preserve a generous interaction area. */
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  cursor: pointer;
}

/* WebKit/Blink. */
input[type="range"]::-webkit-slider-runnable-track {
  block-size: var(--slider-track-size);
  border: 0;
  border-radius: var(--slider-track-radius);
  background: linear-gradient(
    var(--slider-direction),
    var(--slider-fill-color) var(--slider-progress),
    var(--slider-track-color) var(--slider-progress)
  );
}

input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  inline-size: var(--slider-thumb-size);
  block-size: var(--slider-thumb-size);
  margin-block-start: calc(
    (var(--slider-track-size) - var(--slider-thumb-size)) / 2
  );
  border: 0;
  border-radius: var(--slider-thumb-radius);
  background: var(--slider-thumb-color);
}

/* Firefox. */
input[type="range"]::-moz-range-track {
  block-size: var(--slider-track-size);
  border: 0;
  border-radius: var(--slider-track-radius);
  background: var(--slider-track-color);
}

input[type="range"]::-moz-range-progress {
  block-size: var(--slider-track-size);
  border-radius: var(--slider-track-radius);
  background: var(--slider-fill-color);
}

input[type="range"]::-moz-range-thumb {
  inline-size: var(--slider-thumb-size);
  block-size: var(--slider-thumb-size);
  border: 0;
  border-radius: var(--slider-thumb-radius);
  background: var(--slider-thumb-color);
}

नेटिव अपियरेंस हटाने के बाद, हमेशा कीबोर्ड फ़ोकस इंडिकेटर दिखाएं. सिर्फ़ रंग का इस्तेमाल न करें:

input[type="range"]:focus-visible {
  outline: 2px solid var(--slider-fill-color);
  outline-offset: 4px;
}

ऐक्टिव ट्रैक को स्टाइल करना

जब ट्रैक के भरे हुए हिस्से को खाली ट्रैक से अलग स्टाइल किया जाता है, तो Firefox इसे ::-moz-range-progress के ज़रिए दिखाता है. WebKit/Blink, इसके जैसा कोई स्यूडो-एलिमेंट उपलब्ध नहीं कराता. इसलिए, input इवेंट पर लाइव इनपुट वैल्यू को --control-value से सिंक करें:

const slider = document.querySelector('#range-slider');

function syncSliderValue() {
  slider.style.setProperty('--control-value', slider.value);
}

syncSliderValue();
slider.addEventListener('input', syncSliderValue);

सीमाएं

  • WebKit और Firefox के सूडो-सिलेक्टर को कॉमा लगाकर अलग की गई लिस्ट में न जोड़ें (जैसे, ::-webkit-slider-thumb, ::-moz-range-thumb). अगर ब्राउज़र को किसी वेंडर का सूडो-एलिमेंट नहीं मिलता है, तो वह पूरे नियम को छोड़ देता है.

फ़ॉलबैक

accent-color के लिए फ़ॉलबैक और ब्राउज़र सहायता

accent-color प्रॉपर्टी, परतदार वृद्धि है. इस प्रॉपर्टी के साथ काम न करने वाले ब्राउज़र, इसे अनदेखा कर देंगे और अपने डिफ़ॉल्ट यूज़र इंटरफ़ेस (यूआई) के रंगों का इस्तेमाल करेंगे.

progress() और attr() के लिए फ़ॉलबैक और ब्राउज़र सहायता

जब progress() उपलब्ध न हो, तो calc() के साथ --slider-progress का हिसाब लगाएं:

@supports not (opacity: progress(1, 0, 100)) {
  input[type="range"] {
    --slider-progress: calc(
      (var(--control-value) - var(--attr-min)) /
      (var(--attr-max) - var(--attr-min)) * 100%
    );
  }
}

अगर टाइप किया गया attr() काम नहीं करता है, तो JavaScript में इनपुट के min और max एट्रिब्यूट से --attr-min और --attr-max को सिंक करें:

function syncSliderValue() {
  slider.style.setProperty('--attr-min', slider.min || 0);
  slider.style.setProperty('--attr-max', slider.max || 100);
  slider.style.setProperty('--control-value', slider.value);
}