Javascript 允许多个滑块 sections/timeslots
Javascript Slider with Multiple Allowed sections/timeslots
我想实现时隙 select 或 jquery/javascript 滑块形式。
那里有一些滑块库,例如 Ion Slider、jQRangeSlider 等,但我不知道该如何处理。看起来他们不支持多个 "dead-zones".
我希望用户能够在特定的一天 select 一个时间段(从和到)。到 select 那天,我实现了一个日期选择器,然后对于日期,我检索已经占用的插槽,例如:
07h00 - Available
07h30 - Available
08h00 - Occupied
08h30 - Occupied
09h00 - Occupied
09h30 - Available
...
18h30 - Available
19h00 - Available
因此范围选择器必须如下所示:
用户只能 select 可用部分(蓝色)中的时区,并在 "available" 部分和结束部分之间拖动开始滑块 select 或者将随之移动。可能有多个不可用区域(红色)。
对于已经存在的库是否可行,或者这是我自己的情况?
我考虑过使用一堆复选框,然后选中开始和结束时隙之间的所有框,并禁用已经占用的时隙,但我认为这样的滑块对用户更友好使用,功能和视觉。
通过使用 CSS 将两个滑块叠加在一起,可以轻松制作双滑块。需要监听这两个的onchange事件,当设置为死区时将slider重置为之前的值或者壁橱非死区。
var deadZones = [[2,3], [6,7]];
function showVal(input) {
deadZones.forEach(([from, to]) => {
// reset to old value if in dead zone
if(from <= input.value && input.value <= to)
input.value = input.oldValue;
});
input.oldValue = input.value;
//console.log(input.id, input.value);
displayValues();
}
function displayValues() {
var a = $('#a').val();
var b = $('#b').val();
$('#slider-values').text(`Min: ${Math.min(a,b)} Max: ${Math.max(a,b)}`);
}
displayValues();
html,body{
margin: 0; padding: 0;
}
#a, #b{
position: absolute;
top: 30px;
display: block;
z-index: 100;
}
#b {
top: 60px;
}
/* from: https://css-tricks.com/styling-cross-browser-compatible-range-inputs-css/ */
input[type=range] {
-webkit-appearance: none; /* Hides the slider so that custom slider can be made */
width: 90%; /* Specific width is required for Firefox. */
background: transparent; /* Otherwise white in Chrome */
margin-left: 5%;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
border: 1px solid #000000;
height: 36px;
width: 16px;
border-radius: 3px;
background: #ffffff;
cursor: pointer;
automatic */
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; /* Add cool effects to your sliders! */
position: relative;
}
input[type=range]#a::-webkit-slider-thumb {
top: 100px;
}
input[type=range]#b::-webkit-slider-thumb {
top: 70px;
}
.slider-bg {
width: 100%;
margin: 0; padding: 0;
margin-left: 2.5%;
position: relative;
z-index: 1;
top: 135px;
}
.slider-bg div {
display: inline-block;
width: 9%;
margin: 0; padding: 0;
text-align: center;
border-top: 1px solid green;
padding-top: 20px;
}
.slider-bg div.disabled {
border-top: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="a" type="range" min="1" max="10" value="1" oninput="showVal(this)" onchange="showVal(this)" />
<input id="b" type="range" min="1" max="10" value="9" oninput="showVal(this)" onchange="showVal(this)"/>
<hr />
<div class="slider-bg">
<div>1</div>
<div class="disabled">2</div>
<div class="disabled">3</div>
<div>4</div>
<div>5</div>
<div class="disabled">6</div>
<div class="disabled">7</div>
<div>8</div>
<div>9</div>
<div>10</div>
</div>
<div id="slider-values"></div>
我决定实现一个带有从 05h30
到 19h30
的自定义插槽的 ionRangeSlider。我在 onChange
事件中与之比较的单独的 used
时隙数组。
var slider = $("#timeslotSlider").ionRangeSlider({
type: "double",
grid: true,
from: 1,
from_value: "06h00",
to: 2,
to_value: "06h30",
values: timeslotvalues,
onChange: function (data) {
timeslotSetSelectedText(data);
}
});
var sliderdata = slider.data("ionRangeSlider");
var dt = sliderdata.result.from_value != null ? sliderdata.result : sliderdata.options;
timeslotSetSelectedText(dt);
timeslotSetSelectedText
函数将所选范围与 used
槽进行比较,然后显示消息 "Available"
或 "Overlaps Existing time-slot"
在将所选插槽发送到服务器之前,使用相同的功能 Validate
。
我想实现时隙 select 或 jquery/javascript 滑块形式。
那里有一些滑块库,例如 Ion Slider、jQRangeSlider 等,但我不知道该如何处理。看起来他们不支持多个 "dead-zones".
我希望用户能够在特定的一天 select 一个时间段(从和到)。到 select 那天,我实现了一个日期选择器,然后对于日期,我检索已经占用的插槽,例如:
07h00 - Available
07h30 - Available
08h00 - Occupied
08h30 - Occupied
09h00 - Occupied
09h30 - Available
...
18h30 - Available
19h00 - Available
因此范围选择器必须如下所示:
用户只能 select 可用部分(蓝色)中的时区,并在 "available" 部分和结束部分之间拖动开始滑块 select 或者将随之移动。可能有多个不可用区域(红色)。
对于已经存在的库是否可行,或者这是我自己的情况?
我考虑过使用一堆复选框,然后选中开始和结束时隙之间的所有框,并禁用已经占用的时隙,但我认为这样的滑块对用户更友好使用,功能和视觉。
通过使用 CSS 将两个滑块叠加在一起,可以轻松制作双滑块。需要监听这两个的onchange事件,当设置为死区时将slider重置为之前的值或者壁橱非死区。
var deadZones = [[2,3], [6,7]];
function showVal(input) {
deadZones.forEach(([from, to]) => {
// reset to old value if in dead zone
if(from <= input.value && input.value <= to)
input.value = input.oldValue;
});
input.oldValue = input.value;
//console.log(input.id, input.value);
displayValues();
}
function displayValues() {
var a = $('#a').val();
var b = $('#b').val();
$('#slider-values').text(`Min: ${Math.min(a,b)} Max: ${Math.max(a,b)}`);
}
displayValues();
html,body{
margin: 0; padding: 0;
}
#a, #b{
position: absolute;
top: 30px;
display: block;
z-index: 100;
}
#b {
top: 60px;
}
/* from: https://css-tricks.com/styling-cross-browser-compatible-range-inputs-css/ */
input[type=range] {
-webkit-appearance: none; /* Hides the slider so that custom slider can be made */
width: 90%; /* Specific width is required for Firefox. */
background: transparent; /* Otherwise white in Chrome */
margin-left: 5%;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
border: 1px solid #000000;
height: 36px;
width: 16px;
border-radius: 3px;
background: #ffffff;
cursor: pointer;
automatic */
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; /* Add cool effects to your sliders! */
position: relative;
}
input[type=range]#a::-webkit-slider-thumb {
top: 100px;
}
input[type=range]#b::-webkit-slider-thumb {
top: 70px;
}
.slider-bg {
width: 100%;
margin: 0; padding: 0;
margin-left: 2.5%;
position: relative;
z-index: 1;
top: 135px;
}
.slider-bg div {
display: inline-block;
width: 9%;
margin: 0; padding: 0;
text-align: center;
border-top: 1px solid green;
padding-top: 20px;
}
.slider-bg div.disabled {
border-top: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="a" type="range" min="1" max="10" value="1" oninput="showVal(this)" onchange="showVal(this)" />
<input id="b" type="range" min="1" max="10" value="9" oninput="showVal(this)" onchange="showVal(this)"/>
<hr />
<div class="slider-bg">
<div>1</div>
<div class="disabled">2</div>
<div class="disabled">3</div>
<div>4</div>
<div>5</div>
<div class="disabled">6</div>
<div class="disabled">7</div>
<div>8</div>
<div>9</div>
<div>10</div>
</div>
<div id="slider-values"></div>
我决定实现一个带有从 05h30
到 19h30
的自定义插槽的 ionRangeSlider。我在 onChange
事件中与之比较的单独的 used
时隙数组。
var slider = $("#timeslotSlider").ionRangeSlider({
type: "double",
grid: true,
from: 1,
from_value: "06h00",
to: 2,
to_value: "06h30",
values: timeslotvalues,
onChange: function (data) {
timeslotSetSelectedText(data);
}
});
var sliderdata = slider.data("ionRangeSlider");
var dt = sliderdata.result.from_value != null ? sliderdata.result : sliderdata.options;
timeslotSetSelectedText(dt);
timeslotSetSelectedText
函数将所选范围与 used
槽进行比较,然后显示消息 "Available"
或 "Overlaps Existing time-slot"
在将所选插槽发送到服务器之前,使用相同的功能 Validate
。