成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CSS 顏色混合的N種方式

開發 前端
如果出現一種顏色就定義一個變量,每次都要維護多個顏色變量太麻煩了。有沒有辦法只用一個顏色呢?在這里也就是,如何將一個顏色變淺一點?這樣做的好處是,如果需要更換主題色,只用修改一個變量就行了。

在項目中經常會碰到需要鄰近色的場景,比如將一個顏色變深(淺)一點,下面是一個按鈕的選中態

圖片

如果出現一種顏色就定義一個變量,每次都要維護多個顏色變量太麻煩了。有沒有辦法只用一個顏色呢?在這里也就是,如何將一個顏色變淺一點?這樣做的好處是,如果需要更換主題色,只用修改一個變量就行了,如下:

圖片

下面盤點我用過的一些方法。

一、透明度

這應該是最容易想到的方式。將一個元素透明度降低不就顏色變淺了嗎?

假設 HTML是這樣的(下同)。

<button style="--primary-color: #3981E6">#3981E6</button>

不過這種方式需要借助單獨一層標簽,通??梢杂脗卧厣?,關鍵實現如下:

button::before{
content: '';
background: var(--primary-color);
opacity: 0.2
}

效果還是非常不錯的,下面是多種主題色的效果。

圖片

不過這種方式也有局限,比如偽元素不夠用怎么辦?還有絕對定位引起的層級問題。

沒關系,還有其他方式,接著往下看。

二、多重背景

大家可能都知道,CSS3 背景是支持多重背景的,并且層級是越來越低的。

圖片

因此,我們可以在主題色上覆蓋一層半透明的白色,依然可以將原有顏色“減淡”。

由于這里是背景圖,所以需要用到漸變,而不是顏色。比如希望主題色減淡到自身的20%?,可以覆蓋80%透明度的白色,實現如下:

button{
background: linear-gradient(rgba(255,255,255,.8),rgba(255,255,255,.8)), /*半透明白色*/
linear-gradient(var(--primary-color), var(--primary-color));
}

這樣就無需借助額外的標簽或者偽元素了,效果如下:

圖片

不過這種方式也有一些缺陷,比如僅適合背景層,如果希望box-shadow、outline這些就不行,這些屬性沒法疊加多層背景。

三、動畫

主要原理是動畫播放次數也是支持小數的,比如設置一個從藍色到白色的動畫,播放次數為??0.8???,那么在播放到??80%??的地方就停下來了,這樣就得到了顏色減淡的效果,示意如下:

圖片

具體實現如下:

button{
animation: lighterBackgroundColor .001s 0.8 linear forwards;
/*播放次數為0.8*/
}
@keyframes lighterBackgroundColor {
from {
background-color: var(--primary-color)
}
to{
background-color: #fff
}
}

效果也很棒。

圖片

相比前一種方式,就沒有背景的限制了,任意屬性都可以,但是每出現一個屬性就需要單獨一個動畫(因為動畫變化的就是屬性本身),如果要加一個減淡后的outline-color,應該要這么實現。

button{
animation: lighterBackgroundColor .001s 0.8 linear forwards,
lighterOutlineColor .001s 0.8 linear forwards; /*outline*/
/*播放次數為0.8*/
}
@keyframes lighterBackgroundColor {
from {
background-color: var(--primary-color)
}
to{
background-color: #fff
}
}
/*設置一個outline的動畫*/
@keyframes lighterOutlineColor {
from {
outline-color: var(--primary-color)
}
to{
outline-color: #fff
}
}

太繁瑣了,有沒有簡單一點的方法呢?

四、自定義屬性動畫

上面將屬性作為動畫有點浪費,因為變化值都是一樣的,有沒有辦法復用呢?

當然可以,將 CSS 變量作為動畫對象,比如--lighterColor。

button{
animation: lighterColor .001s 0.8 linear forwards;
/*播放次數為0.8*/
}
@keyframes lighterColor {
from {
--lighterColor: var(--primary-color)
}
to{
--lighterColor: #fff
}
}

但是,僅僅這樣是不夠的,動畫并不認識這樣的變量,根本不會有動畫(就像display一樣)。

為了讓自定義變量也支持動畫,需要通過@property定義一下。

@property - CSS:層疊樣式表 | MDN (mozilla.org)[1]?。

@property --lighterColor {
syntax: '<color>';
inherits: false;
initial-value: #fff;
}

相比前面的方式,但是適用性更佳,--lighterColor?已經是一個獨立的變量了,可以用在任意屬性上,比如加個outline。

button{
background-color: var(--lighterColor);
outline: 4px solid var(--lighterColor);
}

可以看到,outline也輕易地實現了顏色減淡。

圖片

缺點就是,兼容性欠佳,目前firefox還不支持

五、color-mix()

最后介紹一個最近正式支持(Chrome 110+)的顏色混合函數:color-mix()[2]。

