CSS3 畫形狀

在制作頁面時,常用CSS畫各種形狀帶代替img擒权,這樣可以免去一次HTTP請求袱巨。而且有些基本形狀用CSS實現(xiàn)比切圖更方便和靈活。本篇就介紹一下常用形狀的畫法碳抄。

  • 圓形
  • 橢圓(半橢圓愉老,4分之一橢圓)
  • 三角形
  • 平行四邊形
  • 菱形
  • 梯形

圓形

是最常見最基本的圖型,給寬高相等的div設border-radius: 50%剖效,輕松實現(xiàn):


.circle {
    width: 5em;
    height: 5em;
    background: #fb3;
    border-radius: 50%;
}

<div class="circle"></div>

橢圓

參照border-radius一文俺夕,給寬高不等的div設border-radius: 50%來實現(xiàn):

.ellipse {
    width: 5em;
    height: 2.5em;
    background: #fb3;
    border-radius: 50%;
}

<div class="ellipse"></div>

半橢圓的關鍵是給四個角指定不同的border-radius半徑:


.half-ellipse1 {
    width: 5em;
    height: 1.25em;
    background: #fb3;
    border-radius: 50% / 100% 100% 0 0;
}
.half-ellipse2 {
    width: 5em;
    height: 1.25em;
    background: #fb3;
    border-radius: 50% / 0 0 100% 100%;
}
.half-ellipse3 {
    width: 2.5em;
    height: 2.5em;
    background: #fb3;
    border-radius: 100% 0 0 100% / 50%;
}
.half-ellipse4 {
    width: 2.5em;
    height: 2.5em;
    background: #fb3;
    border-radius: 0 100% 100% 0 / 50%;
}

<div class="half-ellipse1"></div>
<div class="half-ellipse2"></div>
<div class="half-ellipse3"></div>
<div class="half-ellipse4"></div>

以左圖上半橢圓為例,左上角和右上角的半徑值應該是相同的贱鄙,左下角和右下角的半徑值同樣也應該是相同的劝贸。

先看水平方向。因為左上角和右上角沒有直邊逗宁,這意味著它倆的半徑之和要等于整個div的寬度映九,所以左上角和右上角的水平半徑應該均為50%。

再看垂直方向瞎颗。因為左上角和右上角的圓角占據了整個元素的高度件甥,底部完全沒有任何圓角。所以垂直半徑應該設成100% 100% 0 0

最終應該border-radius: 50% 50% 0 0 / 100% 100% 0 0;哼拔。但由于左下角和右下角的垂直半徑為0引有,所以它倆的水平半徑設成什么都沒有影響。因此可以簡化成border-radius: 50% / 100% 100% 0 0;

下半橢圓和左右半橢圓的思路都是一樣的倦逐,自己看看代碼應該能推理出來譬正。

4分之一橢圓的關鍵是其中一個角的水平和垂直半徑都要為100%,其他三個角無圓角:


.quarter-ellipse {
    width: 5em;
    height: 2.5em;
    background: #fb3;
}
.quarter-ellipse1 {
    border-radius: 100% 0 0 0;
}
.quarter-ellipse2 {
    border-radius: 0 100% 0 0;
}
.quarter-ellipse3 {
    border-radius: 0 0 100% 0;
}
.quarter-ellipse4 {
    border-radius: 0 0 0 100%;
}

<div class="quarter-ellipse quarter-ellipse1"></div>
<div class="quarter-ellipse quarter-ellipse2"></div>
<div class="quarter-ellipse quarter-ellipse3"></div>
<div class="quarter-ellipse quarter-ellipse4"></div>

畫這些半橢圓啊檬姥,4分之一橢圓啊曾我,有什么用?例如點這里

三角形

用一邊border有顏色健民,另三邊border透明來實現(xiàn):


.triangle1 {
    width: 0;
    border: 2em solid transparent;
    border-top: 2em solid #fb3;
}
.triangle2 {
    width: 0;
    border: 2em solid transparent;
    border-right: 2em solid #fb3;
}
.triangle3 {
    width: 0;
    border: 2em solid transparent;
    border-bottom: 2em solid #fb3;
}
.triangle4 {
    width: 0;
    border: 2em solid transparent;
    border-left: 2em solid #fb3;
}

