原生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 相关文章推荐
javascript编程起步(第四课)
Jan 10 Javascript
用正则表达式 动态创建/增加css style script 兼容IE firefox
Mar 10 Javascript
jquery获取元素值的方法(常见的表单元素)
Nov 15 Javascript
如何获取网站icon有哪些可行的方法
Jun 05 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
学习JavaScript设计模式之代理模式
Jan 12 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
Aug 25 Javascript
jQuery滚动插件scrollable.js用法分析
May 25 jQuery
JS闭包的几种常见形式实例详解
Sep 16 Javascript
基于vue 开发中出现警告问题去除方法
Jan 25 Javascript
百度小程序之间的页面通信过程详解
Jul 18 Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 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&amp;java(一)
2006/10/09 PHP
PHP中的cookie
2006/11/26 PHP
PHP 编程安全性小结
2010/01/08 PHP
php检测文本的编码
2015/07/26 PHP
twig里使用js变量的方法
2016/02/05 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP 断点续传实例详解
2017/11/11 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
python实现简易云音乐播放器
2018/01/04 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python开头的coding设置方法
2019/08/08 Python
python3下pygame如何实现显示中文
2020/01/11 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
九年级物理教学反思
2014/01/29 职场文书
政府信息公开实施方案
2014/05/09 职场文书
实习单位意见
2015/06/04 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
python套接字socket通信
2022/04/01 Python
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android