一、css画各种三角形的原理
1、基础原理
当div宽度为0,高度为0的时候,只设置border的大小和四边不同颜色可看到下图,只保留一边的颜色,另外三边的颜色设置为transparent可得到一个方向的三角形。因此,可延伸出设置一边的border的颜色,相邻两边的border设置为transparent可得到一个方向的三角形。
<div id="triangle"></div>
<style>
#triangle{
width: 0;
height: 0;
border: 100px solid;
border-top-color: #000;
border-right-color: red;
border-left-color: yellow;
border-bottom-color: blue;
}
</style>
2、等腰锐角三角形
border的大小的值为三角形底边上的高,三角形的底为相邻两边的border的高的和,如下图所示的红色锐角三角形
<div id="triangle"></div>
<style>
#triangle{
width: 0;
height: 0;
border-left: 50px solid yellow;
border-right: 50px solid green;
border-bottom: 100px solid red;
}
</style>
3、直角在正方形四个方向的直角三角形
若想实现直角三角形的效果,如下图所示直角在左上的三角形,按原理可设置上border和左border的颜色,另外两条边的颜色为transparent,此样式可简写为只设置上border的颜色,另一条相邻的右border为transparent
<div id="triangle"></div>
<style>
#triangle{
width: 0;
height: 0;
border: 100px solid;
border-top-color: red;
border-right-color: transparent;
border-left-color: red;
border-bottom-color: transparent;
}
</style>
//简写
#triangle-top-left{
width: 0;
height: 0;
border-right: 100px solid transparent;
border-top: 100px solid red;
}
4、其他奇形怪状三角形
你也许会遇到要画个奇怪三角形的时候,只要参考锐角三角形的方式,找到三角形底边和高,计算出三角形高和把相邻两条边的高相加作为底部,你可以画出各种各样的三角形,如果再加上角度旋转的css,你便啥三角形都能画!
#triangle-weird{
width: 0;
height: 0;
border-left: 150px solid transparent;
border-right: 300px solid transparent;
border-bottom: 100px solid red;
transform: rotate(20deg);
}
5、带边框的三角形/空心三角形
此类三角形解决思路通常使用两个不同颜色的三角形做颜色叠加,比如做如上图所示的边框为1px的红色边框白色底三角形,就先画一个红色三角形,再画一个尺寸少2px的白色底三角形,然后设置两个三角形的position将三角形重叠,这里使用伪元素实现
#triangle-hollow{
width: 0;
height: 0;
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-bottom: 100px solid red;
position: relative;
}
#triangle-hollow:after{
content:'';
position: absolute;
top: 1px;
left: -98px;
width: 0;
height: 0;
border-left: 98px solid transparent;
border-right: 98px solid transparent;
border-bottom: 98px solid white;
}
6、对话框常用三角形及带阴影的效果
6.1 实现带边框的对话框三角形效果
此类效果需要用到两个伪元素,类似带边框的三角形的遮挡方式来实现
.box:before{
content: '';
position: absolute;
width: 10px;
height: 10px;
left: 50%;
margin-left: 1px;
bottom: -9px;
z-index: 1;
width: 0;
height: 0;
border-left: 9px solid transparent;
border-right: 9px solid transparent;
border-top: 9px solid #fff;
}
.box:after{
content: '';
position: absolute;
left: 50%;
bottom: -10px;
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid #999;
}
6.2 对话框实现带阴影
如果上述的对话框要实现带阴影的效果,我们可以做一个与对话框背景相同颜色的正方形带阴影,并旋转45°得到一个三角形。
此处复习一下box-shadow的知识点,box-shadow是css3向框添加一个或多个阴影的属性,具体使用如下,
box-shadow: 水平阴影的位置 垂直阴影的位置 模糊距离 阴影大小 颜色 inset内侧阴影或外侧;如使用多层阴影则每组参数逗号隔开。
.box{
width: 200px;
height: 200px;
position: relative;
box-shadow: 0 3px 6px -4px rgba(0,0,0,.12), 0 6px 16px 0 rgba(0,0,0,.08), 0 9px 28px 8px rgba(0,0,0,.05);
}
.box:after{
content:'';
position: absolute;
width: 10px;
height: 10px;
transform: rotate(45deg);
left: 50%;
bottom: -5px;
background: #fff;
box-shadow: 3px 3px 7px rgba(0,0,0,.07);
}
7、其他实现三角形的方式
7.1 clip-path
CSS 新属性 clip-path,意味裁剪路径的意思,让我们可以很便捷的生成各种几何图形。简单了解一下clip-path的基本用法:参考资料:https://blog.csdn.net/weixin_44116302/article/details/98882841
定义一个宽高为200px的区域,然后将底边为200px高为200px的三角形的三个点的坐标填入,就可得到一个三角形
.clip{
width: 200px;
height: 200px;
background: palevioletred;
clip-path: polygon(50% 0%, 0% 200px, 200px 200px);
-webkit-clip-path: polygon(50% 0%, 0% 200px, 200px 200px);
}
7.1 canvas
canvas绘制图形的参考资料:https://www.cnblogs.com/jarson-7426/p/6231767.html
<canvas id="tri"></canvas>
<script>
var triCanvas = document.getElementById('tri');
var ctx = triCanvas.getContext('2d')
var draw = function(x1, y1, x2, y2, x3, y3, color, type) {
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.lineTo(x3, y3);
ctx[type + 'Style'] = color;
ctx.closePath();
ctx[type]();
}
//传入三个点的坐标和颜色,实心为fill,空心为stroke
draw(50,50,75,75,50,100,'red','fill')
</script>
二、常见三角形的实现
1、向上正箭头△
#triangle-up{
width: 0;
height: 0;
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-bottom: 100px solid palevioletred;
}
2、向下正箭头▽
#triangle-down{
width: 0;
height: 0;
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-top: 100px solid palevioletred;
}
3、向左正箭头▷
#triangle-left{
width: 0;
height: 0;
border-left: 100px solid palevioletred;
border-bottom: 100px solid transparent;
border-top: 100px solid transparent;
}
4、向右正箭头 ◁
#triangle-right{
width: 0;
height: 0;
border-bottom: 100px solid transparent;
border-right: 100px solid palevioletred;
border-top: 100px solid transparent;
}
5、向左上箭头 ◥
#triangle-top-left{
width: 0;
height: 0;
border-right: 100px solid transparent;
border-top: 100px solid palevioletred;
}
6、向右上箭头 ◤
#triangle-top-right{
width: 0;
height: 0;
border-left: 100px solid transparent;
border-top: 100px solid palevioletred;
}
7、向左下箭头 ◣
#triangle-down-left{
width: 0;
height: 0;
border-right: 100px solid transparent;
border-bottom: 100px solid palevioletred;
}
8、向右下箭头 ◢
#triangle-down-right{
width: 0;
height: 0;
border-left: 100px solid transparent;
border-bottom: 100px solid palevioletred;
}
三、附加其他形状的实现原理
1、梯形
我们知道,用border画三角形的时候设置了width为0和宽度为0,那么当宽度和高度相同但是大于0的时候如下图所示,可得到四个方向不同的梯形
固将其余三个方向的boder颜色变为transparent,可得一个方向的梯形
#triangle {
width: 100px;
height: 50px;
border: 100px solid;
border-top-color: transparent;
border-right-color: transparent;
border-left-color: transparent;
border-bottom-color: palevioletred;
}
/*简写*/
#triangle{
width: 100px;
height: 50px;
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-bottom: 100px solid palevioletred;
}
2、五角星形
五角星形是可以由三个三角形旋转角度拼成的,具体旋转的角度由五角星的角度形成的直角三角形两条直角边长的比例来确定,即正五角星的角度是36度,两条直角边的比是tan36°,设三角形的高为X,底边就是X/tan36°,该实现方式计算困难不适用于高度还原设计稿的时候,建议在需要五角星的时候使用图标字体。
.star {
width: 0;
height: 0;
border-top: 70px solid palevioletred;
border-right: 100px solid transparent;
border-left: 100px solid transparent;
position: relative;
}
.star:before {
content: '';
width: 0;
height: 0;
top: -70px;
right: -100px;
position: absolute;
transform: rotate(70.5deg);
border-top: 70px solid palevioletred;
border-right: 100px solid transparent;
border-left: 100px solid transparent;
}
.star:after {
content: '';
width: 0;
height: 0;
top: -70px;
right: -100px;
position: absolute;
transform: rotate(-70.5deg);
border-top: 70px solid palevioletred;
border-right: 100px solid transparent;
border-left: 100px solid transparent;
}