自定义(滑动条)input[type="range"]样式
来源:互联网 发布:php ftp_pasv 编辑:程序博客网 时间:2024/06/07 17:09
原文:http://blog.csdn.net/u013347241/article/details/51560290
Range是HTML5中新出现的滑块控件,也是常见的控件的之一,不过这个控件的原始样式略丑,所以想对它进行一些改造。需要注意的是Internet Explorer 9及更早IE版本并不支持这个控件。
1、如何使用滑动条?
用法很简单,如下所示:
<input type="range" value="0">
各浏览器原始样式如下:
Chrome :
Firefox :
IE 9+ :
常用(部分)属性如下:
2、如何美化滑动条?
首先提一个问题:有哪些方式能完成对滑动条的美化?目前我所能想到的就是如下的两种方案:
- 直接通过css完成样式改造
- 将滑动条隐藏(设置opacity: 0),通过自定义div实现
这次所要介绍的第一种较为简单的实现方式。
3、具体的实现方案是什么?
美化滑动控件,需要完成以下的五个步骤:
- 去除系统默认的样式;
- 给滑动轨道(track)添加样式;
- 给滑块(thumb)添加样式;
- 根据滑块所在位置填充进度条;
- 实现多浏览器兼容。
以上就是实现滑动控件美化的整个流程。我们今天所要达到的效果是这样的:如果想要实现填充进度条的效果,在IE 9以上的浏览器中可以使用::-ms-fill-lower
和 ::-ms-fill-upper
来自定义进度条;在Firefox浏览器中则可以通过::-moz-range-progress
来自定义;而Chrome浏览器中不支持直接设置进度条,而达到填充的效果,所以首先针对Chrome浏览器来实现整个流程。
3.1 去除系统默认的样式
这是美化滑动控件的第一步,这步操作是为了不使用原有的样式,使之后的自定义样式有效。代码很简单如下所示,不过要注意的是对基于 webkit 的浏览器,如Chrome, Safari, Opera等,滑块也要移除默认样式。
input[type=range] { -webkit-appearance: none; width: 300px; border-radius: 10px; /*这个属性设置使填充进度条时的图形为圆角*/}input[type=range]::-webkit-slider-thumb { -webkit-appearance: none;}
3.2 给滑动轨道(track)添加样式
正式开始自定义控件样式了。首先是自定义滑动控件的轨道,代码很简单,直接贴出来。
input[type=range]::-webkit-slider-runnable-track { height: 15px; border-radius: 10px; /*将轨道设为圆角的*/ box-shadow: 0 1px 1px #def3f8, inset 0 .125em .125em #0d1112; /*轨道内置阴影效果*/}
原始的控件获取到焦点时,会显示包裹整个控件的边框,所以还需要把边框取消。
input[type=range]:focus { outline: none;}
3.3 给滑块(thumb)添加样式
下面对滑块的样式进行变更,css代码也不是很复杂,如下所示:
input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; height: 25px; width: 25px; margin-top: -5px; /*使滑块超出轨道部分的偏移量相等*/ background: #ffffff; border-radius: 50%; /*外观设置为圆形*/ border: solid 0.125em rgba(205, 224, 230, 0.5); /*设置边框*/ box-shadow: 0 .125em .125em #3b4547; /*添加底部阴影*/}
3.4 根据滑块所在位置填充进度条
新建一个RangeSlider.js文件,实现对滑动控件属性的设置、事件的监听、以及设置回调函数。监听input事件时,对进度条进行填充,让我们来直接看看代码是怎么实现的。
$.fn.RangeSlider = function(cfg){ this.sliderCfg = { min: cfg && !isNaN(parseFloat(cfg.min)) ? Number(cfg.min) : null, max: cfg && !isNaN(parseFloat(cfg.max)) ? Number(cfg.max) : null, step: cfg && Number(cfg.step) ? cfg.step : 1, callback: cfg && cfg.callback ? cfg.callback : null }; var $input = $(this); var min = this.sliderCfg.min; var max = this.sliderCfg.max; var step = this.sliderCfg.step; var callback = this.sliderCfg.callback; $input.attr('min', min) .attr('max', max) .attr('step', step); $input.bind("input", function(e){ $input.attr('value', this.value); $input.css( 'background', 'linear-gradient(to right, #059CFA, white ' + this.value + '%, white)' ); if ($.isFunction(callback)) { callback(this); } });};
通过cfg对象来设置滑动控件的min, max, step属性。
对控件绑定input事件,当滑块滑动时会触发该事件,此时完成对进度条的填充,这里我使用的是线性渐变linear-gradient(to right, #059CFA, white ’ + this.value + ‘%, white)
这种方式,淡蓝色和白色两种颜色从左至右渐变,渐变的长度根据此时控件的value来确定。事件触发时同时调用回调函数,回调函数完成的功能可自行设计。
当然你还可以根据自己的需求来监听其他事件,比如change事件,当value值改变时会触发,用法上很灵活。
如何调用这个js文件里的函数来完成配置呢?很简单,首先在html文件里导入这个js文件,然后直接定义script节点,html代码如下:
<!DOCTYPE html><html> <head> <title>demo</title> <script type="text/javascript" src="lib/jquery.js"></script> <script type="text/javascript"src="src/RangeSlider.js"></script> <link rel="stylesheet" href="css/slider.css" type="text/css"> </head> <body> <div id="test"> <input type="range" value="0"> </div> <script> var change = function($input) { /*内容可自行定义*/ console.log("123"); } $('input').RangeSlider({ min: 0, max: 100, step: 0.1, callback: change}); </script> </body></html>
至此基于Chrome浏览器,对滑动控件的美化已全部完成。最后只剩下多浏览器的兼容问题了。
3.5 实现多浏览器兼容
如果要兼容Firefox浏览器,只需要把上述css代码中的 ::-webkit-slider-runnable-track
替换为 ::-moz-range-track
,就可以完成对轨道的美化了;把css代码中的 ::-webkit-slider-thumb
替换为 ::-moz-range-thumb
,这是对滑块的样式进行改造;而如果是要填充进度条就很简单了,不需要像之前在RangeSlider.js中 $input.css( ‘background’, ‘linear-gradient(to right, #059CFA, white ’ + this.value + ‘%, white)’ ); 这样实现填充,只需要新增如下的css代码即可:
input[type=range]::-moz-range-progress { background: linear-gradient(to right, #059CFA, white 100%, white); height: 13px; border-radius: 10px;}
如果要想兼容IE 9以上版本的浏览器,对上述css代码要修改的地方稍微多了一些,下面先将针对IE 9+的css代码贴出来:
input[type=range] { -webkit-appearance: none; width: 300px; border-radius: 10px;}input[type=range]::-ms-track { height: 25px; border-radius: 10px; box-shadow: 0 1px 1px #def3f8, inset 0 .125em .125em #0d1112; border-color: transparent; /*去除原有边框*/ color: transparent; /*去除轨道内的竖线*/}input[type=range]::-ms-thumb { border: solid 0.125em rgba(205, 224, 230, 0.5); height: 25px; width: 25px; border-radius: 50%; background: #ffffff; margin-top: -5px; box-shadow: 0 .125em .125em #3b4547;}input[type=range]::-ms-fill-lower { /*进度条已填充的部分*/ height: 22px; border-radius: 10px; background: linear-gradient(to right, #059CFA, white 100%, white);}input[type=range]::-ms-fill-upper { /*进度条未填充的部分*/ height: 22px; border-radius: 10px; background: #ffffff;}input[type=range]:focus::-ms-fill-lower { background: linear-gradient(to right, #059CFA, white 100%, white);}input[type=range]:focus::-ms-fill-upper { background: #ffffff;}
以上就是为了兼容IE 9+完整的css代码,也不是很复杂,同样的和Firefox浏览器一样,它支持直接使用css来自定义进度条,所以原先在RangeSlider.js里的 $input.css( ‘background’, ‘linear-gradient(to right, #059CFA, white ’ + this.value + ‘%, white)’ );
填充方法就不需要啦。
下面提几个IE浏览器需要特别注意的问题:
在测试时发现,IE浏览器没有加载css文件,导致样式没有发生改变,如果你的使用E浏览器测试时也存在这样的问题,那么你需要将HTML第一行的
<!DOCTYPE html>
改为<!DOCTYPE>
;拖动滑块时,IE浏览器没有触发 input 事件,所以只能选择将RangeSlider.js中的监听事件改为 change 事件。
- 自定义(滑动条)input[type="range"]样式
- 自定义(滑动条)input[type="range"]样式
- HTML5—————— 自定义(滑动条)input[type="range"]样式
- input type=“range”滑块自定义样式,实现步骤详解及实际应用
- input[type = range]
- 设置input type=range滑块的CSS样式
- html自定义input type='file'样式
- 自定义 <input type="file" /> 样式
- 自定义input[type=radio]单选框样式
- 自定义input[type="radio"]的样式
- 自定义 input type=file样式
- 自定义input[type=”file”]的样式
- 自定义input[type="checkbox"]的样式
- html5 input type="range"实现拖拉滑条功能
- 自定义 input type="file" 文件上传样式
- [JS实例] input type=file 自定义样式的方法
- 自定义input type=file 样式 美化input type=file 改变input type=file控件“丑陋面貌”
- h5自定义滚动条的样式range
- perl学习笔记-----------------------(4)
- 前台通过js 写个ajax请求把数据传给后台,然后后台接收到这个数据, 再保存到数据库。。
- 关于Https协议中的ssl加密解密流程
- HTTP Status 500 - Servlet.init() for servlet springmvc threw exception
- Hadoop的RPC机制
- 自定义(滑动条)input[type="range"]样式
- Linux如何查看进程、杀死进程、启动进程等常用命令
- Vld 静态检测内存泄漏
- 1.八皇后问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后
- spark 1.6.2 spark-shell source code analysis
- PHP代码里处理显示几天前,几小时前,几分钟前
- Linux开发七_linux内核移植
- maven 错误M2_HOME
- android调用系统相机拍照