<div class="triangle1"></div>
<div class="triangle2"></div>
<div class="triangle3"></div>
<div class="triangle4"></div>

最左圖只是示意抒巢,當div寬高為0時(無內容時高度自動為0不用設),border就是4個三角形秉犹。之后你需要什么方向的三角形蛉谜,只要將該方向的border顯示出來就行了稚晚。不用div用偽元素也是可以實現(xiàn)的,原理是一樣的型诚。三角形的應用場景也很多客燕,例如聊天窗口處的小三角箭頭:


平行四邊形

transform的skew傾斜來實現(xiàn):

.parallelogram {
    display: inline-block;
    padding: .5em 1em;
    background-color: #0fa5d9;
    color: white;
    transform: skewX(-45deg);
}

<div class="parallelogram">HMTL</div>

但如圖所示,skew傾斜后俺驶,內部文字也傾斜了幸逆。如果想內部文字不傾斜棍辕,需要在div里額外加一層標簽暮现,再將該標簽負相同角度skew回來:


.parallelogram2 {
    display: inline-block;
    padding: .5em 1em; 
    background-color: #0fa5d9;
    color: white;
    transform: skewX(-45deg);
}
/* 負相同角度將文字傾斜回來 */
.parallelogram2 > div { transform: skewX(45deg); }

<div class="parallelogram2">HMTL</div>

如果不想多一層標簽,也可以用偽元素楚昭,效果是一樣的:

.parallelogram3 {
    position: relative;
    display: inline-block;
    padding: .5em 1em; 
    color: white;
}
.parallelogram3::before {
    content: '';
    position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
    z-index: -1;
    background-color: #0fa5d9;
    transform: skew(-45deg);
}

<div class="parallelogram3">HMTL</div>

其實對其他任何變形式樣栖袋,如果只想變形元素,但不想變形它的內容時就可以用該技巧抚太。例如對正方形rotate一下就能得到菱形塘幅。

菱形

如果是背景的話直接給正方形用rotate就能得到菱形。但如果是圖片的話尿贫,用rotate可能效果不對…


.diamond {
    width: 150px;
    height: 150px;
    transform: rotate(45deg);
    overflow: hidden;
}
.diamond img {
    transform: rotate(-45deg);
}

<div class="diamond"><img src="head.png" /></div>

上例中用了和平行四邊形一樣的思路电媳,內部img用相反的角度rotate回去。但如圖所示庆亡,成了奇怪的八角形匾乓。解決方案是將圖片放大,放大多少呢又谋?根據勾股定理拼缝,正方形的對角線等于邊長乘根號2,約等于1.414彰亥,因此取稍微大一點放大1.42倍:

.diamond img {
    transform: rotate(-45deg) scale(1.42);
}

如果不想多一層div標簽咧七,想直接將img圖片弄成菱形,也可以用clip-path來裁剪任斋。它的好處是簡單優(yōu)雅继阻,可以指定多個剪裁角度,處理非正方形的圖片也毫無壓力废酷,缺點是會有游覽器兼容性問題穴翩,試下來IE全軍覆沒,F(xiàn)irefox也不行锦积,只有Chrome和Oprea支持芒帕。希望解決了兼容性問題后,將來它能大放異彩丰介。


.diamond-clip {
    -webkit-clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
    clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
}

<img class="diamond-clip" src="head.png" />

梯形

一種常見的方法是給長方形的div背蟆,加上::before和::after兩個偽元素鉴分,偽元素參照上面畫出三角形,這樣來拼接成一個梯形带膀。缺點是志珍,偽元素數量有限,就這么兩個垛叨,用完后再有需要用到偽元素的需求就沒法滿足了伦糯。其實可以用3D的rotate來實現(xiàn)。


.trapezoid {
    display: inline-block;
    padding: .5em 1em;
    color: white;
    background: #58a;
    transform: perspective(.5em) rotateX(5deg);
}

<div class="trapezoid">HTML</div>

這個方法簡單方便嗽元,不需要用到偽元素敛纲。但有和平行四邊形一樣的問題,里面的內容文字也3D旋轉了剂癌。想讓內容文字不旋轉需要加一層標簽淤翔,或用偽元素。


