自制滑杆slider
一、效果图

二、HTML结构
<div id="d2">
<p>自制可拖动滑块:</p>
<div id="out">
<div id="filling"> </div>
<div id="innerimg"></div>
</div>
<p id="txt">音量:0</p>
</div>
第一个div是轨道,第二个是填充物,第三个是滑块
三、CSS样式
#out {/* 滑块轨道 */
position: relative;
width: 160px;
height: 12px;
margin-top: 10px;
margin-left: 0px;
border: 1px solid #28C561;
border-radius: 10px;
box-shadow: 1px 1px 2px 0px inset;/* 轨道内阴影 */
cursor: pointer;
}
#filling {/* 填充物 */
height: 100%;
margin-left: 0px;
width: 0px;
background: linear-gradient(to right, #0089ff , #00fff3); /* 填充效果的渐变 */
background: -webkit-linear-gradient(left, #0089ff , #00fff3);
background: -o-linear-gradient(right, #0089ff , #00fff3);
background: -moz-linear-gradient(right, #0089ff , #00fff3);
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
box-shadow: 2px -1px 5px 1px inset;
}
#innerimg {/* 滑块样式 */
position: absolute;
left: 0px;
top: -8px;
margin-left: 0px;
width: 25px;
height: 25px;
cursor: pointer;
background-color: #66F40E;
border-radius: 50%;
box-shadow: 0px 2px 1px 0px #0d11128a, 0px -1px 19px rgba(0, 0, 0, 0.9) inset; /* 使滑块具有3D感 */
}
样式可以随便改
四、JS代码

如图所示,将out设置为参考项,有两种情况:
(1)、点击out框的任何部位,滑块自动划过去并且filling填满滑块后面的地区
(2)、滑动滑块调节
原理很简单:以out为参照,当点击out的任意部分时,将InnerImg的坐标更新到鼠标点击部位,将filling的width设置成鼠标点击部位与out左边框的距离,就可以看到效果。
步骤:
a). 先获取页面元素:
var innerpro = document.getElementById('innerimg')
var out = document.getElementById('out')
var filling = document.getElementById('filling')
var txt = document.getElementById('txt')
var target
b). 添加out的点击事件:
function dvnamicprogress () {
/**
* @author Qiang
* @function dvnamicprogress -- 滑杆
*/
if (document.addEventListener) {
/* addEventListener属性IE9.0才支持 */
out.addEventListener('click', fillingClick, false)
} else if (document.attachEvent) {
out.attachEvent('click', fillingClick, false)
}
}
当鼠标在out内点击时,获取鼠标位置,设置filling宽度和内部滑块innerimg的left
function fillingClick (event) {
2 event.stopPropagation()
3 if (event.touches) {
4 target = event.touches[0]
5 } else {
6 target = event || window.event
7 }/* 兼容移动端,但是发现没有兼容ie8及以下…… */
8 var sliderLeft = target.clientX - 45 /* 减去的45=滑块的宽度25+整天滑杆距离视图左边框的距离20 */
9 var fillingWidth = target.clientX - 45
10 if (sliderLeft <= 0) {
11 sliderLeft = 0
12 }/* filling的宽度不能小于0,滑块的位置不能超出out左边界 */
13 if (fillingWidth <= 0) {
14 fillingWidth = 0
15 }
16 txt.innerHTML = '音量:' + parseInt(sliderLeft / 135 * 100)
17 innerpro.style.left = sliderLeft + 'px'
18 filling.style.width = fillingWidth + 5 + 'px'
19 // console.log('鼠标的位置:X=>' + target.clientX + ', Y=>' + target.clientY)
20 // console.log('滑块的位置:' + sliderLeft)
21 }
c). 添加移动滑块innerimg的事件
function dvnamicprogress () {
/**
* @author Qiang
* @function dvnamicprogress -- 滑杆
*/
if (document.addEventListener) {
/* addEventListener属性IE9.0才支持 */
out.addEventListener('click', fillingClick, false)
innerpro.addEventListener('touchstart', fillingMove, {passive: true}, false)
innerpro.addEventListener('mousedown', fillingMove, false)
} else if (document.attachEvent) {
out.attachEvent('click', fillingClick, false)
innerpro.attachEvent('touchstart', fillingMove, {passive: true}, false)
innerpro.attachEvent('mousedown', fillingMove, false)
}
}
function fillingMove (event) {
/* addEventListener属性IE9.0才支持 */
if (document.addEventListener) {
innerpro.addEventListener('touchmove', sliderMove, {passive: true}, false)
document.addEventListener('mousemove', sliderMove, false)
document.addEventListener('mouseup', clear, false)
} else if (document.attachEvent) {
innerpro.attachEvent('touchmove', sliderMove, {passive: true}, false)
document.attachEvent('mousemove', sliderMove, false)
document.attachEvent('mouseup', clear, false)
}
}
当鼠标按下时给innerimg添加一个onmousemove事件,不断更新位置
function sliderMove (event) {
if (event.touches) {
target = event.touches[0]
} else {
target = event || window.event
}
// console.log('鼠标的位置:X=>' + target.clientX + ', Y=>' + target.clientY)
var prolong = target.clientX - 45
if (prolong < 0) {
prolong = 0
} else if (prolong > 135) {
prolong = 135
}
txt.innerHTML = '音量:' + parseInt(prolong / 135 * 100)
filling.style.width = prolong + 5 + 'px'
innerpro.style.left = prolong + 'px'
}
当鼠标按键弹起时,清除所有事件:
function clear () {
if (document.addEventListener) {
document.removeEventListener('mousemove', sliderMove, false)
document.removeEventListener('mousedown', fillingMove, false)
} else if (document.attachEvent) {
document.attachEvent('mousemove', sliderMove, false)
document.attachEvent('mousedown', fillingMove, false)
}
}
window.onload = function () {
staticProgress()
dvnamicprogress()
}
这里的样式比较丑,因为轨道宽一点好写,可以美化一下:

