【CSS】繪制三角形的三種方法


看到像上圖這樣的 tip 的小三角,你會怎么辦?
切個圖上去?恩,不錯,簡單,兼容性也一級棒,不但好控制,那點小東西也增加不了多少圖片的大小。但有沒有更好更講究技巧的辦法呢?哈哈,那必須有啊,而且還不止一種呢:)
純 CSS 做三角形的方法,目前我知道三種,分別是利用 border 屬性,“◆”字符,和 CSS3 transfrom 做 45 度旋轉實現的。

1、利用 border 屬性實現三角形
這個原理很簡單,我我們先看下面的圖,這是一個邊框為 20px 的 div,看他的邊框,是個梯形,變化會從這里開始。

.triangle{ 
    width:30px; 
    height:30px; 
    border-width:20px; 
    border-style:solid; border-color:#e66161 #f3bb5b #94e24f #85bfda;
}

好的,現在把它的寬和高都設為 0,看看有什么變化。


四個邊框都變成三角形了,現在再把它的左右和下邊框的顏色都設成透明或和背景顏色相同的顏色,就出來我們想要的三角形了,推薦把邊框設置成透明,這樣拓展性更好。
注:IE6下把邊框設置成 transparent 時會出現黑影,并不會透明,把 border-style 設置成 dashed 可以解決。

.triangle{ 
    width:0; 
    height:0; 
    border-width: 20px; 
    border-style:solid dashed dashed dashed; 
    border-color:#e66161 transparent transparent transparent;
}

如果我們想實現下圖的效果該怎么辦呢?很簡單,做兩個小三角,一個是背景色,一個是邊框色,然后利用定位重疊在一起,記住他們的定位要相差一個像素

<div class="message-box"> 
    <span>我是利用 border 屬性實現的</span> 
    <div class="triangle-border tb-border"></div> 
    <div class="triangle-border tb-background"></div>
</div>
.message-box { 
    position:relative; 
    width:240px; 
    height:60px; 
    line-height:60px; 
    background:#E9FBE4; 
    box-shadow:1px 2px 3px #E9FBE4; 
    border:1px solid #C9E9C0; 
    border-radius:4px; 
    text-align:center; color:#0C7823;
}
.triangle-border { 
    position:absolute; 
    left:30px; 
    overflow:hidden; 
    width:0; 
    height:0; 
    border-width:10px; 
    border-style:solid dashed dashed dashed;
}
.tb-border { 
    bottom:-20px; 
    border-color:#C9E9C0 transparent transparent transparent;
}
.tb-background { 
    bottom:-19px; 
    border-color:#E9FBE4 transparent transparent transparent;
}

2.利用”◆“字符實現三角形
字符實現也是要用兩個字符用絕對定位去模擬,只是它不能模擬出三角形,它是個菱形,然后露出半個頭,底色又和背景色一樣,看上去就像是個三角形了。
注意:它的大小是由font-size決定的,widthheight都決定不了,但最好還是加上,這樣各個瀏覽器去生成這個字符的時候能保持一致,我們去寫絕對定位的時候就不用寫hack了。

<div class="message-box"> 
    <span>我是利用 ◆ 字符實現的</span> 
    <div class="triangle-character tc-border">◆</div> 
    <div class="triangle-character tc-background">◆</div>
</div>
.message-box { 
    position:relative; 
    width:240px; 
    height:60px; 
    line-height:60px; 
    background:#E9FBE4; 
    box-shadow:1px 2px 3px #E9FBE4; 
    border:1px solid #C9E9C0; 
    border-radius:4px; text-align:center; color:#0C7823;
}
.triangle-character { 
    position:absolute; 
    left:30px; 
    overflow:hidden; 
    width:26px; 
    height:26px; 
    font:normal 26px "宋體"; // 字符的大小和字體也有關系哦!
}
.tc-border { 
    bottom: -13px; 
    color:#C9E9C0;}.tc-background { bottom:-12px; color:#E9FBE4;
}

3.利用 CSS3 transfrom 旋轉 45 度實現三角形
先創建一個帶border的 div ,設置好背景色和相鄰的兩個邊框的顏色,然后選擇 45 度,聽著很簡單是嗎,但是利用 IE 的 matrix filter 實現 css3 transfrom 的兼容方案很頭大,我是沒看懂,有看懂的兄弟情賜教啊:)
注:IE6下無效。

<div class="message-box"> 
    <span>我是利用 css transfrom 屬性字符實現的</span> 
    <div class="triangle-css3 transform ie-transform-filter"></div>
</div>
.message-box { 
    position:relative; 
    width:240px; 
    height:60px; 
    line-height:60px; 
    background:#E9FBE4; 
    box-shadow:1px 2px 3px #E9FBE4;  
    border:1px solid #C9E9C0; 
    border-radius:4px; 
    text-align:center; 
    color:#0C7823;
}
.triangle-css3 { 
    position:absolute; 
    bottom:-8px; 
    bottom:-6px; 
    left:30px; 
    overflow:hidden; 
    width:13px; 
    height:13px; 
    background:#E9FBE4; 
    border-bottom:1px solid #C9E9C0; 
    border-right:1px solid #C9E9C0;
}
.transform { 
    -webkit-transform:rotate(45deg); 
    -moz-transform:rotate(45deg); 
    -o-transform:rotate(45deg); 
    transform:rotate(45deg);
}

奉上一篇神文:https://css-tricks.com/examples/ShapesOfCSS/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 1,806評論 0 2
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    love2013閱讀 2,339評論 0 11
  • display: none; 與 visibility: hidden; 的區別 聯系:它們都能讓元素不可見 區別...
    紋小艾閱讀 1,689評論 0 1
  • 1、屬性選擇器:id選擇器 # 通過id 來選擇類名選擇器 . 通過類名來選擇屬性選擇器 ...
    Yuann閱讀 1,658評論 0 7
  • 高中時候讀的一篇文章,現在讀起來意義還是那么深刻, nothing is impossible 作者...
    酒挺好聽故事挺好喝閱讀 613評論 0 2