最近公司在做一个项目,页面中要用到滑动器效果,我的第一反应是使用HTML5 input类型中的range类型,但马上我就否定了这个想法,因为range类型存在浏览器的兼容性问题(在主流浏览器中)。但又不想在网上随便抄别人写的,于是就自己动手写了一个滑动器。

  先贴上效果图:

  滑动器的HTML代码如下:

<div class="ui-slide">
<input type="text" value="0" />
<div class="slider-track">
<span class="min">0</span><span class="slider-thumb"></span><span class="max">1000</span>
</div>
</div>

其实只要下面的代码就够了:

<div class="ui-slide">
<div class="slider-track">
<span class="slider-thumb"></span>
</div>
</div>

但是为了滑动效果看起来更形象,还加了一个输入框(用来动态显示滑动条的值)、还有最大值、最小值。 

  滑动器css代码如下:

<style>
.ui-slide {
width: 400px;
margin: 0 auto;
/*margin-left: 100px;*/
text-align: center;
}
.slider-track {
/*width: 50%;*/
height: 15px;
border-radius: 1em;
border: 1px solid #AAAAAA;
background: linear-gradient(#E5E5E5, #F2F2F2) repeat scroll 0 0 #EEEEEE;
position: relative;
}
.slider-thumb {
display: block;
width: 28px;
height: 28px;
border: 1px solid grey;
border-radius: 1em;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
background: linear-gradient(#FAFAFA, #F6F6F6) repeat scroll 0 0 #FFFFFF;
position: absolute;
/*left: 0;*/
top: 50%;
margin: -15px 0 0 -15px;
}
input[type="text"] {
display: inline-block;
margin-bottom: 1em;
width: 3em;
text-align: center;
}
.min, .max {
position: absolute;
}
.min {
left: -30px;
}
.max {
right: -60px;
}
</style>

  上面的代码已经有滑动条的样子了,只是不能滑动。下面用js来控制滑动,先上代码:

<script>
var sliderThumb = document.getElementsByClassName("slider-thumb")[0];
var input = document.getElementsByTagName("input")[0];
sliderThumb.style.left = "0px";
sliderThumb.onmousedown = function (evt) {
var that = this;
var oldX = evt.clientX;
var left = parseInt(that.style.left);
sliderThumb.onmousemove = function(evt) {
var x = evt.clientX - oldX;
that.style.left = left + x + "px";
if ( parseInt(that.style.left) < 0) {
that.style.left = 0;
}
if (parseInt(that.style.left) > 400) {
that.style.left = 400 + "px";
}
}
     input .value = Math.ceil(parseInt(that.style.left) / 400 * 1000);
sliderThumb.onmouseup = function (evt) {
sliderThumb.onmouseup = null;
sliderThumb.onmousemove = null;
}
}
</script>

由于style特性获取不到外部样式表或嵌入样式表的样式,所以需要用js设置sliderThumb.style.left="0px",否则后面获取sliderThumb.style.left的值都为空。

  到这边其实滑动效果已经有了,但是有些问题,当鼠标移动的太快,就会出现鼠标脱离滑块,因为mouseover事件是绑定到滑块上的,一旦鼠标脱离滑块,就无法再调用mousemove事件,无法调用mousemove事件,就无法定位滑块的位置,所以滑块就停止了。还有一个问题是,当你拖动滑块快速的移动鼠标,然后放开,再把鼠标悬浮在滑块上时,你会发现,鼠标悬浮在滑块上也能拖动滑块,原因是快速移动鼠标后,鼠标脱离滑块,当鼠标up时,本来mouseup是绑定在滑块上的,应该执行下面这个函数的来取消事件绑定:

sliderThumb.onmouseup = function (evt) {
sliderThumb.onmouseup = null;
sliderThumb.onmousemove = null;
}

但现在鼠标已经脱离滑块,mouseup时并不会执行上面的函数,所以滑块的mouseup并没有执行,这样就出现鼠标悬浮在滑块上时也能拖动滑块。

  现在我们来解决上面出现的两个问题,把上面的js代码改成这样:

<script>
var sliderThumb = document.getElementsByClassName("slider-thumb")[0];
var input = document.getElementsByTagName("input")[0];
sliderThumb.style.left = "0px";
sliderThumb.onmousedown = function (evt) {
var that = this;
var oldX = evt.clientX;
var left = parseInt(that.style.left);
document.onmousemove = function(evt) {
var x = evt.clientX - oldX;
that.style.left = left + x + "px";
if ( parseInt(that.style.left) < 0) {
that.style.left = 0;
}
if (parseInt(that.style.left) > 400) {
that.style.left = 400 + "px";
}
}
     input.value = Math.ceil(parseInt(that.style.left) / 400 * 1000);
document.onmouseup = function (evt) {
document.onmouseup = null;
document.onmousemove = null;
}
}
</script>

  大家会发现,我把mousemove与mouseup事件都绑定到了document上,但mousedown事件还是绑定在滑块上。这样一来,即使鼠标移动太快脱离滑块,滑块也能移动,因为document上的mousemove事件只要鼠标还没松开就会执行。当mouseup时会执行这个函数:

document.onmouseup = function (evt) {
document.onmouseup = null;
document.onmousemove = null;
}

这样就取消了事件,就不会出现放开鼠标还能悬浮移动滑块的情况了。

  下面就是滑块的效果了,请拖动下面的滑块滑动:

0滑块1000

  

  这篇文章并没有考虑低版本的IE浏览器(ie9以下),毕竟windows XP都退役了。

  

  

js实现滑动器效果的更多相关文章

  1. 基于jplayer实现歌词同步的JS音乐播放器效果

    分享一款基于jplayer实现歌词同步的JS音乐播放器效果.这是一款基于jQuery实现的音乐播放器功能代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <textare ...

  2. JS实现滑动门效果

    html部分 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin ...

  3. 【原生JS】滑动门效果

    效果图: 思路:通过每次鼠标移动至目标上使所有图片重置为初始样式再向左移动目标及其左侧每个图片隐藏部分距离即实现. HTML: <!DOCTYPE html> <html> & ...

  4. JS移动客户端--触屏滑动事件及js手机拖拽效果

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  5. js进阶 13-7 如何实现滑动面板效果

    js进阶 13-7 如何实现滑动面板效果 一.总结 一句话总结:就是普通的jquery动画中的滑动效果.$('#content').slideToggle().滑动效果的实质是通过调整高度. 1.滑动 ...

  6. 使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问)

    使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问) 一.总结 一句话总结:进度条动画效果用animation,自动效果用setIntelval 二.使用原生JS+CSS或HTML5实 ...

  7. JS切割图片-滑动门效果

    转载请注明来源:https://www.cnblogs.com/hookjc/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  8. animate 实现滑动切换效果

    今天和大家分享一下用 animate 实现滑动切换效果的小例子 ------- 来自<一只有梦想的前端小白> 大家都知道jQuery 提供的有一下几种方法能够实现滑动效果: slideDo ...

  9. NET Core 静态文件及JS包管理器(npm, Bower)的使用

    NET Core 静态文件及JS包管理器(npm, Bower)的使用 文章目录 在 ASP.NET Core 中添加静态文件 使用npm管理JavaScript包 使用Bower管理JavaScri ...