#out {
position: relative;
width: 160px;
height: 3px;
margin-top: 10px;
margin-left: 0px;
border-radius: 10px;
background-color: #737272;
cursor: pointer;
}
#filling {
height: 100%;
margin-left: 0px;
width: 0px;
background-color:#00fff3;
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
}
#innerimg {
position: absolute;
left: 0px;
top: -11px;
margin-left: 0px;
width: 25px;
height: 25px;
cursor: pointer;
background-color: #ffffff;
border-radius: 50%;
box-shadow: 0px 1px 6px 0px #0d1112c7, 0px -1px 19px rgba(0, 0, 0, 0) inset;
}
#txt{
font-size:5px;
}
-
自制滑杆slider的更多相关文章
- iOS 代码分类
控件分类: 指示器 (ActivityIndicator) 提醒对话框 (AlertView) 按钮 (Button) 日历 (Calendar) 相机 (Camera) 透明指示层 (HUD) 图像 ...
- oschina iOS代码库
iOS代码库 34Activity 54下拉刷新(pull-to-refresh) 143菜单 (Menu) 20位置信息(GPS/Location) 24iOS 表单 74提醒 (Notificat ...
- 自制 移动端 纯原生 Slider滑动插件
在Google搜关键字“slider”或“swiper”能找到一大堆相关插件,自己造轮子是为了能更好的理解其中的原理. 给这个插件取名为“veSlider”是指“very easy slider”非常 ...
- Objective-C 自定义UISlider滑杆 分段样式
效果 自定义一个功能简单的分段的滑杆 可显示分段名 为了显示效果,我们将滑块和节点都设置为不规则 这里只实现了分段的slider,未分段的没有实现,有兴趣的可以定义另一种类型做个判断修改下 需求分析 ...
- Unity3D学习笔记(二十):Rect、Canvas、Toggle、Slider、ScrollBar
Rect Transform(锚点):图片中心的四个点,界面以雪花形式显示 当四个点在一起的时候组成锚点,当四个点分开的时候组成锚框(合则锚点,分则锚框) Anchors: ----Min x:控 ...
- 跟着《beginning jquery》学写slider插件并借助自定义事件改进它
<beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...
- [Unity3D]自制UnityForAndroid二维码扫描插件
一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分 ...
- .NET中使用APlayer组件自制播放器
目录 说明 APlayer介绍 APlayer具备功能 APlayer使用 自制播放器Demo 未完成工作 源码下载 说明 由于需求原因,需要在项目中(桌面程序)集成一个在线播放视频的功能.大概要具备 ...
- 推荐:图片轮播插件Nivo Slider
因为项目需要一款切换样式多一些的轮播插件,不经意找到了NivoSlider,非常好用,比bootstrap要好用,而且样式丰富.值得注意的是,这款插件是在MIT协议下免费的. ...
随机推荐
- <转>c++引用与指针的区别(着重理解)
★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...
- 【maven】成功生成jar包,提示找不到主类?
问题描述: 使用maven构建zookeeper项目,完成一个简单的创建组的实例,代码调试完成,使用mvn clean install成功打包得到了jar包,但是在执行时发现使用java -cp ...
- matlab读取mysql数据
conn = database('ci_bootstrap_3','root','1q1q1q1q','com.mysql.jdbc.Driver','jdbc:mysql://localhost:3 ...
- (C/C++学习)2.C语言中文件流操作基本函数总结
函数所在头文件:stdio.h 说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于上机运行分析.文中部分引用自王桂林老师的C/C++课件. 1.FIELE *fopen(const cha ...
- CSS max-width: 0;
写CSS,大家都知道max-width是要在宽度超过后才会生效,但今天我发现一个神奇的现象, 为表格td加上max-width: 0;可以让上下两个表格自动对齐,这句的作用到底是什么还有待研究,今天先 ...
- 洛谷11月月赛(284pts rank85)
https://www.luogu.org/contestnew/show/12006 我是比赛完后在去写的 这是我第一次打洛谷月赛,之前一次是比赛完才去看而且写了第一题就没写后面的了 284分,太水 ...
- 《团队名称》第八次团队作业:Alpha冲刺
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 (1)掌握软件测试基础技术(2)学习迭代式增量软件开发过程(Scrum) ...
- 第二次训练 密码acmore
网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26733#overview 贪心全场!!!! A题: #include <io ...
- JQuery学习(5-AJAX1)
<? php /* * 保护AJAX请求的方式 */ /* * 1. 防止表单的自己主动提交 * 对表单的submit提交进行控制. 设置一个全局变量submitError,在进行验证的方法体中 ...
- 一个简单的ant应用
<pre name="code" class="html"><?xml version="1.0" encoding=&q ...