一、效果图

二、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的更多相关文章

  1. iOS 代码分类

    控件分类: 指示器 (ActivityIndicator) 提醒对话框 (AlertView) 按钮 (Button) 日历 (Calendar) 相机 (Camera) 透明指示层 (HUD) 图像 ...

  2. oschina iOS代码库

    iOS代码库 34Activity 54下拉刷新(pull-to-refresh) 143菜单 (Menu) 20位置信息(GPS/Location) 24iOS 表单 74提醒 (Notificat ...

  3. 自制 移动端 纯原生 Slider滑动插件

    在Google搜关键字“slider”或“swiper”能找到一大堆相关插件,自己造轮子是为了能更好的理解其中的原理. 给这个插件取名为“veSlider”是指“very easy slider”非常 ...

  4. Objective-C 自定义UISlider滑杆 分段样式

    效果 自定义一个功能简单的分段的滑杆 可显示分段名 为了显示效果,我们将滑块和节点都设置为不规则 这里只实现了分段的slider,未分段的没有实现,有兴趣的可以定义另一种类型做个判断修改下 需求分析 ...

  5. Unity3D学习笔记(二十):Rect、Canvas、Toggle、Slider、ScrollBar

      Rect Transform(锚点):图片中心的四个点,界面以雪花形式显示 当四个点在一起的时候组成锚点,当四个点分开的时候组成锚框(合则锚点,分则锚框) Anchors: ----Min x:控 ...

  6. 跟着《beginning jquery》学写slider插件并借助自定义事件改进它

    <beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...

  7. [Unity3D]自制UnityForAndroid二维码扫描插件

    一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分 ...

  8. .NET中使用APlayer组件自制播放器

    目录 说明 APlayer介绍 APlayer具备功能 APlayer使用 自制播放器Demo 未完成工作 源码下载 说明 由于需求原因,需要在项目中(桌面程序)集成一个在线播放视频的功能.大概要具备 ...

  9. 推荐:图片轮播插件Nivo Slider

          因为项目需要一款切换样式多一些的轮播插件,不经意找到了NivoSlider,非常好用,比bootstrap要好用,而且样式丰富.值得注意的是,这款插件是在MIT协议下免费的.        ...

随机推荐

  1. token session cookie

    token 登录握手与身份验证: cookie.session 记录会话状态 兼有 token的功能: cookie session 功能更强大. 所有这些都是为了便捷和密码安全考虑.

  2. 单链表每k个节点为一组进行反转(最后不满k个时不反转)

    public class LinkReverse2 { public static Node mhead=null; public static Node mtail=null; public sta ...

  3. BZOJ 4327: JSOI2012 玄武密码 后缀自动机

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  4. 玩转python 各种数据类型的转换

    # -*- coding: utf-8 -*- # @Time : 2019/4/28 14:27 # @Author : wujf # @Email : 1028540310@qq.com # @F ...

  5. 修复Thinkphp框架5.0和5.1版本的远程代码执行安全漏洞

    由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞.最直接的影响为index.php直接被篡改成首页html的内容! 5.0版本 thinkphp/libr ...

  6. (13)处理静态资源(默认资源映射)【从零开始学Spring Boot】

    Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性. 建议大家使用Spring Boot的默认配置方式,如果需要特殊处理的再通 ...

  7. 服务器监控(包括性能指标与web应用程序)

    http://blog.csdn.net/yao123long/article/details/53142029 http://blog.csdn.net/heyongluoyao8/article/ ...

  8. SWT中嵌入Swing的JTextFeild却不能编辑

    SWT中嵌入Swing的JTextFeild却不能编辑 学习了:http://www.iteye.com/problems/49487   膜拜一下 org 竟然有这样的坑,需要在中间添加一个JApp ...

  9. ASP内置对象—Request、Response 、Server、Application 、ObjectContent (二)

    Response (应答)对象 Request 对象.用于在HTTP请求期间,訪问不论什么client浏览器传递给server的信息,包含通过URL传递的參数信息.使用GET方法或POST方法传递的H ...

  10. 相似 nginx 编译时生成函数链表

    下面代码可能须要一定的c/c++基础. 须要有一些函数指针的知识 深度剖析函数指针点击这里 common.h #pragma once typedef int (*pt)(void); void in ...