随机推荐

  1. 竞赛题解 - Broken Tree(CF-758E)

    Broken Tree(CF-758E) - 竞赛题解 贪心复习~(好像暴露了什么算法--) 标签:贪心 / DFS / Codeforces 『题意』 给出一棵以1为根的树,每条边有两个值:p-强度 ...

  2. .Net 上传文件到ftp服务器和下载文件

    突然发现又很久没有写博客了,想起哎呦,还是写一篇博客记录一下吧,虽然自己还是那个渣渣猿. 最近在做上传文件的功能,上传到ftp文件服务器有利于管理上传文件. 前面的博客有写到layui如何上传文件,然 ...

  3. Enable directory listing on Nginx Web Server

    1:Test environment [root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core ...

  4. Java并发编程:浅析几种线程安全模型 [转]

    多线程编程一直是老生常谈的问题,在Java中,随着JDK的逐渐发展,JDK提供给我们的并发模型也越来越多,本文摘取三例使用不同原理的模型,分析其大致原理.目录如下: 1.COW之CopyOnWrite ...

  5. 【reidis中ruby模块版本老旧利用rvm来更新】

    //gem install redis时会遇到如下的error: //借助rvm来update ruby版本

  6. php_Trait

    * Trait Answer* Trait : 关键字 Trait* 使用 use* 我的理解 是为了解决php不能多继承的一个处理方式* 在使用的时候 可以让两个不相关的类 产生联系* Trait ...

  7. php源码建博客3--区分平台的MVC结构

    主要: 模型单例工厂 目录结构优化 区分平台(前台,后台....) --------------文件结构:-------------------------------------- blog├─Ap ...

  8. PHPExcel 导入Excel数据 (导出下一篇我们继续讲解)

    一:使用composer下载 phpoffice/phpexcel 或者直接下载安装包 composer require phpoffice/phpexcel 二 1:导入数据 原理:读取文件,获取文 ...

  9. Ubuntu Linux TinySerial串口调试助手 可视化界面 安装使用

    ubuntu Linux下串口调试助手使用 Tiny Serial为一个开源项目,欢迎大家使用,基于Qt开发的串口调试助手,有一般串口助手的基本功能,更多功能正在完善. Github地址:https: ...

  10. 最新Altium_Designer_Beta_18.7.is AD18安装教程及破解说明

    下解Altium_Designer带破解的压缩包. 下载链接:https://pan.baidu.com/s/1TlPHtSthJKxLcXWcCR-q-g 密码:bt0g 解压缩Altium_Des ...