নেটিভ রেঞ্জ ইনপুট ব্যবহার করুন
<div> এলিমেন্ট বা কাস্টম পয়েন্টার হ্যান্ডলার সহ স্লাইডার আবার তৈরি করার পরিবর্তে লেবেল করা <input type="range"> ব্যবহার করুন। নেটিভ কন্ট্রোল কীবোর্ড ও পয়েন্টার ইন্টার্যাকশন, টাচ বিহেভিয়ার ও অ্যাক্সেসিবিলিটি সাপোর্ট বজায় রাখে। ব্যবহারের ক্ষেত্রের জন্য min, max, step ও value কনফিগার করুন।
<label for="range-slider">Volume</label>
<input type="range" id="range-slider" value="70"/>
ভ্যালুর জন্য ফর্ম্যাট করা লেবেল বা ইউনিট প্রয়োজন হলে, সাধারণ DOM কন্টেন্টে এটি দেখান এবং পরিবর্তন করা হলে aria-valuetext আপডেট করুন। স্লাইডার সিউডো-এলিমেন্টে ::before বা ::after ব্যবহার করবেন না, কারণ ফর্ম কন্ট্রোলে জেনারেট করা কন্টেন্ট ইন্টারঅপারেবল নয়। থাম্ব অনুসরণ করে এমন টুলটিপ প্রয়োজন হলে, CSS অ্যাঙ্কর পজিশনিংয়ের মাধ্যমে থাম্বে অ্যাঙ্কর করুন; টুলটিপ ফ্লিপ করার সময় সঠিকভাবে ওরিয়েন্ট করা টুলটিপের জন্য পজিশন অ্যাওয়ার টুলটিপ দেখুন।
স্টাইলিং অ্যাপ্রোচ বেছে নিন
সহজ রঙ কাস্টমাইজেশনের জন্য, ব্র্যান্ড-কনসিস্টেন্ট ফর্ম ব্যবহার করুন এবং ব্রাউজারের নেটিভ রেন্ডারিং বজায় রাখুন:
input[type="range"] {
accent-color: var(--brand-color);
}
accent-color সম্পূর্ণ স্লাইডার স্টাইলিং API নয়। থাম্ব, ট্র্যাক ও ফিল-এর উপর এর প্রভাব ইউজার-এজেন্টের উপর নির্ভর করে। ট্র্যাক, থাম্ব, ডাইমেনশন, আকার বা ফিল কন্ট্রোল করতে হলে নিচের ছদ্ম-এলিমেন্ট ব্যবহার করুন।
ট্র্যাক ও থাম্ব স্টাইল করুন
appearance: none, margin: 0 এবং border: 0-এর মাধ্যমে ডিফল্ট OS স্টাইলিং রিসেট করুন। ক্রস-ব্রাউজার রেন্ডারিং স্বাভাবিক করতে, আলাদা রুল ব্লকে 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 প্রপার্টি হল প্রোগ্রেসিভ এনহ্যান্সমেন্ট।
যেসব ব্রাউজারে এই প্রপার্টি কাজ করে না, সেগুলি এটি উপেক্ষা করবে এবং ডিফল্ট UI কালার ব্যবহার করবে।
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() কাজ না করলে, জাভাস্ক্রিপ্টে ইনপুটের 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);
}