原生js拖拽功能制作滑动条实例代码


Posted in Javascript onFebruary 05, 2021

拖拽属于前端常见的功能,很多效果都会用到js的拖拽功能。滑动条的核心功能也就是使用js拖拽滑块来修改位置。一个完整的滑动条包括 滑动条、滑动痕迹、滑块、文本 等元素,先把html代码写出来,如下所示:

<div class="bar_wrap" id="wrap"><!--外包裹元素-->
 <div class="bar_container"><!--滑动条-->
  <div class="bar_into"></div><!--滑动痕迹-->
 </div>
 <div class="bar_drag"><!--滑块-->
  <div class="bar_text"></div><!--文本-->
 </div>
</div>

然后给各元素添加css样式,完成下图效果:

原生js拖拽功能制作滑动条实例代码

接下来通过分析功能,一步一步完成js代码。

1. 获取滑动条各个元素,代码如下:

//获取外包裹元素
 var eBarWrap = document.getElementById('wrap');
 //获取滑动条
 var eBarCon = eBarWrap.getElementsByClassName('bar_container')[0];
 //获取滑动痕迹元素
 var eBarInto = eBarWrap.getElementsByClassName('bar_into')[0];
 //获取滑块
 var eBarDrag = eBarWrap.getElementsByClassName('bar_drag')[0];
 //获取文本元素
 var eBarText = eBarWrap.getElementsByClassName('bar_text')[0];

2. 获取滑动最大值
因为滑块只能在滑动条内滑动,所以需要限制最大滑动位置。而DOM元素计算位置是从元素的左侧开始,所以最大值应该是 滑动条的宽度-滑块 的宽度,如下所示:

//获取最大位置
 var nMax = eBarCon.offsetWidth - eBarDrag.offsetWidth;

3. 在滑块上绑定鼠标按下事件函数,实现拖拽滑块功能,代码如下:

//滑块添加拖拽事件
 eBarDrag.addEventListener('mousedown',function(event){
  
 });

3.1 获取滑块位置
需要拖动滑块,肯定要先知道滑块原来的位置,才能根据鼠标的移动来拖拽滑块。在滑块上绑定的事件函数上有传入一个event对象,这个event对象代表当前事件的实例对象,包含当前事件相关信息。如下所示:

//滑块添加拖拽事件
 eBarDrag.addEventListener('mousedown',function(event){
  //初始化鼠标开始拖拽的点击位置
  var nInitX = event.clientX;
  //初始化滑块位置
  var nInitLeft = this.offsetLeft;
 });

3.2 滑块跟随鼠标移动,修改滑动痕迹和文本数值
操作时,在滑块上按下鼠标,再移动鼠标就可以使滑块跟随鼠标移动。但一般移动鼠标不可能只在滑动条上面移动,所以需要在页面上绑定鼠标移动事件,如下所示:

//滑块添加拖拽事件
 eBarDrag.addEventListener('mousedown',function(event){
  /*...*/

  //页面绑定鼠标移动事件
  document.onmousemove = event=>{
   //鼠标移动时取消默认行为,避免选中其他元素或文字
   event.preventDefault();
   //获取鼠标移动后滑块应该移动到的位置
   let nX = event.clientX - nInitX + nInitLeft;
   //限制滑块最大移动位置
   if(nX>=nMax){
    nX = nMax;
   }
   //限制滑块最小移动位置
   if(nX<=0){
    nX = 0;
   }
   //修改滑块位置(因为用的是箭头函数,所以this还是指向滑块)
   this.style.left = nX + 'px';
   //修改滑动痕迹宽度
   eBarInto.style.width = nX + this.offsetWidth/2 + 'px';
   //修改文本数值
   eBarText.innerHTML = Math.ceil(nX/nMax*100)/10;
  };
 });

3.3 释放鼠标时,固定滑块位置
当释放鼠标的时候,滑块固定在当前移动到的位置,滑动痕迹和文本数值已经一起修改。

//滑块添加拖拽事件
 eBarDrag.addEventListener('mousedown',function(event){
  /*...*/

  //鼠标松开绑定事件,取消页面上所有事件
  document.onmouseup = function(event){
   document.onmousemove = null;
   document.onmouseup = null;
  }
 });

鼠标按下事件函数就完成了。滑动条的样式都可以通过css实现,但默认文本数值是空的,这不太合理,所以需要加多一句代码,给文本元素默认赋值为0,如下所示:

//修改默认数值
 eBarText.innerHTML = 0;

4. 在滑动条上添加点击事件
当点击滑动条上除滑块之外的位置时,滑块应该直接滑动到鼠标点击的位置。需要在滑动条上添加点击事件实现此功能,代码如下:

//滑动条添加点击事件
 eBarCon.addEventListener('click',function(event){
  //设置滑动条位置
  var nLeft = this.offsetLeft;
  //获取有定位的父元素
  var eParent = this.offsetParent;
  //循环所有有定位的父元素
  while(eParent){
   //添加定位父元素offsetLeft值,用于准确定位滑动条与页面左侧的距离 
   nLeft += eParent.offsetLeft;
   //再次获取父元素外的定位父元素
   eParent = eParent.offsetParent;
  }
  //计算滑块位置
  var nX = event.clientX - nLeft;
  //修改滑块位置
  eBarDrag.style.left = nX +'px';
  //修改滑动痕迹宽度
  eBarInto.style.width = nX + eBarDrag.offsetWidth/2 + 'px';
  //修改文本数值
  eBarText.innerHTML = Math.ceil(nX/nMax*100)/10
 });

到此这篇关于原生js拖拽功能制作滑动条实例教程的文章就介绍到这了,更多相关js拖拽功能制作滑动条内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
从零开始学习jQuery (二) 万能的选择器
Oct 01 Javascript
jquery显示隐藏input对象
Jul 21 Javascript
jQuery中html()方法用法实例
Dec 25 Javascript
JS实现动态给图片添加边框的方法
Apr 01 Javascript
JavaScript对数组进行随机重排的方法
Jul 22 Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
Jan 26 Javascript
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
vue实现微信二次分享以及自定义分享的示例
Mar 20 Javascript
JavaScript this使用方法图解
Feb 04 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
May 12 Javascript
v-slot和slot、slot-scope之间相互替换实例
Sep 04 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
Feb 04 #jQuery
如何在JavaScript中使用localStorage详情
Feb 04 #Javascript
vue浏览器返回监听的具体步骤
Feb 03 #Vue.js
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 #Vue.js
详解React中共享组件逻辑的三种方式
Feb 02 #Javascript
详解微信小程序轨迹回放实现及遇到的坑
Feb 02 #Javascript
学习 Vue.js 遇到的那些坑
Feb 02 #Vue.js
You might like
thinkphp浏览历史功能实现方法
2014/10/29 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
pandas的排序和排名的具体使用
2019/07/31 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
Python 寻找局部最高点的实现
2019/12/05 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
建房协议书
2014/04/11 职场文书
辞职信格式范文
2015/05/13 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
python使用glob检索文件的操作
2021/05/20 Python
Python中request的基本使用解决乱码问题
2022/04/12 Python
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技