currentColor css 的使用

2020-04-28 10:47:16

参考地址 currentColor让CSS更简短

看完下面的文章,我们会发现不用js也能设置伪元素after,before的颜色。


其实currentColor已经出现了有一段时间了,但我是几个月前在阅读Dudley Storey的文章时才听说了currentColor的。Dudley Storey指出currentColor的浏览器 (包括IE9+)支持是非常好的。这对于我把它用于生产已经是非常足够的了,而且我非常惊讶地发现这个关键字其实非常好用:它有助于让CSS代码变得更简洁和智能。

在深入探讨具体的实例之前,先来看一段简短的理论知识。这是MDN中对currentColor的描述:

currentColor关键字表示元素color属性的计算值。它能让原本不能默认通过属性或子元素继承的颜色属性继承。

SVG

SVG是我最喜欢的。举一个在Web上很常见的例子——包含SVG图标以及title的按钮。我的网站上面也有这些按钮:

SVG

当然,如果你是一个非常负责的网页设计师,为了更好地与用户交互,你为按钮的各个状态(:hover:focus:active)设置了不同的样式。你的代码通常会这样写:

.button{    color: #000;
    border: 2px solid #000;}.button:hover,.button:focus{    color: #333;
    border-color: #333;}.button:active{    color: #666;
    border-color: #666;}.button svg{    fill: #000;}.button:hover svg,.button:focus svg{    fill: #333;}.button:active svg{    fill: #666;}

目前我在为一个客户的电子商务网站写前端代码,做了几个不同的按钮设计。此外,还为几个锚点添加了:visited状态的样式。还有很多其它相似的SVG应用案例(工具栏等),其中SVG的文本必须是有设置颜色的。currentColor帮助我们做了两次代码精简:

/* 把这个放在你的设置默认样式的CSS文件中 */svg{    fill: currentColor;}/* 现在你完全不需要为SVG设置样式以及边框颜色 */.button{    color: #000;
    border: 2px solid currentColor;}.button:hover,.button:focus{    color: #333;}.button:active{    color: #666;}

渐变

currentColor关键字可以在任何定义了颜色值的地方使用,包括渐变。在前面的文章中我谈到了如何为超链接加上漂亮的下划线:

渐变

通常的CSS渐变样式以及交互状态:

a{    text-shadow: 2px 0 0 #fff, -2px 0 0 #fff;
    color: #000;
    background-image: -webkit-linear-gradient( left, #000 0%, #000 100% );
    background-image: linear-gradient( to right, #000 0%, #000 100% );
    background-repeat: repeat-x;
    background-position: 0 95%;
    -webkit-background-size: 100% 1px;
    background-size: 100% 1px;}a:hover,a:focus{    color: #333;
    background-image: -webkit-linear-gradient( left, #333 0%, #333 100% );
    background-image: linear-gradient( to right, #333 0%, #333 100% );}a:focus{    color: #666;
    background-image: -webkit-linear-gradient( left, #666 0%, #666 100% );
    background-image: linear-gradient( to right, #666 0%, #666 100% );}a:visited{    color: #999;
    background-image: -webkit-linear-gradient( left, #999 0%, #999 100% );
    background-image: linear-gradient( to right, #999 0%, #999 100% );}

background-image是对应下划线的,它有和文本相同的颜色。代码看起来很繁琐。然而,你通常不会把链接都限制为一种颜色。以我个人的经验,它们至少需要有三种颜色:一般链接的颜色、灰色、白色(在背景比较暗的时候),这意味着3倍的代码量。但在这里,currentColor可以创造神奇。

a{    text-shadow: 2px 0 0 #fff, -2px 0 0 #fff;
    color: #000;
    background-image: -webkit-linear-gradient( left, currentColor 0%, currentColor 100% );
    background-image: linear-gradient( to right, currentColor 0%, currentColor 100% );
    background-repeat: repeat-x;
    background-position: 0 95%;
    -webkit-background-size: 100% 1px;
    background-size: 100% 1px;}a:hover,a:focus     { color: #333; }a:focus     { color: #666; }a:visited   { color: #999; }/* grey links */.grey-links a           { color: #999; }.grey-links a:hover,.grey-links a:focus     { color: #666; }.grey-links a:active    { color: #333; }

伪元素

我相信你对于CSS三角形应该是非常熟悉的,而且也已多次使用它们。我也是,而且我经常用它们来丰富链接的样式,如下:

伪元素

CSS伪元素::after在这里是一个三角形。通过使用currentColor,你不需要为三角形以及它的交互状态进行重复的颜色设置:

a           { color: #000; }a:hover,a:focus     { color: #333; }a:active    { color: #666; }a::after{    width: 0;
    height: 0;
    border: 0.5em solid transparent;
    border-right: none;
    content: '';
    display: inline-block;}a::after,a:hover::after,a:focus::after,a:active::after{    border-left-color: currentColor;}

水平线

这不是一个关于如何写更少的CSS代码的例子,它更像是一个写更高效而且可维护的代码的示例。水平线<hr />用于分隔内容的不同部分,我认为水平线的出现不应该是干扰,而是辅助:

水平线

Dudley已经在他的示例中提到了这一点,所以我只是重复一下,并为它添加一点修改:

.post{    color: #000;}.post hr{    width: 33%;
    height: 0.313.em; /* 5px */
    border: none;
    background-color: currentColor;
    opacity: .2;}

这段代码的智能之处在于,如果你改动了文本的颜色,你就不需要再去更改水平线的颜色,它会自动地随着文本的颜色改变。在工作中我们总是寻求自动化,我们写的代码越多,我们就会越重视自动化的解决方案。

在我走之前

你有更多关于currentColor的实例、或者是用它来精简代码的方法吗?来一起分享吧~~

  • 2017-05-12 16:33:24

    说说JSON和JSONP,也许你会豁然开朗

      JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议。我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式。看到没?一个是描述信息的格式,一个是信息传递双方约定的方法。

  • 2017-05-25 23:18:23

    webpack图片的路径与打包

    刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle)。下面我们就来分析下在webpack项目中图片的应用场景。

  • 2017-06-17 18:33:17

    NodeJs使用asyncAwait两法

    async/await使用同步的方式来书写异步代码,将异步调用的难度降低到接近于0,未来必将大放异彩。然而在当下,由于标准化的缓存步伐,async/await尚在ES7的草案中。为了尝先,特试用了下面两种方式:

  • 2017-06-18 02:26:17

    Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

    我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范)。正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实际上是它对应的是智能手机输入法中的表情。那为什么会报错呢?

  • 2017-06-18 02:34:22

    谈mysql中utf8和utf8mb4区别

    MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

  • 2017-07-05 09:48:51

    CSS 元素垂直居中的 6种方法

    利用CSS进行元素的水平居中,比较简单,行级元素设置其父元素的text-align center,块级元素设置其本身的left 和 right margins为auto即可。本文收集了六种利用css进行元素的垂直居中的方法,每一种适用于不同的情况,在实际的使用过程中选择某一种方法即可。