【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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,745评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,314评论 0 11
  • display: none; 与 visibility: hidden; 的区别 联系:它们都能让元素不可见 区别...
    纹小艾阅读 1,457评论 0 1
  • 1、属性选择器:id选择器 # 通过id 来选择类名选择器 . 通过类名来选择属性选择器 ...
    Yuann阅读 1,629评论 0 7
  • 高中时候读的一篇文章,现在读起来意义还是那么深刻, nothing is impossible 作者...
    酒挺好听故事挺好喝阅读 602评论 0 2