CSS繪制三角形—border法

1. 實(shí)現(xiàn)一個(gè)簡單的三角形

使用CSS盒模型中的border(邊框)即可實(shí)現(xiàn)如下所示的三角形:

CSS實(shí)現(xiàn)簡單三角形

實(shí)現(xiàn)原理:

首先來看在為元素添加border時(shí)秉扑,border的樣子;假設(shè)有如下代碼:

<div></div>

div {
    width: 50px;
    height: 50px;
    border: 2px solid orange;
}

效果圖:

border的一般使用

這是我們平常使用border最普遍的情況——往往只給border一個(gè)較小的寬度(通常為1-2px)调限;然而這樣的日常用法就會(huì)容易讓大家對(duì)border的形成方式產(chǎn)生誤解舟陆,即認(rèn)為元素的border是由四個(gè)矩形邊框拼接而成。

然而事實(shí)并不是這樣耻矮。實(shí)際上秦躯,元素的border是由三角形組合而成,為了說明這個(gè)問題裆装,我們可以增大border的寬度踱承,并為各border邊設(shè)置不同的顏色:

div {
    width: 50px;
    height: 50px;
    border: 40px solid;
    border-color: orange blue red green;
}

效果圖:

border的形成方式

既然如此,那么更進(jìn)一步哨免,把元素的內(nèi)容尺寸設(shè)置為0會(huì)發(fā)生什么情況呢茎活?

div {
    width: 0;
    height: 0;
    border: 40px solid;
    border-color: orange blue red green;
}

效果圖:

元素內(nèi)容尺寸為0

我們將驚奇地發(fā)現(xiàn),此時(shí)元素由上下左右4個(gè)三角形“拼接”而成琢唾;那么载荔,為了實(shí)現(xiàn)最終的效果,即保留最下方的三角形采桃,還應(yīng)該怎么做懒熙?很簡單丘损,我們只需要把其它border邊的顏色設(shè)置為白色透明色

div {
    width: 0;
    height: 0;
    border: 40px solid;
    border-color: transparent transparent red;
}
最終效果

Duang~ 最終的簡單三角形就繪制出來了。同理工扎,如果想要得到其它邊上的三角形徘钥,只需要將剩余的border邊顏色設(shè)置為白色或透明色即可。

不過定庵,被“隱藏”的上border仍然占據(jù)著空間吏饿,要想使得繪制出的三角形尺寸最小化,還需要將上border的寬度設(shè)置為0(其它情況同理):

div {
    width: 0;
    height: 0;
    border-width: 0 40px 40px;
    border-style: solid;
    border-color: transparent transparent red;
}

2. 實(shí)現(xiàn)帶邊框的三角形

帶邊框的三角形是指為三角形添加其它顏色的邊框蔬浙,如同為元素添加border一樣:

帶邊框的三角形

由于不能繼續(xù)通過為已有三角形設(shè)置border的方法來為其設(shè)置邊框(因?yàn)槿切伪旧砭褪抢胋order實(shí)現(xiàn)的)猪落,所以只好另想辦法。而能想到的一個(gè)最自然的方法就是三角形疊放畴博,即把當(dāng)前三角形疊放在更大的三角形上方笨忌,上圖所示的實(shí)現(xiàn)方法就是把黃色三角形放在了尺寸更大的藍(lán)色三角形上。

為了實(shí)現(xiàn)這樣的效果俱病,需要利用絕對(duì)定位方法:
首先定義出外面的藍(lán)色三角形:

<div id="blue"><div>

#blue {
    position:relative;
    width: 0;
    height: 0;
    border-width: 0 40px 40px;
    border-style: solid;
    border-color: transparent transparent blue;
}

效果為:

外圍藍(lán)色三角形

