js实现滑动器效果
最近公司在做一个项目,页面中要用到滑动器效果,我的第一反应是使用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;
}
这样就取消了事件,就不会出现放开鼠标还能悬浮移动滑块的情况了。
下面就是滑块的效果了,请拖动下面的滑块滑动:
这篇文章并没有考虑低版本的IE浏览器(ie9以下),毕竟windows XP都退役了。
js实现滑动器效果的更多相关文章
- 基于jplayer实现歌词同步的JS音乐播放器效果
分享一款基于jplayer实现歌词同步的JS音乐播放器效果.这是一款基于jQuery实现的音乐播放器功能代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <textare ...
- JS实现滑动门效果
html部分 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin ...
- 【原生JS】滑动门效果
效果图: 思路:通过每次鼠标移动至目标上使所有图片重置为初始样式再向左移动目标及其左侧每个图片隐藏部分距离即实现. HTML: <!DOCTYPE html> <html> & ...
- JS移动客户端--触屏滑动事件及js手机拖拽效果
移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...
- js进阶 13-7 如何实现滑动面板效果
js进阶 13-7 如何实现滑动面板效果 一.总结 一句话总结:就是普通的jquery动画中的滑动效果.$('#content').slideToggle().滑动效果的实质是通过调整高度. 1.滑动 ...
- 使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问)
使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问) 一.总结 一句话总结:进度条动画效果用animation,自动效果用setIntelval 二.使用原生JS+CSS或HTML5实 ...
- JS切割图片-滑动门效果
转载请注明来源:https://www.cnblogs.com/hookjc/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
- animate 实现滑动切换效果
今天和大家分享一下用 animate 实现滑动切换效果的小例子 ------- 来自<一只有梦想的前端小白> 大家都知道jQuery 提供的有一下几种方法能够实现滑动效果: slideDo ...
- NET Core 静态文件及JS包管理器(npm, Bower)的使用
NET Core 静态文件及JS包管理器(npm, Bower)的使用 文章目录 在 ASP.NET Core 中添加静态文件 使用npm管理JavaScript包 使用Bower管理JavaScri ...
随机推荐
- jquery仿移动端支付宝键盘
最近做项目时碰到一个需求,就是在移动端支付页面点击支付按钮弹出一个支付键盘,类似于支付宝的那种.由于项目只是单纯的手机网站,而并非app,所以这个功能得由前端来实现.话不多说,先上图看看效果. 尼玛, ...
- php 将富文本编辑后的内容取出
背景:项目中用了富文本编辑器,讲写完的内容存入了数据库,但是取出的时候因为有些展示地方并不需要样式,只想获取到内容,所以需要将带了html编码的信息解析出来. 原始信息如下 [task_desc] = ...
- Django templates加载css/js/image等静态资源
配置步骤: 1.首先在应用下面创建static目录 2.将静态资源拷贝进去 3.在应用的settings.py文件中添加 import os BASE_PATH = os.path.dirname(o ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- while do while switch语句的简要分析
1 //// while是C语言的一个关键字,其后是使用一个小括号中的条件表达式来做为执行循环的条件, 2 ////也就是说当条件表达式的结果为真时执行大括号里面的的程序内容, 3 ////而当条件表 ...
- HyperLedger Fabric 1.4 官方End-2-End运行(8)
8.1 End-2-End案例简介 Fabric官方提供了实现点对点的Fabric网络示例,该网络有两个组织(organizations),一个组织有两种节点(Peer),通过Kafka ...
- 成都Uber优步司机奖励政策(3月19日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 成都Uber优步司机奖励政策(1月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 二 Hive分桶
二.Hive分桶 1.创建分桶表 create table t_buck (id string ,name string) clustered by (id) //根据id分桶 sorted by ( ...
- L010小结后自考题
. 查询2号分区的inode和block的数量和尺寸 . 在lcr文件夹下创建一个a文件夹,然后进入文件夹中,创建3个3层目录,5个1层目录,5个文件 . 滤出a文件夹下的所有一级目录(4种方法) . ...