svelte-range-slider-pips
Version:
Multi-Thumb, Accessible, Beautiful Range Slider with Pips
378 lines (317 loc) • 7.7 kB
CSS
/*
* RangeSlider
*/
.rangeSlider {
--slider: var(--range-slider, #d7dada);
--handle-inactive: var(--range-handle-inactive, #99a2a2);
--handle: var(--range-handle, #838de7);
--handle-focus: var(--range-handle-focus, #4a40d4);
--handle-border: var(--range-handle-border, var(--handle));
--range-inactive: var(--range-range-inactive, var(--handle-inactive));
--range: var(--range-range, var(--handle-focus));
--range-limit: var(--range-range-limit, #99a2a280);
--float-inactive: var(--range-float-inactive, var(--handle-inactive));
--float: var(--range-float, var(--handle-focus));
--float-text: var(--range-float-text, white);
}
.rangeSlider {
position: relative;
border-radius: 100px;
height: 0.5em;
margin: 1em;
transition: opacity 0.2s ease;
user-select: none;
}
.rangeSlider * {
user-select: none;
}
.rangeSlider.pips {
margin-bottom: 1.8em;
}
.rangeSlider.pip-labels {
margin-bottom: 2.8em;
}
.rangeSlider.vertical {
display: inline-block;
border-radius: 100px;
width: 0.5em;
min-height: 200px;
}
.rangeSlider.vertical.pips {
margin-right: 1.8em;
margin-bottom: 1em;
}
.rangeSlider.vertical.pip-labels {
margin-right: 2.8em;
margin-bottom: 1em;
}
.rangeSlider .rangeHandle {
position: absolute;
display: block;
height: 1.4em;
width: 1.4em;
top: 0.25em;
bottom: auto;
transform: translateY(-50%) translateX(-50%);
z-index: 2;
}
.rangeSlider.reversed .rangeHandle {
transform: translateY(-50%) translateX(50%);
}
.rangeSlider.vertical .rangeHandle {
left: 0.25em;
top: auto;
transform: translateY(50%) translateX(-50%);
}
.rangeSlider.vertical.reversed .rangeHandle {
transform: translateY(-50%) translateX(-50%);
}
.rangeSlider .rangeNub,
.rangeSlider .rangeHandle:before {
position: absolute;
left: 0;
top: 0;
display: block;
border-radius: 10em;
height: 100%;
width: 100%;
transition: box-shadow 0.2s ease;
}
.rangeSlider .rangeHandle:before {
content: '';
left: 1px;
top: 1px;
bottom: 1px;
right: 1px;
height: auto;
width: auto;
box-shadow: 0 0 0 0px var(--handle-border);
opacity: 0;
}
.rangeSlider.hoverable:not(.disabled) .rangeHandle:hover:before {
box-shadow: 0 0 0 8px var(--handle-border);
opacity: 0.2;
}
.rangeSlider.hoverable:not(.disabled) .rangeHandle.press:before,
.rangeSlider.hoverable:not(.disabled) .rangeHandle.press:hover:before {
box-shadow: 0 0 0 12px var(--handle-border);
opacity: 0.4;
}
.rangeSlider.range:not(.min):not(.max) .rangeNub {
border-radius: 10em 10em 10em 1.6em;
}
.rangeSlider.range .rangeHandle:nth-of-type(1) .rangeNub {
transform: rotate(-135deg);
}
.rangeSlider.range .rangeHandle:nth-of-type(2) .rangeNub {
transform: rotate(45deg);
}
.rangeSlider.range.reversed .rangeHandle:nth-of-type(1) .rangeNub {
transform: rotate(45deg);
}
.rangeSlider.range.reversed .rangeHandle:nth-of-type(2) .rangeNub {
transform: rotate(-135deg);
}
.rangeSlider.range.vertical .rangeHandle:nth-of-type(1) .rangeNub {
transform: rotate(135deg);
}
.rangeSlider.range.vertical .rangeHandle:nth-of-type(2) .rangeNub {
transform: rotate(-45deg);
}
.rangeSlider.range.vertical.reversed .rangeHandle:nth-of-type(1) .rangeNub {
transform: rotate(-45deg);
}
.rangeSlider.range.vertical.reversed .rangeHandle:nth-of-type(2) .rangeNub {
transform: rotate(135deg);
}
.rangeSlider .rangeFloat {
display: block;
position: absolute;
left: 50%;
top: -0.5em;
transform: translate(-50%, -100%);
font-size: 1em;
text-align: center;
opacity: 0;
pointer-events: none;
white-space: nowrap;
transition: all 0.2s ease;
font-size: 0.9em;
padding: 0.2em 0.4em;
border-radius: 0.2em;
}
.rangeSlider .rangeHandle.active .rangeFloat,
.rangeSlider.hoverable .rangeHandle:hover .rangeFloat {
opacity: 1;
top: -0.2em;
transform: translate(-50%, -100%);
}
.rangeSlider .rangeBar,
.rangeSlider .rangeLimit {
position: absolute;
display: block;
transition: background 0.2s ease;
border-radius: 1em;
height: 0.5em;
top: 0;
user-select: none;
z-index: 1;
}
.rangeSlider.vertical .rangeBar,
.rangeSlider.vertical .rangeLimit {
width: 0.5em;
height: auto;
}
.rangeSlider {
background-color: #d7dada;
background-color: var(--slider);
}
.rangeSlider .rangeBar {
background-color: #99a2a2;
background-color: var(--range-inactive);
}
.rangeSlider.focus .rangeBar {
background-color: #838de7;
background-color: var(--range);
}
.rangeSlider .rangeLimit {
background-color: #99a2a280;
background-color: var(--range-limit);
}
.rangeSlider .rangeNub {
background-color: #99a2a2;
background-color: var(--handle-inactive);
}
.rangeSlider.focus .rangeNub {
background-color: #838de7;
background-color: var(--handle);
}
.rangeSlider .rangeHandle.active .rangeNub {
background-color: #4a40d4;
background-color: var(--handle-focus);
}
.rangeSlider .rangeFloat {
color: white;
color: var(--float-text);
background-color: #99a2a2;
background-color: var(--float-inactive);
}
.rangeSlider.focus .rangeFloat {
background-color: #4a40d4;
background-color: var(--float);
}
.rangeSlider.disabled {
opacity: 0.5;
}
.rangeSlider.disabled .rangeNub {
background-color: #d7dada;
background-color: var(--slider);
}
/**
* RangePips
*/
.rangeSlider {
--pip: var(--range-pip, lightslategray);
--pip-text: var(--range-pip-text, var(--pip));
--pip-active: var(--range-pip-active, darkslategrey);
--pip-active-text: var(--range-pip-active-text, var(--pip-active));
--pip-hover: var(--range-pip-hover, darkslategrey);
--pip-hover-text: var(--range-pip-hover-text, var(--pip-hover));
--pip-in-range: var(--range-pip-in-range, var(--pip-active));
--pip-in-range-text: var(--range-pip-in-range-text, var(--pip-active-text));
}
.rangePips {
position: absolute;
height: 1em;
left: 0;
right: 0;
bottom: -1em;
font-variant-numeric: tabular-nums;
}
.rangePips.vertical {
height: auto;
width: 1em;
left: 100%;
right: auto;
top: 0;
bottom: 0;
}
.rangePips .pip {
height: 0.4em;
position: absolute;
top: 0.25em;
width: 1px;
white-space: nowrap;
}
.rangePips.vertical .pip {
height: 1px;
width: 0.4em;
left: 0.25em;
top: auto;
bottom: auto;
}
.rangePips .pipVal {
position: absolute;
top: 0.4em;
transform: translate(-50%, 25%);
}
.rangePips.vertical .pipVal {
position: absolute;
top: 0;
left: 0.4em;
transform: translate(25%, -50%);
}
.rangePips .pip {
transition: all 0.15s ease;
}
.rangePips .pipVal {
transition:
all 0.15s ease,
font-weight 0s linear;
}
.rangePips .pip {
color: lightslategray;
color: var(--pip-text);
background-color: lightslategray;
background-color: var(--pip);
}
.rangePips .pip.selected {
color: darkslategrey;
color: var(--pip-active-text);
background-color: darkslategrey;
background-color: var(--pip-active);
}
.rangePips.hoverable:not(.disabled) .pip:hover {
color: darkslategrey;
color: var(--pip-hover-text);
background-color: darkslategrey;
background-color: var(--pip-hover);
}
.rangePips .pip.in-range {
color: darkslategrey;
color: var(--pip-in-range-text);
background-color: darkslategrey;
background-color: var(--pip-in-range);
}
.rangePips .pip.selected {
height: 0.75em;
}
.rangePips.vertical .pip.selected {
height: 1px;
width: 0.75em;
}
.rangePips .pip.selected .pipVal {
font-weight: bold;
top: 0.75em;
}
.rangePips.vertical .pip.selected .pipVal {
top: 0;
left: 0.75em;
}
.rangePips.hoverable:not(.disabled) .pip:not(.selected):hover {
transition: none;
}
.rangePips.hoverable:not(.disabled) .pip:not(.selected):hover .pipVal {
transition: none;
font-weight: bold;
}