隨后需要定義黃色三角形官疲,由于黃色三角形的定位需要參考藍(lán)色三角形的位置,所以需要用到絕對(duì)定位方法亮隙。為此還需要將黃色三角形作為藍(lán)色三角形的子元素途凫。一個(gè)可行的辦法是在藍(lán)色三角形內(nèi)部定義一個(gè)額外的標(biāo)簽以表示黃色三角形,但為了節(jié)約標(biāo)簽起見溢吻,更好的辦法是使用偽元素:

#blue:after {
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    top: 0px;
    left: 0px;
    border-width: 0 40px 40px;
    border-style: solid;
    border-color: transparent transparent yellow;
}

得到的效果為:

定義黃色三角形

需要特別注意此時(shí)定義出的黃色三角形與藍(lán)色三角形之間位置的偏移關(guān)系维费,該偏移將受到topleft(本例中)以及黃色三角形本身border寬度的共同影響促王。

可能會(huì)有這樣的疑問:為什么黃色三角形會(huì)向左偏移一段距離呢犀盟,按道理不應(yīng)該完全重合在藍(lán)色三角形上嗎,就像下面這樣蝇狼?

黃色三角形與藍(lán)色三角形完全重合

如果有這樣的疑問阅畴,說明還沒有對(duì)絕對(duì)定位產(chǎn)生足夠的認(rèn)識(shí)。絕對(duì)定位的區(qū)域是基于絕對(duì)定位父元素的padding區(qū)域迅耘,然后在此基礎(chǔ)上運(yùn)用top贱枣、leftright豹障、bottom等一系列屬性來約束絕對(duì)定位子元素的位置冯事。在本例中,由于藍(lán)色三角形作為絕對(duì)定位父元素血公,其內(nèi)容的尺寸為0昵仅,則內(nèi)容區(qū)域就是該三角形的上頂點(diǎn):

絕對(duì)定位區(qū)域

對(duì)于黃色三角形,由于設(shè)置了left: 0top: 0,所以黃色三角形的所有內(nèi)容(包括border摔笤、margin)將根據(jù)藍(lán)色三角形的上頂點(diǎn)進(jìn)行定位够滑。可以把此時(shí)left: 0top: 0分別看作是兩面“隔墻”——即上隔墻和左隔墻吕世,黃色三角形的所有內(nèi)容只能在上隔墻的下方和左隔墻的右方區(qū)域彰触。

由于黃色三角形的內(nèi)容區(qū)域也位于其頂點(diǎn)處,且對(duì)其設(shè)置了左右各40px的border命辖,所以黃色三角形的內(nèi)容區(qū)域?qū)⑾蛴移?0px况毅,從而形成了之前的效果。

想想看將黃色三角形的位置設(shè)置為left: 0bottom: 0,會(huì)得到怎樣的定位效果尔艇?(下圖所示)

黃色三角形設(shè)置為left: 0和bottom: 0

搞懂了絕對(duì)定位后尔许,只需要在原代碼上稍作修改就可以將黃色三角形的頂點(diǎn)與藍(lán)色三角形頂點(diǎn)相重合,同時(shí)還應(yīng)該適當(dāng)縮小黃色三角形的尺寸(按相似三角形等比例縮兄胀蕖):

#blue:after {
    content: "";
    position: absolute;
    top: 0px;
    left: -38px;
    border-width: 0 38px 38px;
    border-style: solid;
    border-color: transparent transparent yellow;
}

得到:

黃色三角形與藍(lán)色三角形頂點(diǎn)重合

在上面的代碼中味廊,特意刪除了之前對(duì)width: 0height: 0的設(shè)置,因?yàn)樽釉鼐哂?code>position:absolute設(shè)置棠耕,這會(huì)使得元素尺寸在不顯式設(shè)置寬度和高度的情況下余佛,收縮到元素內(nèi)容的尺寸,由于內(nèi)容設(shè)置的是content: ""窍荧,所以子元素的尺寸默認(rèn)也就是0了辉巡。故設(shè)置width: 0height: 0就變得多余了。

最后一步就是利用top將黃色三角形向下移動(dòng)至合適的位置:

#blue:after {
    content: "";
    position: absolute;
    top: 1px;
    left: -38px;
    border-width: 0 38px 38px;
    border-style: solid;
    border-color: transparent transparent yellow;
}

得到最終效果:

最終效果

學(xué)會(huì)了帶邊框三角形的繪制蕊退,那么實(shí)現(xiàn)類似如下三角形箭頭自然也是不在話下了:

三角形箭頭

實(shí)現(xiàn)代碼:

#blue:after {
    content: "";
    position: absolute;
    top: 2px;
    left: -38px;
    border-width: 0 38px 38px;
    border-style: solid;
    border-color: transparent transparent #fff;
}

3. 繪制其它角度的三角形

繪制其它角度的三角形红氯,如:

右直角三角

或者:

左直角三角

就更簡單了,其實(shí)它們都是基于之前繪制的三角形而來的咕痛。如果想繪制右直角三角,則將左border設(shè)置為0喇嘱;如果想繪制左直角三角茉贡,將右border設(shè)置為0即可(其它情況同理)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末者铜,一起剝皮案震驚了整個(gè)濱河市腔丧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌作烟,老刑警劉巖愉粤,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拿撩,居然都是意外死亡衣厘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來影暴,“玉大人错邦,你說我怎么就攤上這事⌒椭妫” “怎么了撬呢?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妆兑。 經(jīng)常有香客問我魂拦,道長,這世上最難降的妖魔是什么搁嗓? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任芯勘,我火速辦了婚禮,結(jié)果婚禮上谱姓,老公的妹妹穿的比我還像新娘借尿。我一直安慰自己,他們只是感情好屉来,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布路翻。 她就那樣靜靜地躺著,像睡著了一般茄靠。 火紅的嫁衣襯著肌膚如雪茂契。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天慨绳,我揣著相機(jī)與錄音掉冶,去河邊找鬼。 笑死脐雪,一個(gè)胖子當(dāng)著我的面吹牛厌小,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播战秋,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼璧亚,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了脂信?” 一聲冷哼從身側(cè)響起癣蟋,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狰闪,沒想到半個(gè)月后疯搅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埋泵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年幔欧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琐馆,死狀恐怖规阀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘦麸,我是刑警寧澤谁撼,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站滋饲,受9級(jí)特大地震影響厉碟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屠缭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一箍鼓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呵曹,春花似錦款咖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跨新,卻和暖如春富腊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背域帐。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工赘被, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肖揣。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓民假,卻偏偏與公主長得像,于是被迫代替她去往敵國和親龙优。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阳欲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、CSS入門 1陋率、css選擇器 選擇器的作用是“用于確定(選定)要進(jìn)行樣式設(shè)定的標(biāo)簽(元素)”。 有若干種形式的...
    寵辱不驚丶?xì)q月靜好閱讀 1,584評(píng)論 0 6
  • 學(xué)會(huì)使用CSS選擇器熟記CSS樣式和外觀屬性熟練掌握CSS各種選擇器熟練掌握CSS各種選擇器熟練掌握CSS三種顯示...
    七彩小鹿閱讀 6,305評(píng)論 2 66
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5秽晚? 答:HTML5是最新的HTML標(biāo)準(zhǔn)瓦糟。 注意:講述HT...
    kismetajun閱讀 27,422評(píng)論 1 45
  • 各種純css圖標(biāo) CSS3可以實(shí)現(xiàn)很多漂亮的圖形,我收集了32種圖形赴蝇,在下面列出菩浙。直接用CSS3畫出這些圖形,要比...
    劍殘閱讀 9,474評(píng)論 0 8
  • 一直播的調(diào)調(diào)逐漸適應(yīng)陆淀,面對(duì)鏡頭,基本能輕松自如先嬉,互動(dòng)聊天轧苫,好不快樂∫呗回看后還有幾點(diǎn)問題含懊,列舉如下: ...
    牛歡Vincent閱讀 252評(píng)論 0 0