最近公司在做一个项目,页面中要用到滑动器效果,我的第一反应是使用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. 关于c++随机种子srand( time(NULL) )的设置问题

    设置随机种子srand( time(NULL) ) ,在程序中只需要设置一次就好,而且不能被调用多次,直接看列子. a:每次都重新设置随机种子 #include<iostream> #in ...

  2. 学习笔记 - Manacher算法

    Manacher算法 - 学习笔记 是从最近Codeforces的一场比赛了解到这个算法的~ 非常新奇,毕竟是第一次听说 \(O(n)\) 的回文串算法 我在 vjudge 上开了一个[练习],有兴趣 ...

  3. 为什么有时候binlog文件会很大于max_binlog_size以及max_binlog_cache_size

    问题描述 线上一个很有意思的现象,发现binlog文件大小是15G,查看了参数max_binlog_size是1073741824[1G], max_binlog_cache_size是2147483 ...

  4. springboot(2.0以上) --数据源切换时报错

    在进行数据源切换时spring.datasource.type类型根据源码所给的默认值修改后依然报错 先看源码:标色部分 ,  就是springboot所给的数据源 ,  正常来说只要在配置文件中修改 ...

  5. 用Jquery控制元素的上下移动 实现排序功能

    在页面上,控制元素上下移动,进行排序是我们比较常用的功能,今天我用jQuery 写个 简单方便,功能齐全的实现方式. 话不多说,直接上代码,下面是基础的引入jq和html元素部分: <scrip ...

  6. mqtt使用二(集成到java代码中)

    1.我采用的是springboot,首先pom文件中添加mqtt需要用到的依赖 <dependency> <groupId>org.springframework.boot&l ...

  7. Hadoop-Hive学习笔记(1)

    1. Hive什么 a.Hive是基于Hadoop的一个数据仓库工具(注意不是数据仓库),将结构化的数据文件映射成一张数据库表. b.Hive是SQL的解析引擎,可以把sql语句转换成MapReduc ...

  8. mysql的数据类型与表约束

    数据类型 (详细数据类型请参考:http://www.runoob.com/mysql/mysql-data-types.html) 数字 整型  tinyint int bigint 小数: flo ...

  9. 简单复习一下ArrayList的扩容原理

    刚刚跟几个好朋友喝完小酒回家,简单大概复习一下ArrayList的扩容原理,由于头有点小晕,就只大概说一下扩容的原理哈: 首先ArrayList实现了List接口,继承了AbstractList,大家 ...

  10. BZOJ1452_Count_KEY

    题目传送门 二维树状数组,对于每个颜色开一个树状数组,用容斥求解. code: #include <cstdio> using namespace std; int read() { ') ...