??注意:由于CSS3中的部分內(nèi)容尚未完全定稿,所以本文的部分可能會(huì)隨時(shí)更新。
在之前的一篇文章CSS3背景中,我們有談到background-image
屬性,此屬性用于設(shè)置元素的背景圖片,我們可以為之賦值一個(gè)圖片url,還可以使用CSS3提供的漸變(gradient)技術(shù)來設(shè)置一張漸變的純CSS背景。
CSS3支持的漸變可分為線性漸變(linear-gradient)、徑向漸變(radial-gradient)、重復(fù)線性漸變(repeating-linear-gradient)和重復(fù)徑向漸變(repeating-radial-gradient)。
由于W3C官方組織尚未對漸變這一塊完全定稿,雖然主流的現(xiàn)代瀏覽器基本都已經(jīng)對漸變提供了支持,但是具體的實(shí)現(xiàn)細(xì)節(jié)可能不太一致,需要針對不同的瀏覽器內(nèi)核添加私有前綴。
下圖是摘自www.o2fo.com的瀏覽器兼容性圖表,可供參考。
什么叫線性漸變?
顏色沿著一條直線過渡,比如從左側(cè)到右側(cè)、從右側(cè)到左右、從頂部到底部、從底部到頂部、從左上角到右下角等等,簡單來說漸變方向是一條直線,此直線可以沿著任意軸。如果有過PS、flash等軟件或者設(shè)計(jì)經(jīng)驗(yàn)的話,應(yīng)該不難理解。
W3C規(guī)定的線性漸變語法如下,
background-image: linear-gradient(direction, color-start, ..., color-end);
即,linear-gradient
包含如下幾個(gè)基本參數(shù),
同時(shí),你還可以在漸變起點(diǎn)和漸變終點(diǎn)中間插入任意多個(gè)色標(biāo)來達(dá)到多重顏色漸變的目的。
關(guān)于漸變方向,我們可以設(shè)置為一些常用關(guān)鍵詞,比如top、right、bottom、left,以及這四個(gè)基本關(guān)鍵詞的任意相鄰方向的兩兩組合,比如top left、top right等等。
漸變方向除了可以設(shè)置為常用關(guān)鍵詞之外,我們還可以設(shè)置一個(gè)角度值,即0deg
~360deg
。這個(gè)角度值也可以為負(fù)值。正負(fù)值的區(qū)別在于漸變方向相對于默認(rèn)值的方向是不同的。
??注意,此參數(shù)可以省略。當(dāng)漸變方向省略時(shí),W3C規(guī)定的漸變方向默認(rèn)值為top,即漸變方向從上到下。
線性漸變的漸變起點(diǎn)其實(shí)是一個(gè)顏色值(后面說到的徑向漸變也有漸變起點(diǎn)的概念,但是此起點(diǎn)非彼起點(diǎn)),而且還可以包含一個(gè)長度值,此長度值可省略。長度值存在的含義是,可以對漸變起點(diǎn)進(jìn)行偏移。
漸變終點(diǎn)為一個(gè)顏色值,也可以包含一個(gè)長度值,此長度值可省略。長度值存在的含義是,可以對漸變終點(diǎn)進(jìn)行偏移。
值得一提的是,漸變終點(diǎn)的偏移效果與漸變起點(diǎn)的偏移效果是不一樣。欲知詳情,請繼續(xù)往下看????。
下面有一段示例,讓我們一起來體驗(yàn)一下(為了方便,css部分的代碼僅給出了webkit內(nèi)核的聲明)
<style>
div {
width: 400px;
height: 300px;
border: 1px solid;
margin-right: 15px;
float: left;
}
.div1 {
background-image: -webkit-linear-gradient(top, pink, green);
}
.div2 {
background-image: -webkit-linear-gradient(top left, pink, green);
}
.div3 {
background-image: -webkit-linear-gradient(45deg, pink, green);
}
</style>
<div class=“gradient div1”>
-webkit-linear-gradient(top, pink, green);
</div>
<div class=“gradient div2”>
-webkit-linear-gradient(bottom right, pink, green);
</div>
<div class=“gradient div3”>
-webkit-linear-gradient(45deg, pink, green);
</div>
其效果如下圖所示,
上面我們已經(jīng)看到了線性漸變的基本用法及其效果,下面我們來看一下針對不同參數(shù)進(jìn)行不同賦值時(shí)的效果。
首先,我們來嘗試一下給漸變起點(diǎn)或者漸變終點(diǎn)設(shè)置一個(gè)長度值看看效果。代碼如下,
<style>
.gradient {
width: 400px;
height: 300px;
font-size: 10px;
margin-right: 15px;
float: left;
border: 1px solid;
text-align: center;
line-height: 80px;
}
.div1 {
background-image: -webkit-linear-gradient(top, pink 100px, green 200px);
}
.div2 {
background-image: -webkit-linear-gradient(bottom right, pink 100px, green 200px);
}
.div3 {
background-image: -webkit-linear-gradient(45deg, pink, green 50%);
}
</style>
<div class=“gradient div1”>
-webkit-linear-gradient(top, pink 100px, green 200px);
</div>
<div class=“gradient div2”>
-webkit-linear-gradient(bottom right, pink 100px, green 200px);
</div>
<div class=“gradient div3”>
-webkit-linear-gradient(45deg, pink, green 50%);
</div>
其效果如下,
從效果圖中可以看出,
其次,將漸變方向設(shè)置為一個(gè)角度值時(shí),我們可以給出一個(gè)負(fù)值,比如
<style>
.gradient {
width: 400px;
height: 300px;
font-size: 10px;
margin-right: 15px;
float: left;
border: 1px solid;
text-align: center;
line-height: 80px;
}
.div1 {
background-image: -webkit-linear-gradient(45deg, pink, green);
}
.div2 {
background-image: -webkit-linear-gradient(-45deg, pink, green);
}
</style>
<div class=“gradient div1”>
-webkit-linear-gradient(45deg, pink, green);
</div>
<div class=“gradient div2”>
-webkit-linear-gradient(-45deg, pink, green);
</div>
其效果如下,
所以,當(dāng)我們給漸變方向設(shè)置為一角度值時(shí),其實(shí)是改變了漸變方向。
??注意:此處在chrome(webkit內(nèi)核)的瀏覽器上有一個(gè)坑。當(dāng)我們設(shè)置漸變方向?yàn)橐唤嵌戎?strong>且此角度值為0deg
或者360deg
時(shí),如果線性漸變表達(dá)式不帶上webkit的私有前綴-webkit
的話,會(huì)得到不同的效果。如下圖,
此時(shí)得到的兩種效果其漸變方向卻是不一樣的。
至于原因,個(gè)人猜測可能是因?yàn)閹?code>-webkit-私有前綴時(shí)和W3C規(guī)定的兩種實(shí)現(xiàn)細(xì)節(jié)是不一樣的。
最后,我們可以在漸變起點(diǎn)和漸變終點(diǎn)之間插入任意多個(gè)色標(biāo),來達(dá)到多重顏色漸變的目的。比如,
<style>
.gradient {
width: 400px;
height: 300px;
font-size: 10px;
margin-right: 15px;
float: left;
border: 1px solid;
text-align: center;
line-height: 80px;
}
.div1 {
background-image: -webkit-linear-gradient(pink, blue, gold, green);
}
</style>
<div class=“gradient div1”>
-webkit-linear-gradient(pink, blue, gold, green);
</div>
其效果如下,
我們可以使用repeating-linear-gradient
來達(dá)到重復(fù)線性漸變的目的。所謂的重復(fù)線性漸變,就是沿著線性漸變線的兩個(gè)方向上無線延伸重復(fù)。在這里需要注意一點(diǎn)就是,我們在設(shè)置漸變色標(biāo)時(shí)應(yīng)該同時(shí)給出其偏移量,否則無法實(shí)現(xiàn)重復(fù)漸變的效果。
讓我們來看個(gè)簡單的例子,
.div1 {
background-image: -webkit-repeating-linear-gradient(top left, pink 50px, green 100px);
}
其效果如下,
什么叫徑向漸變?
不同于線性漸變,所謂的徑向漸變其實(shí)就是圓形或者橢圓形漸變,其顏色漸變的軌跡不再是沿著一條直線,而是從一個(gè)點(diǎn)開始,向所有方向進(jìn)行輻射。相對線性漸變要稍微復(fù)雜一些。
W3C規(guī)定的徑向漸變標(biāo)準(zhǔn)語法如下,
background-image: radial-gradient(center, shape size, start-color, ..., last-color);
所以,radial-gradient
將包含如下幾個(gè)參數(shù),
我們可以在漸變起點(diǎn)色標(biāo)和漸變終點(diǎn)色標(biāo)之間插入任意多個(gè)漸變中間色標(biāo)。
所謂漸變起點(diǎn)即是徑向漸變的的開始坐標(biāo)。此參數(shù)可以使用常用的位置關(guān)鍵詞,比如top、right、bottom、left、center,或者是上右下左的兩兩相鄰組合。除此之外還可以賦值為類似background-position
屬性的值,即使用長度坐標(biāo)或者百分比坐標(biāo)。
此參數(shù)的默認(rèn)值為center
,且可以省略。
shape
定義了漸變形狀。徑向漸變只有兩種漸變形狀,一種是橢圓(ellipse
)一種是圓形(circle
)。其實(shí)圓形徑向漸變是一種特殊的橢圓徑向漸變,因?yàn)榇藭r(shí)徑向漸變的主半徑(major-radius)和次半徑(minor-radius)是相同的。
此參數(shù)的默認(rèn)值為ellipse
,且可以省略。
size
定義了漸變大小。其實(shí)此參數(shù)的本質(zhì)是設(shè)置徑向漸變的主漸變半徑和次漸變半徑。如下圖,
其中水平方向是主漸變半徑,垂直方向是次漸變半徑。當(dāng)主次半徑一致時(shí)既是圓形,不一致時(shí)既為橢圓。
與線性漸變中的長度值參數(shù)相似,我們可以為漸變大小size
設(shè)置一個(gè)css允許的度量單位,如px、em等,也可以使用百分比(%)。除此之外,我們還可以設(shè)置一些特殊的關(guān)鍵詞,如下
closest-side
,指定徑向漸變的半徑長度為從圓心到離圓心最近的邊closest-corner
,指定徑向漸變的半徑長度為從圓心到離圓心最近的角farthest-side
,指定徑向漸變的半徑長度為從圓心到離圓心最遠(yuǎn)的邊farthest-corner
,指定徑向漸變的半徑長度為從圓心到離圓心最遠(yuǎn)的角當(dāng)然,我們可以對size
不作任何自定義設(shè)置,此時(shí)的默認(rèn)值為farthest-corner
。各個(gè)關(guān)鍵詞的效果如下圖,
??注意1:如果我們將漸變起點(diǎn)、漸變形狀及漸變大小這幾個(gè)參數(shù)都省略,既都采用默認(rèn)值,此時(shí)徑向漸變的最終形狀將根據(jù)容器的寬高來自動(dòng)計(jì)算確定。
??注意2:需要特別注意的是,漸變形狀和漸變大小(即shape
和size
)的本質(zhì)其實(shí)都是設(shè)置徑向漸變的最終形狀的,所以在某些時(shí)候這兩個(gè)參數(shù)可能不能同時(shí)設(shè)置。
比如有如下的css代碼,
background-image: -webkit-radial-gradient(center, circle 50px 100px, pink, green);
那么瀏覽器將不知道如何渲染,因?yàn)槟慵仍O(shè)置了關(guān)鍵詞circle
,但是又同時(shí)設(shè)置了主半徑和次半徑,而且主次半徑還不相同。我們知道主次半徑不一致的結(jié)果將會(huì)呈現(xiàn)出一個(gè)橢圓,但是之前又明確設(shè)置了circle
,此處將會(huì)有沖突。
徑向漸變的色標(biāo)跟線性漸變的色標(biāo)類似。也有兩個(gè)關(guān)鍵的漸變色標(biāo),一個(gè)是漸變起點(diǎn)色標(biāo),一個(gè)是漸變終點(diǎn)色標(biāo),且這兩個(gè)色標(biāo)都可以設(shè)置一個(gè)長度值(或者百分比)。
下面有一段示例,讓我們一起來體驗(yàn)一下(為了方便,css部分的代碼僅給出了webkit內(nèi)核的聲明,下同)
<style>
.gradient {
width: 400px;
height: 400px;
font-size: 10px;
margin-right: 15px;
float: left;
border: 1px solid;
text-align: center;
line-height: 80px;
}
.div1 {
background-image: -webkit-radial-gradient(pink, green);
}
.div2 {
background-image: -webkit-radial-gradient(pink, green);
}
</style>
<div class=“gradient div1”>width: 400px; height: 400px;</div>
<div class=“gradient div2”>width: 400px; height: 200px;</div>
其效果如下圖,
這是徑向漸變最基本的使用方法,CSS代碼中我們僅設(shè)置了漸變色標(biāo)起點(diǎn)和漸變色標(biāo)終點(diǎn),其他的參數(shù)都采用默認(rèn)值。從圖中可以看出,
上面我們已經(jīng)看到了徑向漸變的基本用法,下面我們針對不同的參數(shù)分別做一些示例。
首先我們來改變漸變起點(diǎn),代碼如下(為了簡單這里僅給出了漸變相關(guān)的css代碼)
.div1 {
background-image: -webkit-radial-gradient(center, pink, green);
}
.div2 {
background-image: -webkit-radial-gradient(top, pink, green);
}
.div3 {
background-image: -webkit-radial-gradient(top left, pink, green);
}
.div4 {
background-image: -webkit-radial-gradient(33% 33%, pink, green);
}
效果如下,
從效果圖中,我們可以看出,
其次,我們來改變徑向漸變的形狀或者大小參數(shù),示例代碼如下,
.div1 {
background-image: -webkit-radial-gradient(pink, green);
}
.div2 {
background-image: -webkit-radial-gradient(center, circle, pink, green);
}
.div3 {
background-image: -webkit-radial-gradient(center, 100px 100px, pink, green);
}
.div4 {
background-image: -webkit-radial-gradient(center, 20% 40%, pink, green);
}
其效果如下,
從上面的效果圖中,我們可以看出,
center
,ellipse
,auto
。其中漸變大小在未設(shè)置的情況下,將根據(jù)漸變起點(diǎn)和容器的大小自動(dòng)計(jì)算。circle
和ellipse
。closest-side
,closest-corner
,farthest-side
,farthest-corner
)。此處效果圖中未作示例,可參閱漸變大小。最后,類似線性漸變,我們在漸變起點(diǎn)色標(biāo)和漸變終點(diǎn)色標(biāo)中可以插入任意多個(gè)漸變色標(biāo)來得到多重徑向漸變的目的。示例如下,
.div1 {
background-image: -webkit-radial-gradient(pink, blue, gold, green);
}
.div2 {
background-image: -webkit-radial-gradient(pink 10%, blue 45%, gold 65%, green 80%);
}
其效果如下,
左邊的效果未自定義任何色標(biāo)偏移,右側(cè)自定義了色標(biāo)的偏移量。從圖中我們可以看出,
#00F
。我們可以使用repeating-radial-gradient
來達(dá)到重復(fù)徑向漸變的目的。與重復(fù)線性漸變一樣,我們在設(shè)置漸變色標(biāo)時(shí)需要同時(shí)給定偏移量,否則無法實(shí)現(xiàn)重復(fù)漸變的效果。
讓我們來看個(gè)簡單的例子,
.div1 {
background-image: -webkit-repeating-radial-gradient(top left, pink 50px, green 100px);
}
其效果如下,
更多建議: