一、顏色匹配效果預覽
如下gif示意,當我們按鈕背景色逐漸變淡的時候,文字顏色也從原來的白色變成黑色了,同時邊框也顯示出來了,其中的配色轉換是純css實現的。
您可以狠狠地點選這裡: 按鈕文字及邊框顏色隨著背景色自動變化demo
拖動r,g,b對應滑塊,可以看到按鈕文字顏色以及邊框顏色,會自動根據背景色不同而發生變化。具體表現為:
這種智慧型匹配是純css實現的,主要是使用css3 calc()計算,以及css3原生var變數。
二、配色**展示
html**很簡單,如下:
重點和難點在css部分:
:root
.btn
乍一看,猶如鴨子聽雷——不知所云,其實不複雜,且容我剖析下實現原理。
三、前景背景自動配色原理
1. css屬性值範圍溢位邊界渲染特性
css這門語言有個很有意思的特性,就是css屬性值超過正常的範圍的時候,只要格式正確,也會渲染,而渲染的值就是合法邊界值。
舉兩個板栗:
opacity 透明度屬性值合法範圍是0-1,但是,你設定負數,或者極大值,瀏覽器也能解析,只是要麼是0,要麼是1而已,如下:
.example
色值,如hsl,s和l的範圍都是0%-100%,但是,你設定負數,或者極大值,瀏覽器也能解析,只是要麼是0要麼是100%而已,如下:
.example
本文的配色技術就活用了這種邊界渲染特性。
2. var變數傳遞給calc實現複雜計算
我們對css**從上往下逐個剖析下。
首先,在:root根選擇器上定義幾個全域性css變數(語義上的全域性):
:root
其中:–threshold
這個是color變色的臨界值,用來和當前rgb顏色值的亮度對比。
–border-threshold
這個是邊框顏色透明度的臨界值,同樣也是和當前rgb顏色值的亮度對比。
然後是 .btn{} 內部的css**:
background: rgb(var(--red), var(--green), var(--blue));
這個很好理解,就是基本的rgb色值作為背景色。
--r: calc(var(--red) * 0.2126);
--g: calc(var(--green) * 0.7152);
--b: calc(var(--blue) * 0.0722);
--sum: calc(var(--r) + var(--g) + var(--b));
--lightness: calc(var(--sum) / 255);
這裡5行5個css變數,需要的其實是最後乙個 --lightness ,就是計算當前背景色的亮度。用的是使用srgb luma灰度演算法 ① ,為什麼需要5行呢?因為計算公式就是如此:
lightness = (red * 0.2126 + green * 0.7152 + blue * 0.0722) / 255
其中,r,g,b色值相乘的係數就是固定的,不同灰度演算法係數還不一樣。 --lightness 表示亮度,範圍是0-1,此時就可以和 --threshold 和 --border-threshold 這兩個臨界值比對,來確定按鈕的文字顏色,邊框透明度。
① 這裡的灰度可以看成是亮度,實際上hsl的亮度計算方法應該是,r,g,b中的色值最大值和最小值之和的二分之一。
color: hsl(0, 0%, calc((var(--lightness) - var(--threshold)) * -999999%))
設定顏色的css**。
此處 calc 計算翻譯成中文就是:(亮度值 –程式設計客棧 臨界值) * 比例係數。
其中亮度值在0-1之間遊走,臨界值是固定的0.5,於是:
如果亮度值小於0.5,亮度值減去臨界值為負,由於我們的比例係數是很大很大的負數,負負得正,於是,會得到乙個巨大的正數,按照邊界渲染原理,會按照100%渲染,於是顏色是白色;
如果亮度值大於0.5,亮度值減去臨界值為正,由於我們的比例係數是很大很大的負數,於是,會得到乙個巨大的負數,按照邊界渲染原理,會按照0%渲染,於是顏色是黑色;
以上就是按鈕文字顏色變色背景下黑色,深色背景下白色的原理。
--border-alpha: calc((var(--lightness) - var(--border-threshold)) * 100);
邊框透明度是類似的原理。此處 calc 計算翻譯成中文就是:(亮度值 – 邊框臨界值) * 100。
其中亮度值在0-1之間遊走,邊框臨界值是固定的0.8,於是:
如果亮度值小於0.8,亮度值減去邊框臨界值為負,在css中,負數透明度會按照邊界0渲染,此時邊框完全透明;
如果亮度值大於0.8,亮度值減去邊框臨界值為正,此時的透明度計算值會在0~20之間遊走,當然,數值大於1的透明度值都會按照1渲染,此時,邊框基本處於完全不透明狀態,加深的邊框顯現;
border: .2em solid;
border-color: rgba(calc(var(--red) - 50), calc(var(--green) - 50), calc(var(--blue) - 50), var(--border-alpha));
設定邊框樣式,邊框顏色比背景色深50個單位值(負數為按照0渲染),然後透明度就是基於亮度動態計算的。深色背景下,按鈕邊框透明度為0,不顯示;淺色背景下,透明度在0~1之間遊走,出現,北京顏色越淺,邊框透明度越大,邊框顏色越深,符合配色預期。
相信經過上面的一番剖析,大家就會明白其實現的原理了。
改變按鈕的背景色
.btn類名下的css**是固定的,讓我們需要改變按鈕的顏色的時候,不是改.btn下的css,而是修改:root中的下面3個變數值:
--red: 44;
--green: 135;
--blue: 255;
css設定直接改數值,如果是js設定,借助 setproperty() 方法,若不了解,可以參考這篇文章:「 如何html標籤和js中設定css3 var變數 」。
四、最後結束語
由於var的相容性限制,這個非常有意思的css技巧還不太適合在大型對外專案中使用。
小程式可以一試,因為核心環境相對固定。內部系統,實驗專案可以玩一玩,會很有意思。
這種配色技巧其實不僅可以用在按鈕上,一些大區域的布局也是可以用的,因為這些布局的背景色可能是動態的 ,此時,文字顏色的配色也可以借助css實現自動化。
另外,本文demo中按鈕文字就黑白兩色,實際上,我們的相乘係數小一點的話,可以有更多的色值出現,配色會更加精緻。
參考文章
switch font color … css
總結本文標題: css前景背景自動配色技術簡介(demo)
本文位址:
css相關及背景前景相關
不同型別style權值問題 內聯 id 屬性.型別 通用 為0 盒子模型 外層是bb 裡層圖塊是aa 外邊距在bb上 內邊距在aa設定,還可以設定aa的邊框等 border 大小,樣式,顏色。樣式的背景與前景 background color f90 背景色,樣式表優先順序高 background ...
Turbo rack技術背景及簡介
雲計算技術的快速演進,給今天的資料中心帶來了很大的挑戰,機櫃功耗密度 如 6kw 9kw 16kw 提公升導致機櫃上架密度降低,機櫃額定配電的利用率普遍不足!目的 為了改善資料中心能效,通過turborack,降低tco 總擁有成本 隨著伺服器上的工作負載越來越多,伺服器的功耗逐漸增加。解決哪些問題...
自動問答技術簡介
瀏覽 1081次 出處資訊 引言圖 1 siri 左 和watson 右 傳統的自動問答系統包括三個主要部分 問題分析 資訊檢索和答案抽取。結構關係如下 圖 2 傳統的自動問答系統的組成部分 答案抽取是從檢索得到的相關文件中抽取答案。根據問題型別的不同,答案形式也不盡相同,可能是乙個詞語 乙個句子,...