天天看點

圖解css3:核心技術與案例實戰. 3.5 CSS3盒子陰影屬性

<b>3.5 css3盒子陰影屬性</b>

box-shadow也是css3新增的一個重要屬性,用來定義元素的盒子陰影。本節主要介紹css3的box-shadow的屬性以及如何使用。

3.5.1 box-shadow屬性的文法及參數

在具體學習box-shadow使用方法之前,我們必須先知道box-shadow使用的文法規則。

box-shadow:none | [ &lt;length&gt;

&lt;length&gt; &lt;length&gt;?&lt;length&gt;? || &lt;color&gt; ] [ ,

&lt;length&gt; &lt;length&gt; &lt;length&gt;? &lt;length&gt;?|| &lt;color&gt;

]+

上面的文法規則可以簡寫如下:

box-shadow:none | [inset  x-offset y-offset blur-radius spread-radius

color], [inset  x-offset y-offset

blur-radius spread-radius color]

box-shadow屬性可以使用一個或多個投影,如果使用多個投影時必須使用逗号“,”隔開。

其實box-shadow屬性很簡單,可以為其設定以下參數。

none:預設值,元素沒有任何陰影效果。

inset:陰影類型,可選值。如果不設定,其預設的投影方式是外陰影;如果取其唯一值“inset”,就是給元素設定内陰影。

x-offset:陰影水準偏移量,其值可以是正負值。如果取正值,則陰影在元素的右邊,反之取負值,陰影在元素的左邊。

y-offset:陰影垂直偏移量,其值可以是正負值。如果取正值,則陰影在元素的底部,反之取負值,陰影在元素的頂部。

blur-radius:陰影模糊半徑,可選參數。其值隻能是正值,如果取值為“0”時,表示陰影不具有模糊效果,如果取值越大,陰影的邊緣就越模糊。

spread-radius:陰影擴充半徑,可選參數。其值可以是正負值,如果取值為正值,則整個陰影都延展擴大,反之取值為負值,則整個陰影都縮小。

color:陰影顔色,可選參數,如果不設定任何顔色時,浏覽器會取預設色,但各浏覽器預設色不一樣,特别是在webkit核心下的浏覽器将無色,也就是透明,建議不要省略這個參數。

3.5.2 box-shadow屬性使用方法

和psd軟體制作圖檔相比,box-shadow修改元素的陰影效果要友善得多,因為box-shadow可以修改六個參數,得到不同的效果。下面結合一些簡單的案例來對box-shadow屬性進行示範說明。

1.單邊陰影效果

定義元素的單邊陰影效果和調協border的單邊邊框顔色是相似的,例如:

&lt;!doctype html&gt;

&lt;html lang="en-us"&gt;

&lt;head&gt;

&lt;meta charset="utf-8"&gt;

&lt;title&gt;box-shadow設定單邊陰影效果&lt;/title&gt;

&lt;style type="text/css"&gt;

.box-shadow {

width: 200px;

height: 100px;

border-radius: 5px;

border: 1px solid #ccc;

margin: 20px;

    }