這個算是官方的解決方案了,如果這個普遍支持了,前面的方法都可以不用了,下面簡單介紹一下。

color-mix(in lch, peru 40%, lightgoldenrod);
color-mix(in srgb, #34c9eb 20%, white);

前面的in lch?表示色彩空間,我們一般只用srgb就足夠了,后面的兩個顏色就需要混合的顏色了。

這里的百分比就是混合比例了,如果我們要實現減淡80%?的操作,可以將主題色的比例設置為20%,白色會自動填充剩余比例,如下:

button{
--lighterColor: color-mix(in srgb, var(--primary-color) 20%, #fff);
background-color: var(--lighterColor);
outline: 4px solid var(--lighterColor);
}

效果如下(Chrome 110+)。

圖片

目前還不適合使用,過兩年再說吧。

下面是所有方案的效果對比,基本是一致的。

圖片

完整 demo 可以訪問以下任意鏈接:

  • CSS color lighter (juejin.cn)[3]
  • CSS color lighter (codepen.io)[4]
  • CSS color lighter (runjs.work)[5]

六、總結一下優缺點

以上共介紹了5種不同的顏色混合實現方式,各有優缺點,下面分別從以下幾個方面比較一下

  • 實現成本:實現思路的復雜度,是否容易想到。
  • 適應性:能否適應各種場景。
  • 代碼復用性:實現是否啰嗦,是否需要額外標簽。
  • 兼容性:能否大規模使用。


實現成本

適應性

代碼復用性

兼容性

透明度

??(低)

??(差)

??(低)

??????(好)

多重背景

??

??

??

??????

動畫

??????(高)

????

????

??????

自定義屬性動畫

????

??????(強)

??????

????

color-mix

??

??????

??????(高)

??(差)

總的來說,自定義屬性動畫在各方面是比較推薦的,如果不考慮firefox的話基本可以放心使用了,其他方式也可以根據實際需求自行選擇,哪個方便用哪個。

參考資料

[1]@property - CSS:層疊樣式表 | MDN (mozilla.org): https://developer.mozilla.org/zh-CN/docs/Web/CSS/@property?。

[2]color-mix(): https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color-mix?。

[3]CSS color lighter (juejin.cn): https://code.juejin.cn/pen/7206605166953365563?。

[4]CSS color lighter (codepen.io): https://codepen.io/xboxyan/pen/dyqRyVG?。

[5]CSS color lighter (runjs.work): https://runjs.work/projects/91dcf9cdd9f7447b?。

責任編輯:姜華 來源: 前端偵探
相關推薦

2023-06-26 09:16:34

CSScolor-mix

2021-07-26 08:31:17

算法

2024-09-10 21:11:55

2021-11-02 07:44:36

CSS 技巧進度條

2022-03-18 09:42:54

JavaString

2022-10-13 14:10:49

云計算混合云數據

2025-04-30 02:00:00

2021-12-06 08:31:18

Oracle數據庫后端開發

2023-12-04 09:31:13

CSS卡片

2018-07-09 14:52:05

2020-10-21 10:37:37

混合云

2021-09-14 10:28:25

區塊鏈以太坊數據

2023-01-03 10:37:22

CSS動畫

2024-08-27 11:55:38

2024-09-13 08:22:28

2023-05-16 07:26:17

2015-12-31 09:53:12

2016物聯網

2018-09-18 11:20:07

css html5javascript

2020-10-26 14:03:07

混合云云計算云遷移

2010-09-07 16:31:27

CSS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩国产一区二区 | 国产一级片av | 狠狠做深爱婷婷综合一区 | 四虎免费视频 | www.中文字幕.com| 国产99久久精品一区二区永久免费 | 中文字幕日韩一区 | 精品无码久久久久久久动漫 | 玩丰满女领导对白露脸hd | 国产日韩精品视频 | 亚洲成人精品久久久 | 免费福利视频一区二区三区 | a国产一区二区免费入口 | 伊人春色成人网 | 在线精品一区二区 | 日韩在线视频免费观看 | 日韩精品一区二区三区视频播放 | 精品无码久久久久久国产 | 99福利在线观看 | 夜久久 | 亚洲欧美国产精品一区二区 | 999热精品 | 免费精品久久久久久中文字幕 | 在线一区视频 | 视频一区中文字幕 | 日韩成年人视频在线 | 国产成人一区在线 | 天天操天天射综合网 | 天天爽夜夜爽精品视频婷婷 | 国产精品一区视频 | 色噜噜色综合 | 黑人巨大精品 | 日韩手机在线看片 | 一级看片免费视频囗交动图 | 91精品国产综合久久婷婷香蕉 | 草逼网站| 国产农村妇女毛片精品久久麻豆 | 亚洲精品成人 | 九九亚洲精品 | 国产日韩av一区二区 | 一区二区三区中文字幕 |