原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】

【标题】原生js实现可兼容PC和移动端的拖动滑块功能详解

【简介】本文将详细讲解如何使用原生JS实现可兼容PC和移动端的拖动滑块功能,这对于一些需要用户进行数值选择的网站或应用非常有用。

【具体步骤】

  1. HTML部分

为了实现滑块功能,我们需要在HTML中创建一个滑块的DOM元素,具体代码如下:

<div class="slider-container">
  <div class="slider-bar"></div>
  <div class="slider-handle"></div>
</div>

其中,.slider-container是滑块的容器,.slider-bar是滑动条,.slider-handle是可拖动的滑块块。

  1. 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;
}
  1. 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 元素当前的位置;
  • 注册 mousemovemouseup 事件监听器。

② 然后,在 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技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue Element前端应用开发之前端API接口的封装

    下面我将详细讲解“Vue Element前端应用开发之前端API接口的封装”的完整攻略。 什么是前端API接口封装? 前端API接口封装是指将后端数据处理和数据访问的过程进行简化,屏蔽数据格式等细节,将需要的数据以简单直观的方式暴露给前端业务代码使用。可以通过封装来降低前端调用后端接口和处理返回数据时的复杂度,提高代码的可读性和可维护性。 前端API接口封装…

    Vue 2023年5月28日
    00
  • 详解vue 组件之间使用eventbus传值

    下面是详解vue组件之间使用eventbus传值的完整攻略: 什么是event bus event bus 是Vue.js内置的一个在组件之间通信的机制,它可以让组件之间的通信变得更加简单方便。event bus是一个可以充当中央事件处理器的实例,可以用它来触发事件、监听事件或广播事件。 在组件中使用event bus 在Vue中使用event bus的步骤…

    Vue 2023年5月29日
    00
  • vue实现倒计时获取验证码效果

    好的。实现倒计时获取验证码效果,需要借助Vue.js框架和JavaScript的setTimeout函数,具体步骤如下: 准备工作 在Vue.js项目中安装Vue.js框架,命令为:npm install vue。 在所需的组件中引入Vue.js框架,比如使用ES6的方式引入:import Vue from ‘vue’。 在数据存储部分新建一个变量来存储倒计…

    Vue 2023年5月29日
    00
  • vue发送websocket请求和http post请求的实例代码

    我来帮你讲解一下。 发送websocket请求 在Vue中,我们可以使用vue-websocket库来实现对Websocket的使用。首先,在项目中安装vue-websocket库: npm install vue-websocket –save 接下来,在Vue实例中,我们需要使用mixins来引入websocket相关配置,并且在钩子函数中绑定事件和发…

    Vue 2023年5月28日
    00
  • 详解Vue的组件中data选项为什么必须是函数

    Vue.js官方文档中规定了一个重要的规则:在Vue组件中,data选项必须是函数。 为什么data选项必须是函数? 从根本上来说,这是因为JavaScript中对象和数组是引用类型,如果在组件中直接使用一个变量作为data,则它在所有实例之间共享,一旦该变量的值被修改,则所有的实例都会受到影响。 因此,为了确保每个组件实例都有自己的私有数据,并且不受其他组…

    Vue 2023年5月28日
    00
  • Vue privide 和inject 依赖注入的使用详解

    Vue中,provide和inject是实现依赖注入的两个函数。在组件树中,父组件可以通过provide提供一些数据或方法,子组件可以通过inject来注入这些数据或方法。 在使用provide向下传递时,我们可以把需要传下去的属性或方法放在一个对象中。如下面的例子: // Parent.vue <template> <div> &l…

    Vue 2023年5月27日
    00
  • mpvue 项目初始化及实现授权登录的实现方法

    mpvue 项目初始化及实现授权登录的实现方法 简介 mpvue 是基于 Vue.js 的小程序开发框架,使我们可以使用 Vue.js 的语法来开发小程序,同时支持快速构建项目以及各种插件。授权登录是小程序中必不可少的一部分,本文将讲解如何使用 mpvue 实现授权登录。 前置条件 了解 Vue.js 和小程序,了解基本的前端开发知识 安装并配置好小程序开发…

    Vue 2023年5月27日
    00
  • vue 使用el-table循环生成表格的过程

    下面我将详细讲解使用 Vue 和 el-table 循环生成表格的完整攻略。该过程可以分为以下几个步骤: 引入必须的依赖 首先,需要在你的代码中引入必须的依赖,这包括 Vue 框架及其 Element-UI 组件库。 <!– index.html –> <!– 引入 Vue 和 Element-UI–> … <scr…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部