原生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 相关文章推荐
防止页面被iframe(兼容IE,Firefox火狐)
Jul 04 Javascript
利用JS自动打开页面上链接的实现代码
Sep 25 Javascript
Jquery实现自定义tooltip示例代码
Feb 12 Javascript
JavaScript获取表单enctype属性的方法
Apr 02 Javascript
用AngularJS的指令实现tabs切换效果
Aug 31 Javascript
H5图片压缩与上传实例
Apr 21 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
限时抢购-倒计时的完整实例(分享)
Sep 17 Javascript
vue实现商品加减计算总价的实例代码
Aug 12 Javascript
关于vue状态过渡transition不起作用的原因解决
Apr 09 Javascript
webpack proxy 使用(代理的使用)
Jan 10 Javascript
Vue3配置axios跨域实现过程解析
Nov 25 Vue.js
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
PHP+MYSQL的文章管理系统(二)
2006/10/09 PHP
php adodb介绍
2009/03/19 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
jquery提示 &quot;object expected&quot;的解决方法
2009/12/13 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
vue+vant实现购物车全选和反选功能
2020/11/17 Vue.js
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
Django实现跨域请求过程详解
2019/07/25 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
Python2与Python3的区别点整理
2019/12/12 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
新员工欢迎词
2014/01/12 职场文书
九年级家长会邀请函
2014/01/15 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
建议书格式
2015/02/04 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
golang连接MySQl使用sqlx库
2022/04/14 Golang