CSS躬行記(4)——浮動形狀
CSS規範新增了一個模組:CSS Shapes,shape-outside屬性屬於該模組,它能影響浮動元素周邊內容流的形狀(即浮動形狀),可接收三類值:形狀盒子、函式和影象。
一、形狀盒子
形狀盒子(shape box)會指定形狀的邊界,既能單獨使用,也能與另外兩類值組合使用,可選的關鍵字如下所列,其中margin-box是shape-outside屬性的預設值。
(1)margin-box:以外邊距為界。
(2)border-box:以邊框為界。
(3)padding-box:以內邊距為界。
(4)content-box:以內容為界。
下圖演示了四種形狀盒子的效果,外邊距、邊框和內邊距都設為了10px,程式碼中只列出了關鍵樣式,並只舉了其中的一種情況。
<style> .container { overflow: hidden; } div { float: left; padding: 10px; margin: 10px; border: 10px solid #FC0; background: #F60; background-clip: content-box; } .border-box { shape-outside: border-box; } </style> <section class="container"> <div class="border-box">border-box</div> <p>My name is Strick.</p> <p>My name is Strick.</p> <p>My name is Strick.</p> <p>My name is Strick.</p> <p>My name is Strick.</p> </section>
二、函式
有4個形狀函式可供選擇,分別是circle()、ellipse()、inset()以及polygon()。
1)circle()
第一種是圓形,可定義半徑和圓點位置,例如浮動元素的寬高都為100px,圓的半徑為50px,樣式如下所示,效果如下圖所示,其中白色邊框的圓就是計算出的浮動形狀。
div { float: left; width: 100px; height: 100px; shape-outside: circle(50px); }
接下來指定圓點的位置,需要使用at關鍵字將半徑和位置分隔。在下面的樣式中,圓點處在元素的右上角,注意觀察下圖中的浮動形狀,它超出了元素的邊界,超出部分預設會被裁剪掉。
div { shape-outside: circle(50px at right top); }
當用百分數指定半徑時,需要有個參照值,該值得通過下面的公式計算得到,其中width是形狀盒子的寬,height是其高。
假設半徑為10%,浮動元素的上下外邊距為10px,因為預設是以外邊距為界限,所以此處形狀盒子的高度為120px,寬度仍然是100px,那麼通過計算後得到的參照值約等於110px,半徑就是11px,效果如下圖所示。
div { margin: 10px 0; shape-outside: circle(10%); }
2)ellipse()
第二種是橢圓,與圓形類似,也需要定義半徑和圓點位置。只是它需要兩個半徑,第一個是橫軸半徑,第二個是縱軸半徑。在下面的示例中,浮動元素的寬為100px,高為60px,將浮動形狀宣告為橢圓,效果如下圖所示。
div { float: left; width: 100px; height: 60px; shape-outside: ellipse(50px 30px); }
橫軸上的百分數半徑參照形狀盒子的寬度,縱軸上的百分數半徑參照形狀盒子的高度,下面定義的百分數半徑經過計算後得到的值為50px和40px,效果如下圖所示。
div { margin: 10px 0; shape-outside: ellipse(50% 50%); }
3)inset()
第三種是嵌入在形狀盒子中的內部矩形,它能接收一組值,分別表示上右下左向內偏移的距離,還能接收一個可選的圓角,以round關鍵字分隔。
在下面的示例中,雖然只提供了兩個值,但CSS會根據現有的值確定其餘值,內部矩形距離形狀盒子的頂端和底端是20px,左右邊界是10px,形狀盒子的寬為100px,高為80px,效果如下圖所示。
div { float: left; width: 100px; height: 60px; margin: 10px 0; shape-outside: inset(20px 10px); }
下面的樣式為內部矩形添加了20px的圓角,效果如下圖所示。
div { shape-outside: inset(20px 10px round 20px); }
當內部矩形的偏移值是百分數時,左右偏移參照的是形狀盒子的寬,上下偏移參照的是其高。例如引數值為20%,那麼計算出的左右偏移值是20px,上下偏移值是16px,效果如下圖所示。
div { shape-outside: inset(20%); }
4)polygon()
第四種是多邊形,它能接收一系列座標對,相對於形狀盒子的左上角計算,將所有的點連線起來就是最終的形狀。根據下面的polygon()函式中的四組座標可描繪出一個直角梯形,如下圖所示。
div { float: left; width: 100px; height: 80px; shape-outside: polygon(10px 10px, 20px 10px, 40px 50px, 10px 50px); }
當座標是百分數時,橫座標參照形狀盒子的寬,縱座標參照其高,下面定義的座標,效果與上圖一致。
div { shape-outside: polygon(10% 12.5%, 20% 12.5%, 40% 62.5%, 10% 62.5%); }
有一種簡便的方式建立多邊形,那就是使用Chrome的瀏覽器外掛:CSS Shapes Editor,用拖拽滑鼠的方式得到想要的多邊形,再將引數複製到樣式表中,如下圖所示。
三、影象
當形狀很複雜時,直接畫多邊形會非常麻煩,不過shape-outside屬性可基於影象的透明度(alpha值)來繪製形狀,即形狀輪廓會沿著非透明區域的邊緣生成。
例如有一個五角星,如果邊以外的地方都是透明的,那麼周圍的內容就會貼著五角星的邊,如下圖所示。
div { float: left; width: 100px; height: 100px; shape-outside: url(./star.png); }
注意,url()函式中的影象不能直接從本地載入,必須從Web伺服器中讀取,如此引用的影象會有HTTP首部資訊,用於判斷是否跨域。
1)shape-image-threshold
該屬性可指定透明度閾值,修改形狀邊界,其取值範圍是0~1,值越小透明度越高。對於透明度低於該值的部分,會包含在浮動形狀中,而高於的則不包含。
例如將該值設為1時,就表示沒有浮動形狀,即整張影象都不在浮動形狀中,如下圖所示。
div { shape-image-threshold: 1; }
2)shape-margin
該屬性可指定浮動形狀的外邊距。在下面的示例中會新增10px的外邊距,效果如下圖所示。
div { shape-margin: 10px; }
注意,shape-margin屬性的百分數的計算方式與普通的外邊距相同,參照的也是包含塊的寬度。假設div元素的包含塊的寬度為220px,那麼10%的外邊距經過計算後得到的值為22px,效果如下圖所示。
div { shape-margin: 10%; }
&n