javascript - 如何创建一个显示日期的滑块,有没有办法根据滑块的位置使标记出现在网站上?
问题描述
过去一天我一直在努力创建一个只显示日期的滑块,由于某种原因,当我写input type="date"
而不是input type="range"
滑块总是停止工作时。谁能给我看一个显示日期的滑块的示例代码?
还有一件事我想知道是否可以根据滑块的位置在网站中显示或隐藏图像/标记/文本?例如,如果我在我的网站中添加地图图像,我可以使用滑块在此地图上显示和消失不同的标记吗?如果这确实是可能的,请指出我可以阅读的资源!
编辑:很抱歉没有添加我的尝试,他们在这里。这是基于我在互联网上找到的一些滑块。这是滑块input type="date"
不起作用的示例。如果我将其更改为input type="range"
它会再次开始工作。
var slider = document.getElementById("myRange");
var output = document.getElementById("demo");
output.innerHTML = slider.value;
slider.oninput = function() {
output.innerHTML = this.value;
}
.slidecontainer {
width: 100%;
}
.slider {
-webkit-appearance: none;
width: 100%;
height: 25px;
background: #d3d3d3;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
}
.slider:hover {
opacity: 1;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 25px;
height: 25px;
background: #4CAF50;
cursor: pointer;
}
.slider::-moz-range-thumb {
width: 25px;
height: 25px;
background: #4CAF50;
cursor: pointer;
}
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<h1>Slider</h1>
<p>Slidertext</p>
<div class="slidecontainer">
<input type="date" min="1900-1-1" max="1910-1-1" value="50" class="slider" id="myRange">
<p>Value: <span id="demo"></span></p>
</div>
解决方案
您需要使用范围输入,然后使用其值来设置日期输入的值。范围的最小值和最大值应基于日期范围中的天数,这些天数是从日期输入的最小值和最大值中检索的。
反向操作以根据日期更改设置范围滑块。
// Parse date in YYYY-MM-DD format as local date
function parseISOLocal(s) {
let [y, m, d] = s.split('-');
return new Date(y, m - 1, d);
}
// Format date as YYYY-MM-DD
function dateToISOLocal(date) {
let z = n => ('0' + n).slice(-2);
return date.getFullYear() + '-' + z(date.getMonth() + 1) + '-' + z(date.getDate());
}
// Convert range slider value to date string
function range2date(evt) {
let dateInput = document.querySelector('#d0');
let minDate = parseISOLocal(dateInput.defaultValue);
minDate.setDate(minDate.getDate() + Number(this.value));
dateInput.value = dateToISOLocal(minDate);
}
// Convert entered date to range
function date2range(evt) {
let date = parseISOLocal(this.value);
let numDays = (date - new Date(this.min)) / 8.64e7;
document.querySelector('#r0').value = numDays;
}
window.onload = function() {
let rangeInput = document.querySelector('#r0');
let dateInput = document.querySelector('#d0');
// Get the number of days from the date min and max
// Dates in YYYY-MM-DD format are treated as UTC
// so will be exact whole days
let rangeMax = (new Date(dateInput.max) - new Date(dateInput.min)) / 8.64e7;
// Set the range min and max values
rangeInput.min = 0;
rangeInput.max = rangeMax;
// Add listener to set the date input value based on the slider
rangeInput.addEventListener('input', range2date, false);
// Add listener to set the range input value based on the date
dateInput.addEventListener('change', date2range, false);
}
<input id="r0" type="range" min="0" max="3652" value="0"><br>
<input id="d0" type="date" min="1900-01-01" max="1910-01-01" value="1900-01-01">
推荐阅读
- javascript - 来自两点的Javascript字符串
- php - 链接更新后,Wordpress Html5Blank 无法读取我的 style.css
- java - 将在 Apex 销售人员闪电中反序列化的 Json 响应
- java - com.sun.jna.LastErrorException:[997] 重叠 I/O 操作正在进行中
- python - Python中残差与预测值的残差图
- r - 如何在一个 ggplot 中制作多个图?
- javascript - 如何通过 JS 中的 formidable.IncomingForm() 获取所选选项的值?
- fortran - 有没有一种简单的方法来重构或编译用于行主要存储的 Fortran 代码?
- c - 如何在我的“内核”中实现 newlin(\n)?
- python - python中的can.Bus实例可以同时接收和传输吗?