自定义 range input 样式
最近由于业务需求需要做一个控制音量的滑块按钮组件,由于 js 实现起来比较复杂,需要考虑 touch
和 click
之间的切换。所以决定使用 h5 新增的 input range 来实现,只要改掉其默认样式就好。
几番搜索之后找到了 css tricks 的一篇文章,非常不错,所以再此简单记录顺带翻译(-_^)一下。(准不准确不好说)
首先统一一下说法,range input 有两部分,可以拖动的叫滑块(thumb),底部的是 track
第一步:去掉默认样式
需要根据浏览器需要处理他们不同的默认样式,这里需要覆盖好几条样式属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | input[type=range] { -webkit-appearance: none; /* 去掉底部的 track 默认样式,就是整个灰条 */ width: 100%; /* Firefox 需要指定明确的宽度 */ background: transparent; /* 否则在 Chrome 中是白色背景 */ } /* 去掉 webkit 内核 滑块 的样式 */ input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; } input[type=range]:focus { outline: none; /* 去除获取焦点时蓝色的外边框,你也可以自己定制其他你想要的效果 */ } input[type=range]::-ms-track { width: 100%; cursor: pointer; /* 这个是 IE 的 track 样式,没验证过 */ background: transparent; border-color: transparent; color: transparent; } |
到此我们已经有了一个兼容各浏览器的看不见的或者说没有样式的 range input。现在我们开始添加自定义的样式
第二步:给滑块增加样式
你点击或者拖拽的那个小玩意叫做滑块(thumb),它就像一个普通的 HTML 元素一样可以被定义各种样式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /* WebKit/Blink 样式定义 */ input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; margin-top: -14px; /* 在 Chrome 中你需要给定一个明确的 margin,但是在 Firefox 和 IE 中这个是固定的 */ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; /* 添加一条炫酷的效果为你的 thumb */ } /* Firefox 同上 */ input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; } /* IE 同上 */ input[type=range]::-ms-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; } |
注意我们重复的写了很多代码,但这是必须的,你不能使用逗号去分割这几个选择器。浏览器会忽略全部的选择器如果逗号连接的部分中存在它不识别的。
现在我们的滑块是这个样子的:
第三步:给 track 添加样式
thumb 所在的可滑动的那条线就是 track,它也像一个普通的 HTML 元素一样可以被定义各种样式。
在 IE 中需要注意:IE 10 以上有一些细微的不同表现。在 IE 中,你可以为 track 分别定义 thumb 左(lower)右(upper) 两边的样式。
另外需要注意的是你可以添加 track 的 focus 效果,当用户与 range input 进行交互的时候
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | input[type=range]::-webkit-slider-runnable-track { width: 100%; height: 8.4px; cursor: pointer; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } input[type=range]:focus::-webkit-slider-runnable-track { background: #367ebd; } input[type=range]::-moz-range-track { width: 100%; height: 8.4px; cursor: pointer; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } input[type=range]::-ms-track { width: 100%; height: 8.4px; cursor: pointer; background: transparent; border-color: transparent; border-width: 16px 0; color: transparent; } input[type=range]::-ms-fill-lower { background: #2a6495; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } input[type=range]:focus::-ms-fill-lower { background: #3071a9; } input[type=range]::-ms-fill-upper { background: #3071a9; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } input[type=range]:focus::-ms-fill-upper { background: #367ebd; } |
现在你的 track 看起来是这样的:
最后:完整的 Range Input
我们在上边已经创建了一个 thumb 和一个 track,我们可以将 css 进行合并。
完整的 css 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | input[type=range] { -webkit-appearance: none; margin: 18px 0; width: 100%; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-runnable-track { width: 100%; height: 8.4px; cursor: pointer; animate: 0.2s; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } input[type=range]::-webkit-slider-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; -webkit-appearance: none; margin-top: -14px; } input[type=range]:focus::-webkit-slider-runnable-track { background: #367ebd; } input[type=range]::-moz-range-track { width: 100%; height: 8.4px; cursor: pointer; animate: 0.2s; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } input[type=range]::-moz-range-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; } input[type=range]::-ms-track { width: 100%; height: 8.4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; border-width: 16px 0; color: transparent; } input[type=range]::-ms-fill-lower { background: #2a6495; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } input[type=range]::-ms-fill-upper { background: #3071a9; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } input[type=range]::-ms-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; } input[type=range]:focus::-ms-fill-lower { background: #3071a9; } input[type=range]:focus::-ms-fill-upper { background: #367ebd; } |
完整的效果如下:
更多内容请阅读 原文