Slider
Range sliders for selecting values within a defined range with smooth interactions.
Slider Variants
Basic Slider
Slider with Marks
Price Range Slider
Disabled Slider
Real Estate Use Cases
Property Search Filters
Implementation Guide
HTML Structure
<!-- Basic Slider -->
<div class="lyd-slider-container">
<label class="lyd-slider-label">
Label Text
<span class="lyd-slider-value" id="value">50</span>
</label>
<input type="range" class="lyd-slider" id="slider"
min="0" max="100" value="50" step="1">
</div>
<!-- Slider with Marks -->
<div class="lyd-slider-container">
<input type="range" class="lyd-slider" min="1" max="5" value="3">
<div class="lyd-slider-marks">
<span class="lyd-slider-mark">1</span>
<span class="lyd-slider-mark">2</span>
<span class="lyd-slider-mark">3</span>
<span class="lyd-slider-mark">4</span>
<span class="lyd-slider-mark">5</span>
</div>
</div>
JavaScript Functions
// Update value display
function setupSlider(sliderId, valueId, format = (v) => v) {
const slider = document.getElementById(sliderId);
const value = document.getElementById(valueId);
slider.addEventListener('input', (e) => {
value.textContent = format(e.target.value);
});
}
// Range slider
function setupRangeSlider(minId, maxId, selectedId, valueId) {
const minSlider = document.getElementById(minId);
const maxSlider = document.getElementById(maxId);
const selected = document.getElementById(selectedId);
const value = document.getElementById(valueId);
function updateRange() {
const min = parseInt(minSlider.value);
const max = parseInt(maxSlider.value);
// Prevent overlap
if (min > max) {
if (this.id === minId) {
maxSlider.value = min;
} else {
minSlider.value = max;
}
}
// Update visual
const percentMin = (minSlider.value / minSlider.max) * 100;
const percentMax = (maxSlider.value / maxSlider.max) * 100;
selected.style.left = percentMin + '%';
selected.style.width = (percentMax - percentMin) + '%';
// Update text
value.textContent = `€${minSlider.value}k - €${maxSlider.value}k`;
}
minSlider.addEventListener('input', updateRange);
maxSlider.addEventListener('input', updateRange);
updateRange();
}
// Initialize
setupSlider('size-slider', 'size-value', (v) => v + ' m²');
setupSlider('bedroom-slider', 'bedroom-value');
setupRangeSlider('price-min', 'price-max', 'price-range-selected', 'price-range-value');
React/Next.js Component
// components/Slider.tsx
import { InputHTMLAttributes, useState } from 'react';
interface SliderProps extends Omit, 'type'> {
label?: string;
showValue?: boolean;
formatValue?: (value: number) => string;
marks?: number[] | string[];
}
export const Slider = ({
label,
showValue = true,
formatValue = (v) => String(v),
marks,
min = 0,
max = 100,
value: initialValue = 50,
onChange,
...props
}: SliderProps) => {
const [value, setValue] = useState(initialValue);
const handleChange = (e: React.ChangeEvent) => {
const newValue = Number(e.target.value);
setValue(newValue);
onChange?.(e);
};
return (
<div className="lyd-slider-container">
{label && (
<label className="lyd-slider-label">
{label}
{showValue && (
<span className="lyd-slider-value">
{formatValue(Number(value))}
</span>
)}
</label>
)}
<input
type="range"
className="lyd-slider"
min={min}
max={max}
value={value}
onChange={handleChange}
{...props}
/>
{marks && (
<div className="lyd-slider-marks">
{marks.map((mark, index) => (
<span key={index} className="lyd-slider-mark">
{mark}
</span>
))}
</div>
)}
</div>
);
};
API Reference
| Class | Description |
|---|---|
.lyd-slider-container |
Container for slider and labels |
.lyd-slider |
Base slider input |
.lyd-slider-label |
Label for slider |
.lyd-slider-value |
Current value display |
.lyd-slider-marks |
Container for tick marks |
.lyd-slider-mark |
Individual tick mark |
.lyd-range-slider |
Container for range slider |
.lyd-range-track |
Background track for range |
.lyd-range-selected |
Selected range highlight |
Accessibility & Best Practices
Accessibility Features
- Native range input for keyboard support
- Arrow keys for precise control
- Labels associated with sliders
- Visual value feedback
- ARIA attributes for screen readers
Best Practices
- Always show current value
- Use appropriate step values
- Provide min/max context
- Consider adding tick marks for discrete values
- Use range sliders for min/max selections
- Format values appropriately (currency, units)