.trapezoid2 {
    position: relative;
    display: inline-block;
    padding: .5em 1em;
    color: white;
}
.trapezoid2::before {
    content: '';
    position: absolute;
    z-index: -1;
    top: 0;right: 0;bottom: 0;left: 0;
    background: #58a;
    transform: perspective(.5em) rotateX(5deg);
}

<div class="trapezoid2">HTML</div>

從圖中加上紅色邊框也能看出佩谷,3D旋轉的偽元素背景旁壮,和div自身的底部不貼合。由于transform具有層級關系谐檀,會導致div下面的空間被遮蔽抡谐。因此需要指定transform-origin: bottom;讓它在旋轉時,底邊固定桐猬。


.trapezoid2::before {
    ……
    transform-origin: bottom;
}

這樣底邊雖然貼合了麦撵,但內容文字明顯不居中。要讓內容文字居中也很簡單课幕,可以縮減點padding-bottom厦坛,再用scaleY將背景垂直方向拉大點,具體比例需要自己微調一下


.trapezoid4 {
    ……
    padding: .5em 1em .35em;
    ……
}
.trapezoid4::before {
    ……
    transform: perspective(.5em) rotateX(5deg) scaleY(1.3);
    transform-origin: bottom;
}

這樣將transform-origin改成bottom left或bottom right乍惊,就可以得到左傾斜杜秸,右傾斜的標簽頁。你可以點擊這里

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末润绎,一起剝皮案震驚了整個濱河市撬碟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莉撇,老刑警劉巖呢蛤,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棍郎,居然都是意外死亡其障,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門涂佃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來励翼,“玉大人蜈敢,你說我怎么就攤上這事∑В” “怎么了抓狭?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長造烁。 經常有香客問我否过,道長,這世上最難降的妖魔是什么惭蟋? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任苗桂,我火速辦了婚禮,結果婚禮上敞葛,老公的妹妹穿的比我還像新娘誉察。我一直安慰自己与涡,他們只是感情好惹谐,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驼卖,像睡著了一般氨肌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酌畜,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天怎囚,我揣著相機與錄音,去河邊找鬼桥胞。 笑死恳守,一個胖子當著我的面吹牛,可吹牛的內容都是我干的贩虾。 我是一名探鬼主播催烘,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缎罢!你這毒婦竟也來了伊群?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤策精,失蹤者是張志新(化名)和其女友劉穎舰始,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體咽袜,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡丸卷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了询刹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谜嫉。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡抽莱,死狀恐怖,靈堂內的尸體忽然破棺而出骄恶,到底是詐尸還是另有隱情食铐,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布僧鲁,位于F島的核電站虐呻,受9級特大地震影響,放射性物質發(fā)生泄漏寞秃。R本人自食惡果不足惜席赂,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一坝初、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦否纬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厘线,卻和暖如春识腿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背造壮。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工渡讼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耳璧。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓成箫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旨枯。 傳聞我的和親對象是個殘疾皇子蹬昌,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • 各種純css圖標 CSS3可以實現(xiàn)很多漂亮的圖形,我收集了32種圖形召廷,在下面列出凳厢。直接用CSS3畫出這些圖形,要比...
    劍殘閱讀 9,474評論 0 8
  • 1竞慢、屬性選擇器:id選擇器 # 通過id 來選擇類名選擇器 . 通過類名來選擇屬性選擇器 ...
    Yuann閱讀 1,619評論 0 7
  • CSS3簡介 CSS3的現(xiàn)狀 瀏覽器支持程度差先紫,需要添加 私有前綴 ; 移動端支持優(yōu)于PC端筹煮; 不斷改進中遮精; 應用...
    magic_pill閱讀 779評論 0 1
  • 轉載請聲明 原文鏈接 關注公眾號獲取更多資訊 這篇文章主要總結H5的一些新增的功能以及一些基礎歸納,這里只是一個提...
    程序員poetry閱讀 9,059評論 22 225
  • 徐志摩,是我很喜歡的一位詩人本冲。 他有著富裕的家庭背景准脂,在有著優(yōu)越的家庭條件下不像于當時的富家子弟般浪蕩無為,他...
    萬古生長夜閱讀 483評論 0 0