double ranged slider added

This commit is contained in:
perry-C 2021-07-30 00:26:08 +08:00
parent 38a9011f10
commit ff583842d7
4 changed files with 115 additions and 97 deletions

View File

@ -5,18 +5,16 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
<title>OMI Slider Demo</title>
</head>
<body>
<div id="root">
<script type="module" src="/src/index.tsx"></script>
<o-slider min="0" max="100" value="50 " id="single-range-demo"></o-slider>
<o-slider min="0" max="100" value="20" double_range id="double-range-demo"></o-slider>
<!-- <o-slider min="0" max="100" value="10" id="double-range-demo"></o-slider> -->
<!-- <o-slider min="0" max="100" value="10" vertical id="vertical-demo"></o-slider> -->
<o-slider min="0" max="10" value="2 " id="single-range-demo"></o-slider>
<o-slider min="0" max="200" value="20" second_value="70" double_range id="double-range-demo"></o-slider>
<o-slider min="0" max="100" value="10" vertical id="vertical-demo" style="position: relative; margin-top: 200px; left:-150px; width: 400px"></o-slider>

View File

@ -5,20 +5,15 @@
// excess height to improve interactive area / accessibility
$height: 30px;
$thumb-height: 16px;
$track-height: 16px;
$thumb-height: 40px;
$track-height: 30px;
// colours
$upper-color: $o-surface;
$lower-color: $o-primary;
$thumb-color: $o-primary-fade-little;
$thumb-color: $o-primary;
$track-color: $o-primary-active;
$upper-background: linear-gradient(to bottom, $upper-color, $upper-color) 100%
50% / 100% $track-height no-repeat transparent;
$lower-background: linear-gradient(to bottom, $lower-color, $lower-color) 100%
50% / 100% $track-height no-repeat transparent;
$shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
@mixin thumb {
@ -26,20 +21,27 @@ $shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
height: $thumb-height;
width: $thumb-height;
background-color: $thumb-color;
// border-radius: 100%;
top: 50%;
margin-top: math.div($thumb-height, -2);
// box-shadow: webkit-slider-thumb-shadow();
// ? for round
// border-radius: 8px;
outline: 2px solid $o-surface;
outline-offset: -4px;
outline-offset: -12px;
cursor: pointer;
pointer-events: auto;
z-index: 2;
transition: outline-offset 150ms;
&:hover,
&:focus {
outline-offset: -14px;
}
// transform: rotate(180deg);
}
@mixin track {
@ -47,28 +49,18 @@ $shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
position: relative;
margin: 5px;
height: $track-height;
background-color: $track-color;
background-color: $o-surface;
box-shadow: $shadow;
// ? for round
// border-radius: 8px;
border: 2px solid $o-primary;
transition: background-color 150ms;
transition: background-color 200ms;
-webkit-appearance: none;
}
// Webkit cannot style progress so we fake it with a long shadow
// on the thumb element
// @function webkit-slider-thumb-shadow($i: 1) {
// $val: #{$i}px 0 0 -#{math.div($thumb-height - $track-height, 2)} #{$upper-color};
// @if $i == 1 {
// @for $k from 2 through 1000 {
// $val: #{$val}, webkit-slider-thumb-shadow($k);
// }
// }
// @return $val;
// }
:host {
display: -ms-grid;
display: grid;
@ -78,22 +70,19 @@ $shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
position: relative;
width: 100%;
height: 50px;
border: 1px solid #000000;
}
.slider-track {
width: 100%;
height: 5px;
background-color: grey;
@include track; // width: 100%;
position: absolute;
top: 0;
bottom: 0;
outline: none;
margin: auto;
border-radius: 5x;
// border-radius: 5x;
}
.o-slider {
.slider-container .o-slider {
width: 100%;
-webkit-appearance: none;
-moz-appearance: none;
@ -101,24 +90,27 @@ $shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
position: absolute;
top: 0;
bottom: 0;
// height: $height;
pointer-events: none;
background: transparent;
//*--------------track-----------------
&::-webkit-slider-runnable-track {
@include track;
-webkit-appearance: none;
height: $track-height;
overflow: hidden;
}
&::-moz-range-track {
@include track;
-moz-appearance: none;
height: $track-height;
overflow: hidden;
z-index: 1;
}
&::-ms-track {
@include track;
appearance: none;
height: $track-height;
overflow: hidden;
}
//*--------------thumb-----------------
&::-webkit-slider-thumb {
@ -134,7 +126,6 @@ $shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
appearance: none;
}
}
.is-vertical {
transform: rotate(-90deg);
}

View File

@ -1,5 +1,4 @@
import { WeElement, h, tag, extractClass } from 'omi'
import Script from './script'
import * as css from './index.scss'
@ -8,18 +7,20 @@ interface Props {
max?: number
step?: number
value?: number
second_value?: number
double_range?: boolean
vertical?: boolean
}
// window.onload = function () {
// slideOne()
// slideTwo()
// }
@tag('o-slider')
export default class OSlider extends WeElement<Props> {
static css = css.default
__$value: number
__$valueSecond: number
static defaultProps = {
min: 0,
max: 100,
@ -35,56 +36,117 @@ export default class OSlider extends WeElement<Props> {
max: Number,
step: Number,
value: Number,
second_value: Number,
double_range: Boolean,
vertical: Boolean
}
handleInput = (evt) => {
const sliderList =
this.shadowRoot.getElementById('slider-container').children
this.__$value = sliderList[0].value
__$value: number
this.props.double_range && (this.__$valueSecond = sliderList[1].value)
console.log(this.__$value, this.__$valueSecond)
__$second_value: number
rootNode
sliderOne
sliderTwo
sliderTrack
sliderMax = this.props.max
handleSliderOne = () => {
const first_value = parseInt(this.rootNode.children[0].value)
if (this.__$second_value === null || first_value <= this.__$second_value) {
this.__$value = first_value
}
console.log(this.__$value, this.__$second_value)
// this.displayValOne.textContent = this.sliderOne.value
this.fillColor()
this.update()
}
install() {
this.__$value = this.props.value as any
handleSliderTwo = () => {
console.log(this.__$value, this.__$second_value)
const second_value = parseInt(this.rootNode.children[1].value)
if (second_value >= this.__$value) {
this.__$second_value = second_value
}
// this.displayValTwo.textContent = this.sliderTwo.value
this.fillColor()
this.update()
}
fillColor = () => {
let percent1 = (this.__$value / this.props.max) * 100
let percent2 = (this.__$second_value / this.props.max) * 100
this.props.double_range
? (this.sliderTrack.style.background = `linear-gradient(to right, #ffffff ${percent1}% , #07c160 ${percent1}% , #07c160 ${percent2}%, #ffffff ${percent2}%)`)
: (this.sliderTrack.style.background = `linear-gradient(to right, #07c160 ${percent1}% , #07c160 ${percent1}% , #07c160 ${percent2}%, #ffffff ${percent2}%)`)
}
install() {
this.props.value
? (this.__$value = this.props.value as any)
: (this.__$value = OSlider.defaultProps.value)
this.props.second_value
this.__$second_value = this.props.second_value as any
}
installed() {
this.fillColor()
this.update()
}
updated() {}
render(props) {
console.log(props)
const cls = extractClass(props, 'o-slider', {
const cls = extractClass(props, 'slider-container', {
'is-vertical': props.vertical
})
console.log(cls)
return (
<div class="slider-container" id="slider-container">
<div
{...cls}
ref={(e) => {
this.rootNode = e
}}
>
<input
{...cls}
class="o-slider"
type="range"
min={props.min}
max={props.max}
value={this.__$value}
onInput={this.handleInput}
id="inputA"
onInput={this.handleSliderOne}
id="slider-1"
ref={(e) => {
this.sliderOne = e
}}
/>
{props.double_range && (
<input
{...cls}
class="o-slider"
type="range"
min={props.min}
max={props.max}
value={this.__$valueSecond}
onInput={this.handleInput}
id="inputB"
value={this.__$second_value}
onInput={this.handleSliderTwo}
id="slider-2"
ref={(e) => {
this.sliderTwo = e
}}
/>
)}
<div
class="slider-track"
ref={(e) => {
this.sliderTrack = e
}}
></div>
{/* <button oninput={console.log(this.sliderContainer.style)}></button> */}
</div>

View File

@ -1,33 +0,0 @@
window.onload = function(){
slideOne();
slideTwo();
}
let sliderOne = document.getElementById("slider-1");
let sliderTwo = document.getElementById("slider-2");
let displayValOne = document.getElementById("range1");
let displayValTwo = document.getElementById("range2");
let minGap = 0;
let sliderTrack = document.querySelector(".slider-track");
let sliderMaxValue = document.getElementById("slider-1").max;
function slideOne(){
if(parseInt(sliderTwo.value) - parseInt(sliderOne.value) <= minGap){
sliderOne.value = parseInt(sliderTwo.value) - minGap;
}
displayValOne.textContent = sliderOne.value;
fillColor();
}
function slideTwo(){
if(parseInt(sliderTwo.value) - parseInt(sliderOne.value) <= minGap){
sliderTwo.value = parseInt(sliderOne.value) + minGap;
}
displayValTwo.textContent = sliderTwo.value;
fillColor();
}
function fillColor(){
percent1 = (sliderOne.value / sliderMaxValue) * 100;
percent2 = (sliderTwo.value / sliderMaxValue) * 100;
sliderTrack.style.background = `linear-gradient(to right, #dadae5 ${percent1}% , #3264fe ${percent1}% , #3264fe ${percent2}%, #dadae5 ${percent2}%)`;
}