你可以在网页中很多地方看到三角形(小三角):tooltips提示框、下拉菜单、返回顶部、甚至在loading载入动画里。不管你喜欢还是不喜欢,这些小元素对各UI元素之间的联系是很重要的。本文主要介绍利用CSS的实现方法:
首先我们来看一下border这个属性,当我们把一个div的border-color设为不同值的时候,可以看到四边都成了一个梯形。
#test{
width:50px;
height:50px;
border-width:50px;
border-style:solid;
border-color:#2DC9FE #FF7526 #0FDD06 #FFEC32;
}
如果我们继续把这个div的width和height都设为0,可以看到四边都成了一个三角形。
#test{
width:0;
height:0;
border-width:50px;
border-style:solid;
border-color:#2DC9FE #FF7526 #0FDD06 #FFEC32;
}
在主流浏览器中检测一下,发现IE6中存在一个小问题,上下边能形成三角形,左右两边仍然还是梯形。
通过实验发现当把div的font-size和line-height都设为0的时候,div的四边在IE6下都能形成完美的三角形。通过测试可以通过设置 font-size:0; line-height:0;
可以解决该问题。
很显然我们只需要其中的一个三角形,那么只需要将其他三边的color设置为透明或者跟页面背景一样的颜色,就能模拟出一个三角来,推荐将其他三边颜色设置为透明,即border-color:#2DC9FE transparent transparent;
,如果其他三边颜色跟页面背景一样,虽然视觉上只能看到一个三角,但背景颜色一旦改变,其他三边颜色也要随之改变。
#test{
width:0;
height:0;
border-width:50px;
border-style:solid;
border-color:#2DC9FE transparent transparent;
font-size:0; /*兼容IE6*/
line-height:0;
}
问题又来了,IE6下transparent无效!其他三边被设置成默认的黑色了。
但设置元素的border-style: dashed
后,IE6下其他三边就能透明了!
#test{
width:0;
height:0;
border-width:50px;
border-color:#2DC9FE transparent transparent;
font-size:0; /*兼容IE6*/
line-height:0;
border-style:solid dashed dashed;
}
利用设置boder属性重叠的小三角形可以实现气泡框效果如下:
CSS绘制更多图形方法:
写西北方(↖),东北方(↗),西南方(↙),东南方(↘)的三角形 [原理如图]:
优点
- 很容易的通过修改一些CSS代码属性值而更改颜色和大小。
- 这是一个跨浏览器的解决方案。
缺点
-这个方法使用的是border,所以你不能添加阴影、渐变、和其他一些CSS3效果。
理论上,这种方法,需要使用两个内容块,但是并没有限制是使用两个元素,所以可以使用一个元素加一个伪元素。
优点
- CSS3阴影,渐变等可以更多的使用。
缺点
- 这个解决方案不是跨浏览器的,首先是因为CSS3旋转。
假如你已经有了三角形的图片,为了减少HTTP请求,可以将这个图片转换成一个BASE64字符串是不错的解决方案。
需要用到的工具(用于图片转换成BASE64编码):
优点
- 你可以按照自己的思想设计阴影,渐变等,然后对其进行转换编码。
缺点
- 你需要使用一个图片编辑软件去设计。
- 对于较大的图片,最终转换成字符串可能会很大。
- 旧版本的浏览器,如:IE6/IE7不兼容。
使用相应类似形状的Unicode字符列来模拟相应形状。
优点
- 这是一个跨浏览器的技术。
- 您可以使用CSS3的text-shadow属性添加阴影。
缺点
- 不能使用太多的CSS3效果,除了使用文字阴影。
- 对于所有的浏览器,不可能实现像素完美。
在你的HTML文件添加如下的canvas元素:
使用JavaScript绘制一个三角形:
var canvas = document.getElementById('triangle');
var context = canvas.getContext('2d');
context.beginPath();
context.moveTo(0, 0);
context.lineTo(100, 0);
context.lineTo(50, 100);
context.closePath();
context.fillStyle = "rgb(78, 193, 243)";
context.fill();
定义一个内联SVG三角形:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" class="svg-triangle">
<polygon points="0,0 100,0 50,100"/>
svg>
然后,只需添加一些样式:
.svg-triangle{
margin: 0 auto;
width: 100px;
height: 100px;
}
.svg-triangle polygon {
fill:#98d02e;
stroke:#65b81d;
stroke-width:2;
}