1. 程式人生 > >【CSS3】 CSS3實現“圖片陰影”效果

【CSS3】 CSS3實現“圖片陰影”效果

學習前端有點類似於學習英語,很多東西需要一點點累積,下面講解CSS3實現圖片陰影效果。

1、效果展示:Shadow Effect這個塊有陰影的效果,尤其是底邊的曲線陰影非常明顯,本文主要以“Shadow Effect”這個塊進行講解曲線陰影的效果。


2、結構編寫:把大體的框架寫好。

shadow.html:

<!DOCTYPE>
<html>
<head>
	<title>CSS3實現曲線陰影</title>
	<meta charset="utf-8">
	<link type="text/css"  rel="stylesheet"  href="css/style.css">
</head>
<body>
	<div class="wrap effect"><!-把陰影的效果寫在effect類中,方便!->
		<h1>Shadow Effect</h1>
	</div>
</body>
</html>

style.css:
body{
	font-family:Arial;
	font-size:20px;
}

body ul{
	margin:0px;
	padding:0px
	list-style:none;
}
.wrap{
	width:70px;
	height:200px;
	margin:50px auto;
	background:#fff;
}

3、原理分析:一個圖形需要帶有一個主投影,如圖中綠色矩形部分,另一個帶有弧度的圖形也有自己的陰影效果,如圖中紅色部分,讓這兩個圖形發生重疊,讓他們的顏色一致然後可以把弧度陰影露出來,這樣看到的就是一個曲線陰影的效果。


4、box-shadow講解

首先寫主投影,即effect這個類,主要通過CSS3裡的box-shadow這個屬性設定。

box-shadow有多個屬性:h-shadow(水平方向的投影)、v-shadow(垂直方向的投影)、blur(可選,模糊程度,可設為任意px,且數值越大,模糊程度越大)、spread(可選,模糊尺寸)、color(可選,陰影顏色)、inset(可選、將外部陰影(outset)設定成內部陰影,預設是外部陰影)。如果把h-shadow和v-shadow都設為0的話,那麼4個方向都會有陰影。

box-shadow瀏覽器相容性:IE9+,Firefox4,Chrome,Opera以及Safari5.1。

box-shadow可以新增多個陰影,用逗號隔開。

完成主陰影部分:

.effect{
	box-shadow:0px 1px 4px rgba(0,0,0,0.3),0 0 40px rgba(0,0,0,0.1) inset;
	webkit-box-shadow:0px 1px 4px rgba(0,0,0,0.3),0 0 40px rgba(0,0,0,0.1) inset;
	moz-box-shadow:0px 1px 4px rgba(0,0,0,0.3),0 0 40px rgba(0,0,0,0.1) inset;
	o-box-shadow:0px 1px 4px rgba(0,0,0,0.3),0 0 40px rgba(0,0,0,0.1) inset;
}

此時的效果如下:


5、after和before

根據前面的原理分析,我們需要帶有曲線陰影的圖形,這是可以使用after和before來完成。

after選擇器:在被選元素的內容後面插入內容;

before選擇器:在被選元素的內容前面插入內容;

上面這兩句話怎麼理解呢?可以這樣試試:

before:

.effect:before{
	content:"hello";
};

可以看到:Shadow Effect幾個字向下移動了。(這裡其實我不太懂,為什麼hello沒有被擠到外面呢?因為在下面after選擇器中,hello是被擠到外面去了,我的猜想是:hello是一個單純的文字,它在h1的前面,所以它先佔用一部分空間,然後剩餘的空間留給h1,因為h1的高度和盒子高度一樣,但是hello已經佔用了一部分高度,所以h1只能往下移,但為什麼沒有超出盒子呢?此時h1的高度又是多少?)


after:

.effect:after{
	content:"hello";
};
可以看到:hello被擠到外面去了(因為h1和盒子的高度都是200px)


言歸正傳,我們需要一個帶弧度陰影的圖形。

.effect:after{
	content:" ";
	background:#f00;/*為了讓大家看清楚,先設定一個顏色紅色*/
};
此時看不到任何東西,因為content為空。

為了讓主陰影和弧度陰影重疊,我們需要利用定位的知識。在這裡相對於effect定位,因為它是父類,先設定effect類:position:relative,再設定弧度陰影所在的盒子:position:absolute,然後確定弧度陰影所在盒子的大小,可以直接width和height,也可以直接設定它的位置,四個方向(top,right,bottom,left缺一不可)都需要設定,那麼它的寬和高也就確定了。

.effect:after{
	content:" ";
	background:#f00;/*為了讓大家看清楚,先設定一個顏色紅色*/
	position:absolute;
	top:50%;
	bottom:0px;
	left:10px;
	right:10px;
};
這樣盒子就出來了:

然後給這個盒子新增陰影,只需要外陰影:

        box-shadow:0 0 20px rgba(0,0,0,0.8);
	webkit-box-shadow:0 0 20px rgba(0,0,0,0.8);
	moz-box-shadow:0 0 20px rgba(0,0,0,0.8);
	o-box-shadow:0 0 20px rgba(0,0,0,0.8);

但是這個陰影並不是弧形,而是直線,因此我們要給弧形陰影所在盒子設定一個半徑,用到border-radius。

如果把border-radius設定為100px,就特別圓,下面還是直線,因此把border-radius設定為100px/10px(水平方向半徑設定為100px,垂直方向設定為10px),還可以讓陰影往下移點,使陰影更多,就可以設定bottom為負值:


讓弧度陰影所在圖形出現在主圖形的後面,可以設定:z-index:-1

bottom為-2px:


bottom為-1px:


但是弧形陰影的顏色不是特別深,可以使用兩個弧形投影,也就是再加一個弧形投影,使用before。

.effect:after,.effect:before{
	content:" ";
	background:#f00;/*為了讓大家看清楚,先設定一個顏色紅色*/
	position:absolute;
	top:50%;
	bottom:0px;
	left:10px;
	right:10px;
	box-shadow:0 0 20px rgba(0,0,0,0.8);
	webkit-box-shadow:0 0 20px rgba(0,0,0,0.8);
	moz-box-shadow:0 0 20px rgba(0,0,0,0.8);
	o-box-shadow:0 0 20px rgba(0,0,0,0.8);
	border-radius:100px/10px;
	z-index:-1;

};

6、總結:把直角陰影寫在盒子上,在盒子內部再插入兩個曲線陰影,通過定位讓直角陰影和曲線陰影重疊,把z-index設定為負,讓曲線陰影到直角陰影的背後,再把border-radius把水平和垂直半徑設定成不同的值形成弧度,這樣曲線陰影的效果就實現了。