.top {

box-shadow: 0 -2px 0 red;

.right {

box-shadow: 2px 0 0 green;

.bottom {

box-shadow: 0 2px 0 blue;

.left {

box-shadow: -2px 0 0 orange;

&lt;/style&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;div class="box-shadow top"&gt;&lt;/div&gt;

&lt;div class="box-shadow right"&gt;&lt;/div&gt;

&lt;div class="box-shadow bottom"&gt;&lt;/div&gt;

&lt;div class="box-shadow left"&gt;&lt;/div&gt;

&lt;/body&gt;

&lt;/html&gt;

效果如圖3-38所示。

這個案例中,使用box-shadow給元素設定了頂邊、右邊、底邊和左邊的單邊陰影效果。主要通過box-shadow的水準和垂直陰影的偏移量來實作,其中x-offset為正值時,生成右邊陰影,反之為負值時,生成左邊陰影;y-offset為正值時,生成底部陰影,反之為負值時生成頂部陰影。此例中是一個單邊實影投影效果(陰影模糊半徑為0),但是如果陰影的模糊半徑不是0,上面的方法還能不能實作單邊陰影效果呢?不急着來回答,在上面的執行個體中添加一個模糊半徑,例如:

box-shadow: 0 -2px 5px red;

box-shadow: 2px 0 5px green;

box-shadow: 0 2px 5px blue;

box-shadow: -2px 0 5px orange;

圖3-39說明,這個效果并不是理想的單邊陰影效果,當box-shadow添加了5px陰影模糊半徑後,陰影不再是實影投影,陰影清晰度向外擴散,更具陰影的效果。但造成了另一個問題,給元素其他三個邊加上淡淡的陰影效果,可這并不是設計需要的效果。

那究竟要怎麼做呢?此時,box-shadow屬性中的陰影擴充半徑(spread-radius)會是一個很關鍵的屬性,要實作單邊陰影效果,必須配上這個屬性(除單邊實影之外)。

圖3-39 有模糊值的單邊陰影效果

box-shadow: 0 -4px 5px -3px red;

box-shadow: 4px 0 5px -3px green;

box-shadow: 0 4px 5px -3px blue;

    .left {

box-shadow: -4px 0 5px -3px orange;

上面的代碼調整了陰影的位移量,新增了box-shadow的擴充半徑,最終效果如圖3-40所示。

意     各浏覽器下顯示效果略有細節差别。

2.四邊相同陰影效果

box-shadow給元素設定相同的四邊陰影效果,其實分為兩種,在這裡先看第一種。

(1)隻設定陰影模糊半徑和陰影顔色

隻設定陰影模糊半徑和陰影顔色。例如:

.box-shadow{

border-radius: 10px;

box-shadow: 0 0 10px #06c;

效果如圖3-41所示。

在這個示例基礎上,添加box-shadow擴充半徑還可以控制陰影深度,如果取正值将加深陰影的深度,如果取負值可以向内壓縮陰影,直到擴充半徑等于模糊半徑時,陰影會完全消失。例如:

      width: 200px;

box-shadow: 0 0 10px 10px #06c;

效果如圖3-42所示。

接下來,将擴充半徑改成“-10px”,

此時将看不到任何陰影效果。

box-shadow: 0 0 10px  -10px #06c;

效果如圖3-43所示。

(2)隻設定擴充半徑和陰影顔色

另外一種設定元素四邊相同陰影效果,是設定擴充半徑和陰影顔色,先來看一個簡單的示例。

圖3-43 無陰影效果

box-shadow: 0 0  0 10px #06c;

效果如圖3-44所示。

圖3-44 四邊相同陰影效果

從圖3-44可知道,box-shadow制作的陰影效果和元素設定“10px”實線邊框一樣。

border:10px solid  #06c;

如此一來,可以利用box-shadow擴充半徑制作類似于邊框的效果,但實質上并非邊框,因為box-shadow并不是盒模型中的元素,不會計算到内容寬度。具體來看一個box-shadow與border的對比示例。

&lt;title&gt;border與box-shadow&lt;/title&gt;

.box {

text-align: center;

line-height: 100px;

float: left;

margin: 30px;

   }

.border{

border: 10px solid red;

box-shadow: 0 0 0 10px red;

&lt;div class="box border"&gt;border&lt;/div&gt;

&lt;div class="box box-shadow"&gt;box-shadow&lt;/div&gt;

效果如圖3-45所示。

圖3-45 border與box-shadow制作邊框效果對比

圖3-45證明了box-shadow不會影響頁面的任何布局。div.border元素的邊框被計算了寬度,但div.box-shadow的陰影被浏覽器忽略不計,是以借助box-shadow屬性的這個特性,border-shadow用來模拟元素的邊框效果可以自由地使用,但必須注意其層級關系。

w3c标準規範中描述了box-shadow的工作方式,直覺告訴我們box-shadow在元素盒模型中的層次關系,如圖3-46所示。

圖3-46告訴我們很多資訊,比如說border-radius圓角、陰影擴充、陰影模糊以及padding是如何影響對象的陰影的。非零值的border-radius會以相同的作用影響陰影的外形,但border-image不會影響對象陰影的任何外形;對象陰影同盒模型的層次一樣,外陰影會在對象背景之上,内陰影會在邊框之下,背景之上。是以整個層級就是:邊框在内陰影之上,内陰影在背景圖檔之上,背景圖檔在背景色之上,背景色在外陰影之上。

3.内陰影

前幾種都是外陰影的使用方法,其實使用inset屬性值可以改變元素的陰影類型,将元素的預設外陰影重置為内陰影類型。例如:

box-shadow: inset 3px 3px 10px #06c;

效果如圖3-47所示。

圖3-47 box-shadow制作内陰影

不過box-shadow的内陰影使用在圖檔“img”元素上是沒有任何效果的,例如:

&lt;title&gt;圖檔内陰影效果&lt;/title&gt;

img {

box-shadow: inset 5px 5px 10px #06c;

&lt;img src="border.jpg" alt=""

width="200" /&gt;

效果如圖3-48所示。

圖3-48 box-shadow在img上的内陰影無效果

圖3-48的效果再次證明了box-shadow的inset内陰影直接運用在img上沒有任何效果,但在實際web項目中難免在圖檔上添加内陰影的效果。記得将border-radius運用在img上時,webkit核心浏覽器也無效果,最後在img外添加一個容器标簽,并将img轉換成外容器的背景圖檔,将border-radius運用在外容器上才有圓角效果的。借助這個思路,也在img标簽外添加一個容器,例如“div”标簽,但這裡不将img轉換成div标簽的背景,隻是将box-shadow的内陰影使用在div标簽上,例如:

display: inline-block;/*這個很重要*/

position:relative;/*這個很重要*/

z-index: -1;/*這個很重要*/

vertical-align: top;

&lt;div class="box-shadow"&gt;

 &lt;/div&gt;

此時img就具有内陰影效果了,如圖3-49所示。

圖3-49 圖檔内陰影效果

也可以像border-radius制作圖檔圓角的方法,将圖檔轉為容器div的背景圖,也能實作圖3-49的效果,但是會使用javascript腳本。對于不懂腳本的web設計師來說,還是蠻頭痛的。具體的操作方法可以參考border-radius一節。

4.多層陰影

前幾種都是單陰影效果的使用,其實box-shadow可以多層陰影同時使用,每層陰影之間使用逗号“,”隔開。而每層陰影的使用方法都和前面一樣,例如:

box-shadow: -5px 0 5px red, 0 5px 5px blue, 5px 0 5px green, 0 -5px 5px

orange;

效果如圖3-50所示。

制作多層陰影效果時,不設定模糊半徑,隻設定擴充半徑,并配合多個陰影顔色,還可以制作多色邊框效果,代替border-color屬性制作多色邊框效果,例如:

    width:

200px;

box-shadow: 0 0 0 1px red,

                  0 0 0 5px blue,

                  0 0 0 8px green,

                  0 0 0 12px yellow,

                  0 0 0 16px orange,

                  0 0 0 20px #06c,

                  0 0 0 24px lime;

  }

效果如圖3-51所示。

使用box-shadow制作多色邊框效果,需要注意模仿border的寬度。前面介紹過box-shadow的工作模式,在計算寬度時需要減去前面陰影的值,才是顯示的顔色寬度。

在使用多層級box-shadow時,還需要特别注意陰影的順序,最先寫的陰影将顯示在最頂層,如上面的示例,先定義1px紅色陰影,再定義5px藍色陰影,接着是8px綠色陰影,以此類推。顯示結果就是紅色在藍色上面,藍色在綠色上面,綠色在黃色上面,以此類推。但是,如果最前面的陰影太大,頂層的陰影就會遮蓋底部的陰影。例如,上例中将最底層的24px的lime陰影放到最前面,效果就完全不一樣了。

box-shadow: 0 0 0 24px lime,

                  0 0 0 1px red,

                  0 0 0 20px #06c;

此時後面的陰影都被第一個陰影遮蓋了,如圖3-52所示。

圖3-52 被遮蓋的陰影效果

3.5.3 浏覽器相容性

目前box-shadow屬性得到很好的支援,ie 8及以前版本的浏覽器不支援box-shadow屬性。在現代浏覽器的新版本中無須加各浏覽器的字首,不過要向前相容,firefox 3.5~3.6下需要添加“-moz-”,chrome 4~9和safari 3.1~5.0浏覽器中添加“-webkit”。借助相容方式,各主流浏覽器對box-shadow屬性的支援情況如表3-7所示。

表3-7 box-shadow的浏覽器相容表

屬性名                                         

box-shadow     9

+√        3.5 +√     2.0 +√     10.5 +√  4.0 +√

雖然ie低版本不支援這個屬性,但目前box-shadow在實際項目中運用越來越普遍。因為box-shadow實作陰影比使用背景圖檔的方法友善,同時能為web前端設計師減少很多時間,維護也友善。

要相容ie低版本,可以使用ie 的濾鏡來模拟實作。

filter:

progid:dximagetransform.microsoft.shadow(color='顔色值',

direction=陰影角度(數值), strength=陰影半徑(數值));

其中“dropshadow”(盒狀陰影)和“shadow”(陰影)兩個濾鏡正是為實作陰影而設,另外“glow”(發光)濾鏡則用于在盒容器四周實作發光陰影。但這些濾鏡可設定的參數并不像box-shadow屬性那樣提供諸多的自定義參數,我不認為這些濾鏡能夠實作前面示例中所需的效果。當然除了ie濾鏡之外,同樣可以采用前面說的pie和ie -css3腳本來實作ie 下的陰影效果。

示     現代浏覽器使用box-shadow來制作陰影,而不支援box-shadow的浏覽器讓它不顯示陰影,如果非要完美相容,不妨考慮在不支援box-shadow的浏覽器中使用背景圖檔來模仿陰影。

<b>3.5.4 box-shadow屬性的優勢</b>

從實作盒子陰影來說,box-shadow是最友善的,不管是使用背景圖檔,還是使用濾鏡或者說javascript腳本,都無法與box-shadow屬性相比。

box-shadow具有多個屬性參數可選,能制作出圓潤平滑的陰影效果。

代碼維護友善,可以随時更改參數來實作效果的更新。

3.5.5 實戰體驗:制作3d搜尋表單

為了友善讀者了解,接下來介紹一個box-shadow案例——制作3d搜尋表單。

在這個案例中,除了使用box-shadow之外,還使用border-radius制作圓角,并涉及text-shadow制作文本陰影,以及gradient制作漸變背景圖檔,關于這兩項技術,請參閱後面章節。整個案例的效果如圖3-53所示。

圖3-53 box-shadow制作3d搜尋表單

從box-shadow多層級陰影特性出發,給表單容器設定多個同方向陰影效果,并且配合圓角屬性border-radius來描繪圓角線框,同時使用漸變屬性制作漸變的背景圖檔等,結合css3的多種效果,進而建構出這個3d搜尋表單。

1.建構3d表單的結構

整個表單結構很簡單,代碼如下所示。

&lt;!—表單結構--&gt;

&lt;form id="formwrapper"&gt;

&lt;div class="formfiled clearfix"&gt;

&lt;!-- 搜尋表單的輸入框 --&gt;

&lt;input type="text"

required="" placeholder="search for css3, html5, jquery

..." class="search"&gt;

&lt;!-- 搜尋按鈕 --&gt;

&lt;input type="submit"

class="btn submit" value="go"&gt;

&lt;/div&gt;

&lt;/form&gt;

整個結構使用一個“form”元素,并且應用一個“div.formfiled”容器來包裹“input.search”的輸入框和一個搜尋按鈕“input.btn”,如圖3-54所示。

圖3-54 搜尋表單結構

2.設計表單容器的3d立體效果

使用box-shadow的多層陰影特性給表單元素設計3d立體效果,樣式代碼如下所示。

#formwrapper {

width: 450px;/*設定搜尋表單的寬度*/

padding: 8px;

overflow: hidden;/*清除浮動*/

/*設定表單的邊框效果*/

border-width: 1px;

border-style: solid;

border-color: #dedede #bababa #aaa #bababa;

/*最為關鍵的代碼,設定表單3d立體效果*/

box-shadow: 0 3px 3px rgba(255,255,255,.1),

                  0 3px 0 #bbb, 0 4px 0 #aaa,

                  0 5px 5px #444;

/*設定圓角效果*/

/*使用漸變制作表單的漸變背景圖檔*/

background-color: #f6f6f6;

background-image: -webkit-gradient(linear, left top,

                       left bottom,

from(#f6f6f6), to(#eae8e8));

background-image: -webkit-linear-gradient(top, #f6f6f6, #eae8e8);

background-image: -moz-linear-gradient(top, #f6f6f6, #eae8e8);

background-image: -ms-linear-gradient(top, #f6f6f6, #eae8e8);

background-image: -o-linear-gradient(top, #f6f6f6, #eae8e8);

background-image: linear-gradient(top, #f6f6f6, #eae8e8);

}

3.制作表單輸入框的搜尋按鈕效果

接下來使用box-shadow制作3d立體效果,為了使表單更漂亮,将輸入框和搜尋按鈕進行美化,代碼如下所示。

/*輸入框樣式效果*/

#formwrapper .search {

width: 330px;

height: 20px;

padding: 10px 5px;

font: bold 16px 'lucida sans', 'trebuchet ms', 'tahoma';

box-shadow: 0 1px 1px #ddd inset, 0 1px 0 #fff;/*多陰影效果*/

border-radius: 3px;

  /*輸入框得到焦點時樣式*/

#formwrapper .search:focus {

outline: 0;

border-color: #aaa;

box-shadow: 0 1px 1px #bbb inset;

#formwrapper .search::-webkit-input-placeholder,

#formwrapper .search:-moz-placeholder,

#formwrapper .search:-ms-input-placeholder {

color: #999;

font-weight: normal;

/*搜尋按鈕效果*/

#formwrapper .btn {

float: right;

border: 1px solid #00748f;

height: 42px;

width: 100px;

padding: 0;

cursor: pointer;

font: bold 15px arial, helvetica;

color: #fafafa;

text-transform: uppercase;

background-color: #0483a0;

                        left bottom,

from(#31b2c3), to(#0483a0));

background-image: -webkit-linear-gradient(top, #31b2c3, #0483a0);

background-image: -moz-linear-gradient(top, #31b2c3, #0483a0);

background-image: -ms-linear-gradient(top, #31b2c3, #0483a0);

background-image: -o-linear-gradient(top, #31b2c3, #0483a0);

background-image: linear-gradient(top, #31b2c3, #0483a0);

text-shadow: 0 1px 0 rgba(0, 0 ,0, .3);

box-shadow: 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 1px 0 #fff;

  /*按鈕懸浮狀态和焦點狀态下效果*/

#formwrapper .btn:hover,

#formwrapper .btn:focus {

      background-color: #31b2c3;

                  left bottom, from(#0483a0),

to(#31b2c3));

background-image: -webkit-linear-gradient(top, #0483a0, #31b2c3);

background-image: -moz-linear-gradient(top, #0483a0, #31b2c3);

background-image: -ms-linear-gradient(top, #0483a0, #31b2c3);

background-image: -o-linear-gradient(top, #0483a0, #31b2c3);

background-image: linear-gradient(top, #0483a0, #31b2c3);

/*按鈕點選時效果*/

#formwrapper .btn:active {

box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5) inset;

/*firefox下按鈕去除焦點線*/

#formwrapper::-moz-focus-inner {

border: 0;

制作的3d立體搜尋表單效果如圖3-53所示。當然這隻是一個簡單的案例,box-shadow還可以制作更多的效果,例如雙層邊框效果、發光效果、立體按鈕等。大家還可以發揮自己的想象力,創造出更多的有創意的、有吸引力的ui效果。

繼續閱讀