最近公司在做一个项目,页面中要用到滑动器效果,我的第一反应是使用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. chromium之lazy_instance

    先看看介绍 // The LazyInstance<Type, Traits> class manages a single instance of Type, // which will ...

  2. mongo配置项说明

    mongo configure 配置文件   storage:     dbPath: mongod实例存储其数据的目录.     indexBuildRetry: 指定是否mongod在下次启动时重 ...

  3. 解决jquey中当事件嵌套时,内层事件会执行多次的问题

    出现情景:当内层事件需要外层事件触发后产生的一些值得时候 情景复现: <!DOCTYPE html> <html lang="en"> <head&g ...

  4. JQ中的选择器children()和find()区别

    1:children及find方法都用是用来获得element的子elements的,两者都不会返回 text node,就像大多数的jQuery方法一样. 2:children方法获得的仅仅是元素一 ...

  5. mysql的char,varchar,text,blob

    mysql的char,varchar,text,blob是几个有联系但是有有很大区别的字段类型,这算是mysql的基础吧,可是基础没有学好,恶补一下. 先简单的总结一下: char:定长,最大255个 ...

  6. Java开发小技巧(五):HttpClient工具类

    前言 大多数Java应用程序都会通过HTTP协议来调用接口访问各种网络资源,JDK也提供了相应的HTTP工具包,但是使用起来不够方便灵活,所以我们可以利用Apache的HttpClient来封装一个具 ...

  7. python+selenium webdriver.firefox()方式配置浏览器设置

    webdriver.firefox() 爬虫需求:  (其实是输入参数可获取.zip/pdf 文件,然后点击下载) ——但是firefox浏览器有Bug,点击下载之后会有弹出窗口,需要你点击确定,这怎 ...

  8. python三大器之while,if,for循环

    一.for循环(遍历循环) 在Python你可能要经常遍历列表的所有元素,对每个元素执行相同的操作;对于包含数字的列表,可能要对每个元素进行相同的计算;在网站中,可能需要显示文章中的每个标题等等.某一 ...

  9. c语言数据结构(一)

    第一章   绪论 一.数据与数据结构 数据:所有能被输入到计算机中,且被计算机处理的符号的集合计算机操作的对象的总称.是计算机处理的信息的某种特定的符号表示形式. 数据元素:数据中的一个“个体”,数据 ...

  10. Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)

    一.概述 概念 UML简图 角色 抽象处理器:定义处理请求的接口 具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用) 当然这里必须指出,实际中纯的责任链模式很难寻找,一般是 ...