Range Slider
Native HTML5 range input with data-size support, tick marks, and optional value displays. Works by default, enhances with data attributes.
Example
<label for="volume">Volume</label>
<div class="omni-range">
<input type="range" id="volume" min="0" max="100" value="50">
</div>
Sizes
Use data-size to adjust track height and thumb dimensions:
Small
Medium (default)
Large
<div class="omni-range" data-size="sm">
<input type="range" min="0" max="100" value="30">
</div>
<div class="omni-range">
<input type="range" min="0" max="100" value="50">
</div>
<div class="omni-range" data-size="lg">
<input type="range" min="0" max="100" value="70">
</div>
With Value Display
Show the current value above the slider using .omni-range-value:
<label for="brightness">Brightness: <output id="brightness-value">50</output>%</label>
<div class="omni-range">
<input type="range" id="brightness" min="0" max="100" value="50"
aria-describedby="brightness-value">
</div>
With Min/Max Labels
Add min and max labels using .omni-range-labels:
0°F
100°F
<label for="temperature">Temperature</label>
<div class="omni-range">
<input type="range" id="temperature" min="0" max="100" value="72">
<div class="omni-range-labels">
<span>0°F</span>
<span>100°F</span>
</div>
</div>
With Tick Marks
Add tick marks and labels using .omni-range-ticks:
0
1
2
3
4
5
<label for="rating">Rating</label>
<div class="omni-range">
<input type="range" id="rating" min="0" max="5" step="1" value="3">
<div class="omni-range-ticks">
<span class="omni-range-tick">0</span>
<span class="omni-range-tick">1</span>
<span class="omni-range-tick">2</span>
<span class="omni-range-tick">3</span>
<span class="omni-range-tick">4</span>
<span class="omni-range-tick">5</span>
</div>
</div>
Vertical Orientation
Use data-orientation="vertical" for vertical sliders:
0
100
<label for="volume">Volume</label>
<div class="omni-range" data-orientation="vertical">
<input type="range" id="volume" min="0" max="100" value="60">
<div class="omni-range-labels">
<span>0</span>
<span>100</span>
</div>
</div>
States
Disabled
<div class="omni-range">
<input type="range" min="0" max="100" value="40" disabled>
</div>
Dual Range (Tier 2)
Price range or other dual-value scenarios require JavaScript (planned for Tier 2):
$20
$70
Note: Dual range requires JavaScript for full interactivity (Tier 2 component).
<label>Price Range</label>
<div class="omni-range-dual">
<div class="omni-range-dual-track">
<div class="omni-range-track-fill"></div>
</div>
<input type="range" min="0" max="100" value="20">
<input type="range" min="0" max="100" value="70">
<div class="omni-range-dual-values">
<span>$20</span>
<span>$70</span>
</div>
</div>
<!-- Requires JS for thumb coordination and track fill updates -->
API Reference
Data Attributes
| Attribute | Values | Default | Description |
|---|---|---|---|
data-size |
sm, md, lg | md | Track height and thumb size |
data-orientation |
horizontal, vertical | horizontal | Slider orientation |
Classes
| Class | Element | Description |
|---|---|---|
.omni-range |
Container | Required wrapper for range input |
.omni-range-value |
Optional | Current value display above slider |
.omni-range-labels |
Optional | Min/max labels container |
.omni-range-ticks |
Optional | Tick marks container |
.omni-range-tick |
Optional | Individual tick mark with label |
.omni-range-dual |
Container (Tier 2) | Dual range slider wrapper (requires JS) |
Native Input Attributes
| Attribute | Type | Description |
|---|---|---|
min |
number | Minimum value (default: 0) |
max |
number | Maximum value (default: 100) |
step |
number | Value increment (default: 1) |
value |
number | Current value |
disabled |
boolean | Disable interaction |
CSS Custom Properties
| Property | Default | Description |
|---|---|---|
--omni-variant-track-height |
0.5rem (md) | Height of slider track |
--omni-variant-thumb-size |
1.25rem (md) | Size of slider thumb |
--omni-variant-label-gap |
var(--omni-space-2) | Spacing for labels |
--omni-variant-label-font-size |
var(--omni-text-sm) | Font size for labels |
Accessibility
- All range inputs MUST have associated
<label>elements with matchingforandidattributes - Full keyboard navigation support (Arrow keys, Home, End, Page Up, Page Down)
- Focus visible indicator with primary color ring
- Disabled state prevents interaction and conveys state visually
- When displaying current value, use
<output>element witharia-describedbyon input - Respects
prefers-reduced-motionto disable thumb animations - Use
aria-labeloraria-labelledbyfor vertical sliders to clarify orientation - Provide meaningful min/max values and appropriate step increments
- Cross-browser compatible (WebKit and Firefox vendor prefixes included)
Best Practices
- Always provide visible labels for range inputs
- Consider showing the current value for better user feedback
- Use appropriate
min,max, andstepvalues for your use case - For discrete values (like ratings), use tick marks to show available options
- Vertical sliders work best for controls like volume or brightness
- Add min/max labels when the range units aren't obvious
- Use
data-size="lg"for touch-friendly interfaces