CSS3繪制不規(guī)則圖形的一些方法示例

前言
CSS 創(chuàng)建復(fù)雜圖形的技術(shù)即將會(huì)被廣泛支持,并且應(yīng)用到實(shí)際項(xiàng)目中。本篇文章的目的是為大家開啟它的冰山一角。我希望這篇文章能讓你對(duì)不規(guī)則圖形有一個(gè)初步的了解。
現(xiàn)在,我們已經(jīng)可以使用CSS 3 常見不規(guī)則復(fù)雜圖形了,如下圖所示:
使用CSS創(chuàng)建的圖形,無(wú)法內(nèi)置文字或?qū)崿F(xiàn)文字環(huán)繞效果。因此,如何實(shí)現(xiàn)不規(guī)則圖形和文字復(fù)雜布局也成為了一個(gè)熱議話題。
今天我們就來(lái)介紹一下如何實(shí)現(xiàn)這個(gè)效果。文章中我們將闡述如何使用 CSS創(chuàng)建不規(guī)則圖形,實(shí)現(xiàn)不規(guī)則的文本布局。學(xué)會(huì)如何創(chuàng)建不規(guī)則圖形之后,你就可以發(fā)揮想象力,創(chuàng)建唯美的CSS頁(yè)面了,下圖既是使用該技術(shù)創(chuàng)建的《愛麗絲夢(mèng)游仙境》效果圖:
注:這是CSS的最新技術(shù),所以對(duì)瀏覽器版本要求較高。如果需要查看在線示例你需要確保瀏覽器支持這個(gè)CSS技術(shù)。在本文中我也將提供一些效果截圖查看效果。
聲明圖形
我們需要使用shape-outside 屬性聲明不規(guī)則圖形。當(dāng)前, shape-outside 屬性只能被應(yīng)用于浮動(dòng)元素,并且只能應(yīng)用于塊級(jí)元素。如果需要在非塊級(jí)元素上使用這些屬性,必須先把元素聲明為塊級(jí)。
Shape-* 值有三種賦值方式: 自動(dòng),基本圖形或者圖片鏈接。如果被設(shè)置為自動(dòng),浮動(dòng)元素將繼續(xù)作為傳統(tǒng)的盒模型進(jìn)行渲染。如果你還不熟悉盒模型,請(qǐng)參考CSS盒模型,這是閱讀本篇文章的基礎(chǔ)。
繪制方法包括:rectangle、inset-rectangle、circle、ellipse或polygon方法等。你可以通過鏈接查看詳細(xì)的描述。
如果屬性被設(shè)置為圖片鏈接, 瀏覽器會(huì)按照?qǐng)D片的“alpha通道”來(lái)繪制圖形形狀。
在元素上創(chuàng)建坐標(biāo)系
聲明了CSS 圖形之后,我們首先需要?jiǎng)?chuàng)建將用于繪制圖形的坐標(biāo)系。
坐標(biāo)系是非常必要的,因?yàn)閳D形需要依據(jù)此坐標(biāo)系上的點(diǎn)陣進(jìn)行繪制。shape-* 屬性是基于盒模型的,為了使它啟作用,需要明確指定盒子的大小,限制不規(guī)則圖形在盒子范圍內(nèi),它也將被用于創(chuàng)建繪制坐標(biāo)系,坐標(biāo)系的起點(diǎn)位于形盒子左上角。如果沒有明確寬和高聲明, shape-* 屬性將不啟作用。
設(shè)置自定義圖形的背景色
應(yīng)用了自定義圖形,它的盒模型仍然存在,其它傳統(tǒng)的樣式設(shè)置將作用于盒模型范圍。例如,下面這個(gè)例子中,
我們僅僅想創(chuàng)建一個(gè)浮動(dòng)圓形,并設(shè)置這個(gè)圓形的背景色。按照正常的思路理解,效果應(yīng)該是這樣的:
但是當(dāng)設(shè)置了盒子的背景色后,你會(huì)發(fā)現(xiàn)和預(yù)期的效果不同,效果如下:
在上圖中我們看到背景色被應(yīng)用到盒模型范圍,而不是我們預(yù)想的圓形內(nèi)。
那么,我們應(yīng)該怎樣設(shè)置圓形的背景色呢?這就引出了一個(gè)新的CSS樣式: clip-path 。clip-path 用于限制當(dāng)前樣式的作用范圍。在下面的例子中你將看到它的使用方法。
提醒
現(xiàn)在,shape-outside 屬性只作用域浮動(dòng)的元素,并且僅限制于在塊級(jí)元素上應(yīng)用。使用這些屬性定義的元素,其周圍的文本將依賴于圖形形狀排布。未來(lái)的CSS 形狀將不僅僅限制與應(yīng)用于浮動(dòng)元素上,我們將不僅僅可以在文本外部的圖形上做文章,完全可以在其內(nèi)部定義自定義圖形,實(shí)現(xiàn)如下效果:
實(shí)例-使用shape-outside 創(chuàng)建環(huán)繞于自定義形狀的浮動(dòng)文本
我們從一個(gè)簡(jiǎn)單的例子開始。在實(shí)例中我們將創(chuàng)建一個(gè)自定義圖形,并且內(nèi)置文本流,最終效果圖如下(文章末尾提供實(shí)例下載鏈接):
例子中我們擁有兩個(gè)容器,用于設(shè)置自定義形狀和嵌套文本內(nèi)容。代碼如下:
- <div class="container">
- <div class="shaped"></div>
- <div class="content">
- <h1><span>La</span> Tour <br/>Eiffel</h1>
- <p>Lorem Ipsum.....</p>
- </div>
- </div>
首先我們需要聲明浮動(dòng)區(qū)域的DIV節(jié)點(diǎn),并且使用固定值設(shè)置大小。代碼如下:
- .container{
- overflow:hidden;
- height: 100vh;
- width: 100vw;
- }
- .shaped{
- float:left;
- height:100vh;
- width:40vw;
- float:rightright;
- background: black url(../images/eiffel.jpg) center top no-repeat;
- background-size:cover;
- }
現(xiàn)在坐標(biāo)系已經(jīng)創(chuàng)建成功,接下來(lái)我們將要繪制圖形了。可以通過兩種方式來(lái)繪制圖形:
使用polygon()
我們可以使用polygon() 方法來(lái)計(jì)算圖形范圍。這個(gè)方法從坐標(biāo)系中獲取多個(gè)點(diǎn)用于繪制圖形,每個(gè)點(diǎn)由(x, y)值定位。 例子中我們將要?jiǎng)?chuàng)建一個(gè)非常簡(jiǎn)單的多邊形,如下圖所示:
坐標(biāo)點(diǎn)的單位可以是固定值,或者百分比。在這個(gè)例子中我們將以百分比的形式設(shè)置點(diǎn)陣位置。接下來(lái)我們需要應(yīng)用這個(gè)樣式在浮動(dòng)元素上。
- .shaped{
- /*…*/
- shape-outside: polygon(0 0, 100% 0, 100% 100%,30% 100%);
- shape-margin: 20px;
- }
應(yīng)用以上的樣式后,一個(gè)不規(guī)則的圖形-梯形產(chǎn)生了。
可以看到代碼中使用了shape-margin 屬性,它用于設(shè)置圖形和文本內(nèi)容之間的邊距。
接下來(lái)需要添加背景圖,需要注意在添加背景圖之后,它將被應(yīng)用于盒模型,目前為止效果如下:
所以,為了達(dá)到預(yù)期效果,我們需要設(shè)置clip-path 屬性,并且設(shè)置其范圍和shape-outside 屬性相同。
- .shaped{
- /*…*/
- clip-path: polygon(0 0, 100% 0, 100% 100%,30% 100%);
- }
現(xiàn)在,我們就通過polygon() 方法實(shí)現(xiàn)了目標(biāo)效果。
使用圖片鏈接
我們也可以通過圖片(嚴(yán)格說(shuō)是擁有通明區(qū)域的圖片)來(lái)創(chuàng)建不規(guī)則圖形,依據(jù)圖片的“alpha通道” 生成不規(guī)則圖形。
例如,替代polygon() 聲明方法。我們可以設(shè)置shape-outside 屬性值為圖片URI,瀏覽器就會(huì)自動(dòng)依據(jù)圖片來(lái)繪制不規(guī)則圖形。
圖片中的透明部分將被聲明為文本元素的浮動(dòng)部分。其余部分被聲明為不規(guī)則圖形。代碼如下:
- .shaped{
- /*…*/
- shape-outside: url(/images/mm.png);
- shape-image-threshold: 0.5;這個(gè)屬性用于設(shè)置浮動(dòng)區(qū)域透明度范圍
- }
上述的兩種方法都擁有各自的優(yōu)缺點(diǎn)。例如,如果圖形過于復(fù)雜,通過圖片方法比手動(dòng)計(jì)算圖形繪制節(jié)點(diǎn)更方便。
相關(guān)文章
- 這是一款采用純css3繪制的小黃人頭像動(dòng)畫特效源碼,畫面中的小黃人手腳、眼睛、嘴以及頭發(fā)都可呈現(xiàn)運(yùn)動(dòng)效果。該特效完全采用純css3技術(shù)實(shí)現(xiàn),沒有引入外部圖片資源2016-04-06
- 這是一款采用純css3繪制的QQ企鵝動(dòng)畫特效源碼,畫面上的企鵝可呈現(xiàn)出雙手上下擺動(dòng)的效果,該特效采用純css3技術(shù)繪制,沒有引入任何外部圖片2016-04-02
純css3繪制的精美購(gòu)物優(yōu)惠券樣式效果源碼
這是一款采用純css3繪制的精美購(gòu)物優(yōu)惠券樣式效果源碼,完全采用css3的徑向漸變功能實(shí)現(xiàn)的優(yōu)惠券圖片效果,沒有使用任何外部圖片2016-04-01純css3繪制的哆啦a夢(mèng)機(jī)器貓頭像效果源碼
這是一款基于純css3繪制的哆啦a夢(mèng)機(jī)器貓頭像效果源碼,沒有采用任何圖片即可繪制出機(jī)器貓的頭像效果2016-03-17- 這篇文章主要教大家如何利用HTML5 CSS3繪制出鋸齒狀的矩形,繪制圖形時(shí)可以用canvas標(biāo)簽,感興趣的小伙伴們可以參考一下2016-03-01
- 這篇文章主要介紹了使用CSS3繪制基本卡通圖案的示例分享,不過必須承認(rèn),這樣做的代碼量并不是很少...well,需要的朋友可以參考下2015-11-06
- 這篇文章主要介紹了CSS3繪制圓角矩形的簡(jiǎn)單示例,注意一下各瀏覽器對(duì)CSS3的兼容性,需要的朋友可以參考下2015-09-28
- 這篇文章主要介紹了使用CSS3來(lái)繪制一個(gè)月食圖案,其中用到了不少CSS3中基本的繪圖方法,是一個(gè)良好的學(xué)習(xí)示例,需要的朋友可以參考下2015-07-18
- 這篇文章主要介紹了用CSS3繪制三角形的簡(jiǎn)單方法,是CSS前端繪圖的基礎(chǔ),需要的朋友可以參考下2015-07-17
- 這篇文章主要為大家詳細(xì)介紹了純CSS3繪制打火機(jī)動(dòng)畫火焰效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-18