原生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 移动端注入骨架屏的配置方法

    下面我会详细讲解在 Vue 移动端项目中如何注入骨架屏。 什么是骨架屏? 骨架屏是一种用于提高移动端用户体验的技术,它是在页面内容还未加载完成时展示的一种占位元素,可以提高用户对页面加载进度的感知。骨架屏通常采用灰色填充块线条等元素,展示页面结构和布局,让用户感知到页面正在加载内容。 注入骨架屏的配置方法 在 Vue 移动端项目中,可以使用 vue-skel…

    Vue 2023年5月28日
    00
  • vue-cli入门之项目结构分析

    vue-cli入门之项目结构分析 1. vue-cli简介 vue-cli是一个vue.js项目脚手架,它可以帮我们快速生成项目骨架,提供了一套完整的项目搭建和工作流解决方案。vue-cli被广泛使用,能够帮助开发者提高开发效率和代码质量。 2. vue-cli的安装 我们可以通过npm安装vue-cli,全局安装后在命令行输入 vue 即可查看vue-cl…

    Vue 2023年5月28日
    00
  • mini-vue渲染的简易实现

    下面是关于“mini-vue渲染的简易实现”的完整攻略。 概述 mini-vue是我们自己实现的一个简化版Vue。Vue是一个流行的JavaScript框架,它使我们能够轻松地构建响应式的用户界面。而mini-vue则是Vue框架的简化版,它提供了最基本的功能。 本攻略将会介绍如何使用mini-vue来实现基本的渲染功能。这包括创建Vue实例、模板解析和挂载…

    Vue 2023年5月27日
    00
  • Vue编译器AST抽象语法树源码分析

    一、概述 Vue是一个流行的JavaScript框架,通过它可以方便地构建可伸缩的单页面应用程序,能够帮助我们快速构建高效且易于维护的Web应用系统。在Vue中,模板被转换成一个抽象语法树(AST),这个AST是通过Vue编译器(parser)将模板代码转换而来的。AST通过获取DOM节点,识别出语言特定的标记和元素,自动创建了一个基于对象表示代码的结构树。…

    Vue 2023年5月27日
    00
  • Vue3 组件库的环境配置搭建过程

    当我们想要使用 Vue3 开发组件库时,需要进行环境配置。 环境配置过程 以下是 Vue3 组件库的环境配置的完整攻略。 安装 Vue CLI Vue CLI 是一个工具,用于快速创建 Vue 应用程序。使用它可以很方便地创建一个新的 Vue 组件库项目。我们可以通过 npm 安装 Vue CLI: npm install -g @vue/cli 生成 Vu…

    Vue 2023年5月28日
    00
  • Vue在 Nuxt.js 中重定向 404 页面的方法

    当使用Nuxt.js作为Vue的应用程序框架时,处理404页面的方式与该框架的其他部分略有不同。在这种情况下,我们需要创建一个名为error.vue的特殊页面以处理所有404错误。在这个页面中,我们可以使用Vue.js中的重定向功能将用户重定向到自定义404页面。 下面是使用Vue在Nuxt.js中重定向404页面的Step-by-Step攻略: 在page…

    Vue 2023年5月28日
    00
  • vue实现点击按钮“查看详情”弹窗展示详情列表操作

    要实现“vue实现点击按钮‘查看详情’弹窗展示详情列表操作”的效果,可以按照以下步骤进行: 步骤一:在组件中定义数据和方法 首先,在组件中定义需要展示的数据和方法。假设我们要展示一个商品列表,每个商品有名称、价格等属性,同时有一个“查看详情”按钮,点击按钮可以展示该商品的详细信息。我们可以在组件中定义数据和方法如下: <template> &lt…

    Vue 2023年5月29日
    00
  • Vue 通过公共字段,拼接两个对象数组的实例

    要完成“Vue 通过公共字段,拼接两个对象数组”的操作,可以使用Vue中的计算属性来实现。 在Vue实例的data中定义两个对象数组: data: { arr1: [ { id: 1, name: ‘A’, age: 20 }, { id: 2, name: ‘B’, age: 22 }, { id: 3, name: ‘C’, age: 18 }, ], …

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