原生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 相关文章推荐
最新28个很棒的jQuery 教程
May 28 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
Feb 12 Javascript
用Jquery选择器计算table中的某一列某一行的合计
Aug 13 Javascript
javascript常用功能汇总
Jul 05 Javascript
JS实现的自定义右键菜单实例二则
Sep 01 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
Jul 22 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
Jun 01 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
Aug 13 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 Javascript
JS实现二维数组元素的排列组合运算简单示例
Jan 28 Javascript
JavaScript实现身份证验证代码实例
Aug 26 Javascript
JavaScript实现捕获鼠标坐标
Apr 12 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
Protoss兵种对照表
2020/03/14 星际争霸
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Python Pandas 箱线图的实现
2019/07/23 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Python sys模块常用方法解析
2020/02/20 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
教师找工作推荐信
2013/11/23 职场文书
房地产还款计划书
2014/01/10 职场文书
三年级评语大全
2014/04/23 职场文书
论文评语大全
2014/04/29 职场文书
安全生产承诺书范文
2014/05/22 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS