【标题】原生js实现可兼容PC和移动端的拖动滑块功能详解
【简介】本文将详细讲解如何使用原生JS实现可兼容PC和移动端的拖动滑块功能,这对于一些需要用户进行数值选择的网站或应用非常有用。
【具体步骤】
- HTML部分
为了实现滑块功能,我们需要在HTML中创建一个滑块的DOM元素,具体代码如下:
<div class="slider-container">
<div class="slider-bar"></div>
<div class="slider-handle"></div>
</div>
其中,.slider-container
是滑块的容器,.slider-bar
是滑动条,.slider-handle
是可拖动的滑块块。
- CSS部分
为了让滑块具有样式,我们需要在CSS中为这些DOM元素添加样式,具体代码如下:
.slider-container {
width: 300px;
height: 20px;
position: relative;
margin: 20px;
}
.slider-bar {
width: 100%;
height: 4px;
position: absolute;
top: 50%;
transform: translateY(-50%);
background-color: #cccccc;
}
.slider-handle {
width: 20px;
height: 20px;
position: absolute;
top: 50%;
left: 0;
transform: translate(-50%, -50%);
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 50%;
cursor: pointer;
}
- JavaScript部分
接下来,我们需要使用JavaScript代码来实现拖动功能。具体流程如下:
① 首先,为 .slider-handle
元素添加 mousedown
事件监听器,当用户按下左键时触发此事件:
sliderHandle.addEventListener('mousedown', function(event){
event.preventDefault();
//首先要确保被拖拽的元素在其他元素之前
this.parentElement.appendChild(this);
var startX = event.clientX - this.offsetLeft;
//注册事件
document.addEventListener('mousemove', moveHandler);
document.addEventListener('mouseup', upHandler);
function moveHandler(event) {
var newX = event.clientX - startX;
var containerWidth = this.parentElement.offsetWidth - this.offsetWidth;
//限制在容器内移动
if (newX < 0) {
newX = 0;
}
if (newX > containerWidth) {
newX = containerWidth;
}
this.style.left = newX + 'px';
}
function upHandler() {
document.removeEventListener('mousemove', moveHandler);
document.removeEventListener('mouseup', upHandler);
}
})
在 mousedown
事件函数中,我们需要做以下工作:
- 阻止浏览器默认的行为;
- 将
.slider-handle
元素的位置移到所有其他兄弟元素之上(这样可以确保被拖拽的元素看起来更加自然); - 记录
.slider-handle
元素当前的位置; - 注册
mousemove
和mouseup
事件监听器。
② 然后,在 mousemove
事件监听器中,我们需要计算鼠标的实时位置,并将 .slider-handle
元素移动到正确的位置。注意,我们还要限制 .slider-handle
元素在 .slider-container
容器内移动。
③ 最后,在 mouseup
事件监听器中,我们需要撤销事件监听器。
【示例说明1】
下面是一个基本的示例,可以直接拖动滑块:
<!DOCTYPE html>
<html>
<head>
<title>拖动滑块</title>
<style>
.slider-container {
width: 300px;
height: 20px;
position: relative;
margin: 20px;
//container不选的话,也可以。
}
.slider-bar {
width: 100%;
height: 4px;
position: absolute;
top: 50%;
transform: translateY(-50%);
background-color: #cccccc;
}
.slider-handle {
width: 20px;
height: 20px;
position: absolute;
top: 50%;
left: 0;
transform: translate(-50%, -50%);
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 50%;
cursor: pointer;
}
</style>
</head>
<body>
<div class="slider-container">
<div class="slider-bar"></div>
<div class="slider-handle"></div>
</div>
<script>
var sliderHandle = document.querySelector('.slider-handle');
sliderHandle.addEventListener('mousedown', function(event){
event.preventDefault();
//首先要确保被拖拽的元素在其他元素之前
this.parentElement.appendChild(this);
var startX = event.clientX - this.offsetLeft;
document.addEventListener('mousemove', moveHandler);
document.addEventListener('mouseup', upHandler);
function moveHandler(event) {
var newX = event.clientX - startX;
var containerWidth = this.parentElement.offsetWidth - this.offsetWidth;
if (newX < 0) {
newX = 0;
}
if (newX > containerWidth) {
newX = containerWidth;
}
this.style.left = newX + 'px';
}
function upHandler() {
document.removeEventListener('mousemove', moveHandler);
document.removeEventListener('mouseup', upHandler);
}
})
</script>
</body>
</html>
【示例说明2】
下面这个示例可以演示在移动端如何使用拖动滑块功能:
<!DOCTYPE html>
<html>
<head>
<title>滑动条测试</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<style type="text/css">
.slider-container {
width: 90%;
height: 40px;
position: relative;
margin: 30% auto;
}
.slider-bar {
width: 100%;
height: 10px;
position: absolute;
top: 50%;
transform: translateY(-50%);
background-color: deepskyblue;
}
.slider-handle {
width: 35px;
height: 35px;
position: absolute;
top: 50%;
left: 0;
transform: translate(-50%, -50%);
background-color: white;
border: 2px solid deepskyblue;
border-radius: 50%;
cursor: pointer;
}
</style>
</head>
<body>
<div class="slider-container">
<div class="slider-bar"></div>
<div class="slider-handle"></div>
</div>
<script type="text/javascript">
var sliderHandle = document.querySelector('.slider-handle');
sliderHandle.addEventListener('touchstart', function(event) {
event.preventDefault();
//确保被拖拽的元素在其他元素之前
this.parentElement.appendChild(this);
var startX = event.touches[0].clientX - this.offsetLeft;
document.addEventListener('touchmove', moveHandler);
document.addEventListener('touchend', upHandler);
function moveHandler(event) {
var newX = event.touches[0].clientX - startX;
var containerWidth = this.parentElement.offsetWidth - this.offsetWidth;
if (newX < 0) {
newX = 0;
}
if (newX > containerWidth) {
newX = containerWidth;
}
this.style.left = newX + 'px';
}
function upHandler() {
document.removeEventListener('touchmove', moveHandler);
document.removeEventListener('touchend', upHandler);
}
})
</script>
</body>
</html>
【总结】
本文详细讲解了如何使用原生JS实现可兼容PC和移动端的拖动滑块功能。通过HTML创建DOM元素,通过CSS设置样式,再通过JavaScript代码实现拖动功能,最终实现了功能可用的滑块。通过这篇文章的学习,我相信你已经掌握了如何使用原生JS实现可兼容PC和移动端的拖动滑块功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】 - Python技术站