对于原来的输入范围,如何自定义滑动输入栏的样式一直是我心中的一道坎。 一般情况下,很容易美化到这个程度。
为什么这么容易?因为有对应的伪元素可以改变
<pre class="cm-s-default" style="color:rgb( 89 , 89 , 89 );margin:0px;padding:0px;background:none 0% 0% / auto repeat scroll padding-box border-box rgba( 0 , 0 , 0 , 0 )">::-webkit-slider-container {
/*可以修改容器的若干样式*/
}
::-webkit-slider-runnable-track {
/*可以修改轨道的若干样式*/
}
::-webkit-slider-thumb {
/*可以修改滑块的若干样式*/
}
然而,没有一种风格被一扫而空。 如果你想定义像下面这样的样式,纯CSS可能无法实现
注意:Firefox 有一个单独的伪类需要更改,本文讨论 Chrome 实现
1.我的实现思路
既然没有专门的伪元素来改变扫过部分的颜色,而且只有滑块是可移动的,那么是否可以对滑块进行操作呢?
假设滑块左侧有一个圆圈,它跟随滑块,
当圆足够长时,可以完全覆盖一侧的轨迹,并且在可见范围内,是否可以代表左侧扫过的部分? 示意图如下(左边半透明表示滑块在外面)
尝试过像这样的伪元素视图
::-webkit-slider-thumb::after{ /*本想绘制一个足够长的矩形*/ }
不幸的是,伪元素不能在伪元素内重新生成。
那么,如何在元素外画一个圆呢?
2、通过border-image在元素外部绘制图形
有什么办法可以在元素之外绘制图形吗? 想了想,还有box-shadow和outlinecss3 滑动,不过好像不太适合这些情况。 我们需要画的是一个规格可控的圆css3 滑动,而这两种形式都不能很好的控制形状。 还有其他办法吗?
真的有! 前两天刚听到张新旭老师的一篇文章:被高估的border-image属性,特点之一就是在元素外创建一个图像,而且不占任何空间。赶紧试试,用这里长度为99vw(刚好盖住滑块),代码如下
::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; border-radius: 50%; background-color: #f44336; border: 1px solid transparent; margin-top: -8px; border-image: linear-gradient(#f44336,#f44336) 0 fill / 8 20 8 0 / 0 0 0 99vw; /*绘制元素外矩形*/ }
效果如下
注意几点:
为了使border-image生效,必须指定border,这里是border: 1pxsolid透明; 矩形是由线性渐变绘制的线性渐变 (#f44336, #f44336) border-image 中的 8 20 8 0 表示 border-image -width,即距上、右、下、左的距离。 由于滑块本身的大小是20 * 20,所以这样可以确定高度为4(20 - 8- 8),位置为滑块本身的最左边(距离左边为20) 0 0 0 border-image中的99vw表示border-image-outset扩展尺寸,这里指的是99vw向左扩展的距离
接下来,可以通过overflow:hidden隐藏外部部分
::-webkit-slider-container { /*其他样式*/ overflow: hidden; }
完整代码可访问:输入范围(codepen.io)点击预览
下面附上完整代码(codepen最近不太稳定)
[type="range"] { -webkit-appearance: none; appearance: none; margin: 0; outline: 0; background-color: transparent; width: 500px; } [type="range"]::-webkit-slider-runnable-track { height: 4px; background: #eee; } [type="range" i]::-webkit-slider-container { height: 20px; overflow: hidden; } [type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; border-radius: 50%; background-color: #f44336; border: 1px solid transparent; margin-top: -8px; border-image: linear-gradient(#f44336,#f44336) 0 fill / 8 20 8 0 / 0px 0px 0 2000px; }
三、仍存在一定的局限性
虽然上述实现成本很低,但与传统实现相比,只减少了一行在元素外部绘制正方形。
border-image: linear-gradient(#f44336,#f44336) 0 fill / 8 20 8 0 / 0px 0px 0 2000px;
但由于超出隐藏的方法剪掉了多余的部分,滑块的边缘是“一刀切”,所以如果要求滑块有圆角,这种实现方法就行不通了
如果您有什么好的意见欢迎留言讨论
四、简单总结
关于border-image-outset这个属性,之前在MDN上已经看到过,只是简单了解了一下,觉得鸡肋。 现在看来这些属性并不是没有用,只是还没有遇到合适的应用场景。 以下是一个简短的总结:
滑块有 3 个伪元素,可以自定义容器、轨道和滑块。 伪元素中不能再嵌套伪元素。 元素之外,有box-shadow、outline、border-image 3种方法。 边框图像可以使用任何格式。 图像,包括 CSS 渐变,无法实现圆角
当然,这种想法只是一种“补救措施”。 与 Firefox 一样,它完全支持自定义样式。 遗憾的是,桌面端依然以Chrome为主,所以只能期待Chrome后期的更新了。最后,如果您觉得不错,对您有帮助,请点赞、收藏、转发
CSS颜色、字体大小设置
CSS是网站开发的后端开发工具,可以用来设置网页的颜色、字体大小、边框等属性。 本文将介绍如何使用CSS设置网页的颜色、字体大小、边框等属性。
1. 颜色设置
CSS中的颜色设置非常简单,可以使用RGB、HEX、RGBA等颜色代码来设置颜色。 以下是一些常用的颜色代码:
RGB()函数:用于设置红、绿、蓝三基色的值,可以用来设置任意颜色。 例如:
color: rgb(255, 0, 0);
2.RGBA()函数:用于设置红、绿、蓝、透明度四基色的值,可以用来设置任意颜色。 例如:
color: rgb(255, 0, 0, 0.5);
3.HEX()函数:用于设置十六进制颜色代码,可用于设置特定的颜色。 例如:
color: #ff0000;
4、HSL()函数:用于设置色调、饱和度、色温三个属性的值,可以用来设置任意颜色。 例如:
color: hsl(120, 100%, 50%);
除了上述颜色代码外,还可以使用十六进制颜色代码,并使用比例、百分比等方法来设置颜色。
2. 字体大小设置
CSS中的字体大小设置非常简单,可以使用font-size等属性来设置字体大小。 以下是一些常用的字体大小代码:
1.font-size: xx-large;/设置字体大小为小/
font-size:small;/设置字体大小为大/font-size:medium;/设置字体大小为中/
4.font-size: large;/设置字体大小为小/font-size: x-large;/设置字体大小为超大/
除了上述字体大小代码外,还可以使用比例、百分比等方法来设置字体大小。
3. 边框设置
CSS中的边框设置非常简单,可以使用border等属性来设置边框的样式。 以下是一些常用的边界代码:
1.border: 1px Solid black;/设置边框为1像素宽css 设置字体大小,黑色/
border: 2pxsolid red;/设置边框为2像素宽,红色/border:3pxsolidblue;/设置边框为3像素宽,蓝色/
4.border: 4px Solid green;/设置边框为4像素宽,绿色/
除了上面的边框代码外,还可以使用比例、百分比等方法来设置边框。
综上所述,CSS中颜色和字体大小的设置非常简单,可以使用上面的颜色代码和字体大小代码来设置。 但需要注意的是css 设置字体大小,CSS 设置的效果会受到浏览器支持、CSS 属性顺序等激励因素的影响。 因此,在实际开发中,建议先在不同浏览器上进行测试,确保设置效果符合预期,然后再在实际网站上使用。
发表评论