原生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 相关文章推荐
JS创建优美的页面滑动块效果 - Glider.js
Sep 27 Javascript
js各种验证文本框输入格式(正则表达式)
Oct 22 Javascript
理解JavaScript的prototype属性
Feb 11 Javascript
js时间戳格式化成日期格式的多种方法
Nov 11 Javascript
全面解析Bootstrap排版使用方法(文字样式)
Nov 30 Javascript
jQuery实现移动端滑块拖动选择数字效果
Dec 24 Javascript
详解JS面向对象编程
Jan 24 Javascript
jQuery组件easyui对话框实现代码
Aug 25 Javascript
js实现视图和数据双向绑定的方法分析
Feb 05 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
微信小程序实现转盘抽奖
Sep 21 Javascript
vue实现日历表格(element-ui)
Sep 24 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
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
Python打印斐波拉契数列实例
2015/07/07 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
python中的协程深入理解
2019/06/10 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
python线性插值解析
2020/07/05 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
办理收楼委托书范本
2014/10/09 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
大足石刻导游词
2015/02/02 职场文书
幼儿教师辞职信
2015/02/27 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书