CSS躬行記(3)——CSS屬性拾遺
一、粘滯定位
粘滯定位(sticky)與相對定位類似,既不會脫離正常流,也不會改變元素盒型別,並且會保留原先所佔的空間。它會相對於包含塊偏移,它的包含塊分為兩種,第一種和絕對定位一樣;第二種是最近的滾動祖先,即overflow屬性是hidden、scroll、auto或overlay時。接下來用一個例子來介紹粘滯定位的用法,如下程式碼所示。
<style> div { overflow: auto; } span { position: sticky; top: 10px; left: 20px; width: 70px; height: 50px; background: #CCC; } </style> <div> 改變粘滯定位的位置,改變 <span>粘滯定位的位置</span> ,改變粘滯定位的位置,改變粘滯定位的位置, 改變粘滯定位的位置,改變粘滯定位的位置, 改變粘滯定位的位置。 </div>
span元素的包含塊是div元素,下圖描繪了頁面滾動時,粘滯定位的效果。在中間圖中可以看到偏移後的span元素所佔的空間被保留了,在右邊圖中可以看到span元素粘滯在指定的偏移位置。
二、邊框影象
CSS3新增了一組屬性,允許在邊框中載入影象,接下來會逐個講解。
第一個是border-image-source屬性,它能指定影象來源,如下所示。在下圖中,會發現載入的影象位於div元素的四個角,而不是沿著邊框繪製。
div { border: 40px solid; border-image-source: url(./star.png); }
注意,邊框寬度需要指定,並且其外觀不能是none,否則將無法顯示。
第二個是border-image-slice屬性,它包含四條裁剪線,可接收四個偏移值,分別距影象的上右下左四個邊,下圖演示了偏移33%時的裁剪線。
執行下面的樣式(效果如下圖所示),在將circle.png分解成9塊後,編號為1、2、3、4的四個圓位於div元素的四個角,而編號為5、6、7、8的四個圓則會被拉伸。
div { border-image-source: url(./circle.png); border-image-slice: 33%; }
border-image-slice屬性還能接收一個fill關鍵字(如下圖所示),可將編號為9的圓作為div元素的背景圖。
div { border-image-slice: 33% fill; }
第三個是border-image-repeat屬性,它能指定填充邊框的方式,預設是拉伸,現在改成平鋪(如下圖所示),邊界處的影象可能會被裁剪。
div { border-image-repeat: repeat; }
第四個是border-image-width屬性,與border-image-slice屬性類似,也有4條裁剪線,只是它裁剪的物件是邊框。在下圖中,左邊是未定義border-image-width屬性的div元素,右邊是將該屬性設為20px後的效果。
div { border-image-width: 20px; }
第五個是border-image-outset屬性,可宣告影象超出邊框的距離,即向外偏移。在下圖中,左邊是未定義border-image-outset屬性的div元素,右邊是將該屬性設為10px後的效果。
div { border-image-outset: 10px; }
第六個是border-image屬性,可將上述5個屬性整合到一起,規定不同的值之間用斜槓(/)分隔,並且還指定了順序:首先是border-image-slice,然後是border-image-width,最後是border-image-outset。而border-image-source和border-image-repeat兩個屬性可放在任意位置,但要注意,不能放置在其它屬性值之中。下面是個整合示例,效果如下圖所示。
div { border-image: url(./circle.png) 33% / 20px / 10px repeat; }
三、字元間距
letter-spacing屬性可定義字元之間的距離,可以突出某段文字,例如為p元素定義10px的字元間距,如下圖所示。
<style> p { letter-spacing: 10px; } </style> <p>字元間距是10px</p>
四、文字陰影
text-shadow屬性可為文字新增陰影,適用於標題或短文字。陰影值由四部分組成,分別是顏色、橫向偏移、縱向偏移和模糊半徑。下面的示例為一段文字添加了灰色的陰影,效果如下圖所示。
<style> p { text-shadow: #CCC 5px 10px 2px; } </style> <p>My name is Strick.</p>
注意,模糊半徑越大,陰影就越模糊。妥善利用好text-shadow屬性,還能創造出3D效果,下面的樣式來源於網路,字型放大後,3D更明顯,效果如下圖所示。
p { font-size: 48px; text-shadow: 0 1px 1px #BBB, 0 2px 0 #999, 0 3px 0 #888, 0 4px 0 #777, 0 5px 0 #666, 0 6px 0 #555, 0 7px 0 #444, 0 8px 0 #333, 0 9px 7px #302314; }
五、多重背景
CSS3支援多重背景,大部分背景屬性都能通過逗號分隔多個值,包括簡寫的background屬性也能接受多個值。在下面的示例中,為div元素聲明瞭兩個背景,先宣告的star.png將會在lake.png之上,如下圖所示。
div { background-image: url(./star.png), url(./lake.png); background-position: left bottom, center; background-repeat: repeat-x, no-repeat; } /* 等價於 */ div { background: url(./star.png) left bottom repeat-x, url(./lake.png) center no-repeat; }
注意,不能為background-color指定多個值。當用background屬性宣告多個背景時,顏色只能出現在最後一個背景層中,如下程式碼所示。
/* 錯誤 */ div { background: #FC0 url(./star.png) left bottom repeat-x, url(./lake.png) center no-repeat; } /* 正確 */ div { background: url(./star.png) left bottom repeat-x, #FC0 url(./lake.png) center no-repeat; }
六、矩陣函式
在CSS中,矩陣函式是變形的基礎,位移、縮放、傾斜和旋轉四種變形都能用矩陣來實現,例如用矩陣函式來描述水平偏移10px,垂直偏移5px,程式碼如下所示。
.matrix { transform: matrix(1, 0, 0, 1, 10, 5); /* 等同於 */ transform: translate(10px, 5px); }
現在將矩陣函式的6個引數用小寫字母來命名,如下所示,
transform: matrix(a, b, c, d, e, f);
對應的矩陣如下所示,注意觀察6個引數的位置。
矩陣函式的原理是通過變更元素的所有座標,重新定位元素,從而實現各種變形。下面是矩陣的計算公式,其中x和y是元素的橫座標和縱座標。
ax+cy+e是變形後的橫座標,bx+dy+f是變形後的縱座標。具體的計算過程如下所示,以矩陣的第一行為例,相同底色的變數會相乘,得到的積再相加。
在下圖中,列出了與四類變形函式等效的矩陣符號(引用自《The CSS3 matrix() Transform for the Mathematically Challenged》一文),其中旋轉和傾斜還用到了三角函式。
在三維空間,也有一個對應的矩陣函式:matrix3d(),此處不再展開敘述,可以檢視網上的相關資料。
七、三維變形
在三維空間中有三個軸,如下圖所示,其中Z軸表示使用者與平面的距離(即透視值)。
perspective()是一個透視函式,它能接收一個非零正數透視值。在下面的示例中,會讓四個元素圍繞Y軸旋轉30°,除了第一個元素,其它都呼叫了透視函式。通過下圖的效果可知,當透視值越小時,變形效果越失真。
.rotate { transform: rotateY(30deg); } .perspective-200 { transform: perspective(200px) rotateY(30deg); } .perspective-600 { transform: perspective(600px) rotateY(30deg); } .perspective-1200 { transform: perspective(1200px) rotateY(30deg); }
注意,透視函式需要宣告在變形函式列表的首位,以免在透視前變形,呈現錯誤的效果。
除了perspective()函式之外,CSS3還提供了一個perspective屬性。前者只能為目標元素宣告透視,而後者宣告的透視能應用於其子元素。舉個簡單的例子,為父元素section宣告perspective屬性,子元素仍舊圍繞Y軸旋轉30°,程式碼如下所示,得到的效果如下圖所示。
<style> .perspective { perspective: 200px; } .perspective > div { transform: rotateY(30deg); } </style> <section class="perspective"> <div>200px</div> <div>200px</div> </section>
perspective-origin屬性可修改透視原點,也叫消失點,其取值與transform-origin類似。預設情況下,這個點位於元素的中心,接下來修改上例父元素的透視原點,樣式如下,效果如下圖所示。
.perspective { perspective-origin: top left; }
backface-visibility屬性可控制元素背面朝向使用者時是否渲染,利用該屬性可設計出3D翻轉的特效。接下來會一步步的實現該功能,首先是建立HTML結構,如下所示,section是兩個div的父元素。
<section class="flip"> <div class="positive">正面</div> <div class="reverse">反面</div> </section>
然後在父元素中新增過渡時間和透視,並將transform-style屬性設為preserve-3d,這樣才能讓子元素和父元素處於同一個三維空間,樣式如下。
.flip { position: relative; width: 100px; height: 100px; transition: 0.6s; transform-style: preserve-3d; perspective: 1000px; }
再將兩個子元素的backface-visibility屬性設為hidden,並且將第二個div元素圍繞Y軸旋轉180°,樣式如下。
.flip > div { position: absolute; left: 0; top: 0; width: 100%; height: 100%; backface-visibility: hidden; } .flip .positive { background: #FC0; } .flip .reverse { background: #F60; transform: rotateY(180deg); }
最後為父元素定義:hover偽類,也就是在滑鼠懸停時,自身也圍繞Y軸旋轉180°,隱藏第一個div元素,顯示第二個div元素,樣式如下。
.flip:hover { transform: rotateY(180deg); }
由於是動態的效果,因此需要用多張圖來描繪翻轉的過程,如下圖所示。