html - 如何使 [input type="range"] 滑块上的每个点与滑块拇指的位置相匹配?
问题描述
我有一个滑块范围,用于选择一个点。滑块上的每个点对应于该点的值。Min 和 Max 属性被 jQuery 覆盖。
<div class="range">
<input id="form-range" type="range">
<ul class="range-labels">
<li class="range-label">0</li>
<li class="range-label">1</li>
<li class="range-label">2</li>
<li class="range-label">3</li>
</ul>
</div>
问题是每个标签都与滑块拇指不匹配(或者稍微偏移)。我已经使用jQuery计算了滑块的宽度,并抓取li
了.range-labels
类的每个子项,然后将每个子项的宽度设置为父项除以子项的数量(在这种情况下,.range
是100%的宽度和输入,和 ul 是父级的全宽)。
jQuery
let range_input = $('#form-range'); // Get input element
let range_input_parent = range_input.parent(); // Get input element parent
let range_labels = $('.range-labels').children('li'); // Get each li inside of ul for labels
let range_width = range_input.width(); // Get width of input element
function calculateWidth() {
// Get width of input parent
let range_width_parent = range_input_parent.width();
// Calculate width percentage of each li based on Parent width
range_input_width_percent = range_width / range_width_parent * 100;
}
function setMinMaxAttr() {
// Create empty variable as min
let min = 0;
// Create max variable based on total number of li elements in range
let max = $('.range-label').length;
// Set input attributes max / min respectively
range_input.attr('max', max);
range_input.attr('min', min);
}
setMinMaxAttr();
calculateWidth();
// Set widths of li elements to percentage of parent width
function setElementWidth() {
let el = range_input_width_percent / range_labels.length;
// Set width as %
$(range_labels).css("width", el + "%");
}
setElementWidth();
CSS
.range {
position: relative;
width: 100%;
height: 5px;
padding-top: 40px;
}
.range input {
width: 100%;
position: absolute;
top: 2px;
height: 0;
-webkit-appearance: none;
}
.range input::-webkit-slider-thumb {
-webkit-appearance: none;
width: 18px;
height: 18px;
margin: -8px 0 0;
border-radius: 50%;
background: #37adbf;
cursor: pointer;
border: 0 !important;
}
.range input::-moz-range-thumb {
width: 18px;
height: 18px;
margin: 0 0 0;
border-radius: 50%;
background: #37adbf;
cursor: pointer;
border: 0 !important;
}
.range input::-ms-thumb {
width: 18px;
height: 18px;
margin: 0 0 0;
border-radius: 50%;
background: #37adbf;
cursor: pointer;
border: 0 !important;
}
.range input::-webkit-slider-runnable-track {
width: 100%;
height: 2px;
cursor: pointer;
background: #b2b2b2;
}
.range input::-moz-range-track {
width: 100%;
height: 2px;
cursor: pointer;
background: #b2b2b2;
}
.range input::-ms-track {
width: 100%;
height: 2px;
cursor: pointer;
background: #b2b2b2;
}
.range input:focus {
background: none;
outline: none;
}
.range input::-ms-track {
width: 100%;
cursor: pointer;
background: transparent;
border-color: transparent;
color: transparent;
}
.range-labels {
margin-top: 20px;
padding: 0;
list-style: none;
display: flex;
flex-direction: row;
}
.range-labels li {
position: relative;
text-align: left;
color: #b2b2b2;
font-size: 14px;
cursor: pointer;
}
解决方案
推荐阅读
- javascript - 错误:无法从“/home/dolphin/sync/source/cruise-web”找到模块“@babel/plugin-proposal-decorators”
- javascript - 为什么这段代码会抛出“谷歌未定义”错误以及“TypeError:无法读取初始化时未定义的属性“PlacesService”-错误?
- git - GIT 定义简单的冲突解决策略
- java - 二叉搜索树选择方法实现
- python - 如何获取 3d np 数组的 np.amin 的索引?
- php - 改变woocommerce产品库的风格
- java - 如何使用springboot检查用户是否已添加到LDAP组
- java - 版本 9.4.34.v20201102 的 Jetty ServletTester 类
- c++ - 某些类型的右值和左值实例的 C++ 类型转换运算符的意外行为
- java - ConfigFileApplicationListener 已弃用,只能用作 EnvironmentPostProcessor