还在用图片表示三角形与箭头吗?不会用CSS来绘制你就OUT了!!!

简介: CSS绘制三角形与箭头

作者:WangMin
格言:努力做好自己喜欢的每一件事

你是否还在用图片制作三角形和剪头吗?那就太out了。css可以轻松绘制出你想要的三角形与箭头,而且颜色大小可以随意改变,还不用担心失真等问题。那就一起来看看吧!!

实现原理

首先来看看当我们给元素添加border时,border的样子。假设代码如下:

<div class="box"></div>
.box{
    width:100px;
    height:100px;
    border:2px solid #f00;
}

网页显示如下:

2.png

这是我们使用border最常见的情况:给元素添加边框,往往只给border一个较小的宽度(通常为1-2px)。但是这种的常见的用法就会很容易让大家对border的形成方式产生误解,认为元素的border是由四个矩形边框拼接而成。

然而事实并我们认为的那样。元素的border是由三角形组合而成,为了给大家说明这个问题,这里我加大了border的宽度,并为border四条(上、下、左、右)边分别设置了不同的颜色。假设代码如下:

<div class="box"></div>
.box{
    width:100px;
    height:100px;
    border:50px solid;
    border-color: tomato peru brown sandybrown;
}

网页显示如下:

3.png

从例子中我们可以看出:每个边都是一个梯形。每一条边为什么会呈现出梯形的形态呢?那是因为我给元素设置了宽度与高度,那么如果当我把元素的宽度与高度都设置为0会发生什么情况呢?假设代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color: tomato peru brown sandybrown;
}

网页显示如下:

4.png

这时我们就可以发现元素由上下左右4个三角形 "拼接" 而成。那么为了绘制出三角形,还应该怎么做?显而易见,只需要把其它border边的颜色设置为透明色就可以了。如果想实现向上三角形,则其他的边为transparent,只设置最下面的边框颜色,就可以实现向上三角形,同理可以实现各种三角形。

各种方向三角形的写法

1、向上三角形,根据上面的实现原理,只需要保留下面的边,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color: transparent transparent pink transparent;
 }

网页显示如下:

5.png

2、向下三角形,根据上面的实现原理,只需要保留上面的边,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color: pink transparent transparent transparent;
 }

网页显示如下:

6.png

3、向左三角形,根据上面的实现原理,只需要保留右面的边,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color:transparent pink transparent transparent;
 }

网页显示如下:

7.png

4、向右三角形,根据上面的实现原理,只需要保留左面的边,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color:transparent transparent transparent pink;
 }

网页显示如下:
8.png

5、保留上边和左边组成三角形,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color:pink transparent transparent pink;
 }

网页显示如下:
9.png

6、保留上边和右边组成三角形,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color:pink pink transparent transparent;
 }

网页显示如下:
10.png

7、保留底边和左边组成三角形,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color:transparent transparent pink pink;
 }

网页显示如下:
11.png

8、保留底边和右边组成三角形,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border:50px solid;
    border-color:transparent pink pink transparent;
 }

网页显示如下:
12.png

从上面可以得到其实三角形是由三条方向的边框组成的,但是如果给四条边框都设置宽度时,即使某一边或者两边的边框颜色为透明色,实质上还是会占据边框宽度,所以当我们在绘制三角形,我们只需要给实现三角形所需要的三边的边框的宽度与颜色设置好就可以了。所以以上的三角形代码都可以根据你的需求简写。

以向下三角形为例,给四边都根据三角形组成原理设置了边框宽度与颜色,网页显示如下:
13.png

红色箭头部分其实是没有必要显示出来的,也就是底部边框,所以我们就没有必要给底边设置边框宽度与颜色。代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    border-left: 50px solid transparent;
    border-right:50px solid transparent;
    border-top:50px solid pink;
 }

网页显示如下:
14.png

同理,上面提到的各种三角形都可以根据自己的需求这样来写,来减少对多余空间的渲染与占据的空间。

实现带边框的三角形

带边框的三角形就是给三角形添加其它颜色的边框,就像给元素添加border一样,效果如下图:
15.jpg
由于不能继续通过给三角形设置border的方法来为其设置边框(因为三角形本身就是利用border实现的),所以只能想其他的办法。而能想到的一个最自然的方法就是三角形叠放,就是把当前三角形叠放在更大的三角形上方,上面效果图所展示出的三角形的实现方法就是把蓝色三角形放在了尺寸更大的红色三角形上。

为了这样的效果,所以需要利用绝对定位方法。首先定义出外面的红色三角形,因为绝对定位要相对于父元素进行定位,所以这里需要给红色三角形设置相对定位,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    position: relative;
    border-left: 50px solid transparent;
    border-right:50px solid transparent;
    border-bottom:50px solid #f00;
}

网页显示如下:

16.png

然后再定义蓝色三角形,但是由于蓝色三角形的定位需要参考红色三角形的位置,所以需要给蓝色三角形设置绝对定位。因此需要将蓝色三角形作为红色三角形的子元素。我首先想到的方法是在红色三角形内部定义另外一个标签来表示蓝色三角形,但是为了节约标签简化网页结构,最好的办法是使用伪元素。蓝色三角形代码如下:

.box:after{
       content: "";
       width: 0;
       height: 0;
       position: absolute;
       top: 0px;
       left: 0px;
       border-left: 50px solid transparent;
       border-right:50px solid transparent;
       border-bottom:50px solid blue;
   }

网页显示如下:
17.png

到这一步可能你会有疑问:为什么蓝色三角形会向左偏移一段距离呢,按道理不应该完全重合在红色三角形上吗,就像下面这样:
18.png

但是这样会让你觉得似乎红色三角不见了,实际上红色三角形只是被蓝色三角覆盖了,但这也显现出来你的一个问题:对绝对定位没有足够的了解。因为绝对定位的区域是相对于父元素的区域(包括内边距padding所占的区域),然后在这个基础上运用top、left、right、bottom等属性来约束绝对定位子元素的位置。例如如下代码:

<div class="box"></div>
.box{
      width:20px;
      height:20px;
      padding:10px;
      position: relative;
      border-left: 50px solid transparent;
      border-right:50px solid transparent;
      border-bottom:50px solid #f00;
  }
  .box:after{
      content: "";
      width: 0;
      height: 0;
      position: absolute;
      top: 0px;
      left: 0px;
      border-left: 50px solid transparent;
      border-right:50px solid transparent;
      border-bottom:50px solid blue;
  }

19.png

这里我给元素设置了宽度与高度,并且还设置了padding,红色框表示元素的整体尺寸(包括各个方向的内边距),黑色框表示的是蓝色三角形的整体尺寸,从图中可以看出蓝色三角形是相对于红框的左上角进行定位的。

在本例中,由于红色三角形作为绝对定位父元素,它的尺寸为0,所以元素的尺寸就是红色三角形的上顶点,也就是下图中红色箭头交叉位置。
20.png

蓝色三角形由于设置了left: 0和top: 0,所以蓝色三角形的所有内容将根据红色三角形的上顶点进行定位。由于蓝色三角形区域也位于其顶点处,而且对其也设置了左右各50px的border,所以蓝色三角形的内容区域将向右偏移50px,所以形成了之前显示的效果。

弄清楚了绝对定位以后,只需要在最开始的代码上稍稍修改就可以将蓝色三角形的顶点与红色三角形顶点相重合,同时还应该适当缩小蓝色三角形的尺寸(根据你需要的边框宽度而定),因为这里我们需要在页面上显示出一个带红色边框的蓝色三角形,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    position: relative;
    border-left: 50px solid transparent;
    border-right:50px solid transparent;
    border-bottom:50px solid #f00;
}
.box:after{
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    top: 0px;
    left: -46px;
    border-left: 46px solid transparent;
    border-right:46px solid transparent;
    border-bottom:46px solid blue;
   }

网页显示如下:
21.png

到这一步了,相信大家都知道该怎么做了吧!只需要利用top将蓝色三角形向下移动到合适的位置就可以了,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    position: relative;
    border-left: 50px solid transparent;
    border-right:50px solid transparent;
    border-bottom:50px solid #f00;
}
.box:after{
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    top: 3px;
    left: -46px;
    border-left: 46px solid transparent;
    border-right:46px solid transparent;
    border-bottom:46px solid blue;
   }

最终带红色边框的蓝色三角形就完成了,网页显示效果如下:
22.png

向下带红色边框的蓝色三角形,代码如下:

<div class="box"></div>
.box{
      width:0px;
      height:0px;
      position: relative;
      border-left: 50px solid transparent;
      border-right:50px solid transparent;
      border-top:50px solid #f00;
  }
  .box:after{
      content: "";
      width: 0;
      height: 0;
      position: absolute;
      bottom: 3px;
      left: -46px;
      border-left: 46px solid transparent;
      border-right:46px solid transparent;
      border-top:46px solid blue;
  }

网页显示效果如下:
23.png

向左带红色边框的蓝色三角形,代码如下:

<div class="box"></div>
.box{
      width:0px;
      height:0px;
      position: relative;
      border-top:50px solid transparent;
      border-bottom:50px solid transparent;
      border-right:50px solid #f00;
  }
.box::after{
      content: "";
      width: 0;
      height: 0;
      position: absolute;
      top:-46px;
      left:4px;
      border-top: 46px solid transparent;
      border-bottom:46px solid transparent;
      border-right:46px solid blue;
  }

网页显示效果如下:
24.png

向右带红色边框的蓝色三角形,代码如下:

<div class="box"></div>
.box{
      width:0px;
      height:0px;
      position: relative;
      border-top:50px solid transparent;
      border-bottom:50px solid transparent;
      border-left:50px solid #f00;
  }
  .box::after{
      content: "";
      width: 0;
      height: 0;
      position: absolute;
      bottom:-46px;
      right:3px;
      border-top: 46px solid transparent;
      border-bottom:46px solid transparent;
      border-left:46px solid blue;
  }

网页显示效果如下:
25.png

利用三角形实现箭头

学会了带边框三角形的绘制,那我们就可以在它的基础上来实现三角形箭头来 ,只需要稍作修改就可以了。只需要将子元素的top值或者bottom值添加1-2个像素(px),并且将子元素需要保留的那一边的边框颜色设置为白色,这样就可以的到箭头符号了。

1、向上箭头的实现,代码如下:

<div class="box"></div>
.box{
     width:0px;
     height:0px;
     position: relative;
     border-left: 50px solid transparent;
     border-right:50px solid transparent;
     border-bottom:50px solid #f00;
 }
 .box:after{
     content: "";
     width: 0;
     height: 0;
     position: absolute;
     top: 4px;
     left: -46px;
     border-left: 46px solid transparent;
     border-right:46px solid transparent;
     border-bottom:46px solid #fff;
 }

网页显示如下:
26.png

2、向下箭头的实现,代码如下:

<div class="box"></div>
.box3{
    width:0px;
    height:0px;
    position: relative;
    border-left: 50px solid transparent;
    border-right:50px solid transparent;
    border-top:50px solid #f00;
}
.box3:after{
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    bottom: 4px;
    left: -46px;
    border-left: 46px solid transparent;
    border-right:46px solid transparent;
    border-top:46px solid #fff;
}

网页显示如下:
27.png

3、向左箭头的实现,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    position: relative;
    border-top:50px solid transparent;
    border-bottom:50px solid transparent;
    border-right:50px solid #f00;
}
.box::after{
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    top:-46px;
    left:4px;
    border-top: 46px solid transparent;
    border-bottom:46px solid transparent;
    border-right:46px solid #fff;
}

网页显示如下:
28.png

4、向右箭头的实现,代码如下:

<div class="box"></div>
.box{
    width:0px;
    height:0px;
    position: relative;
    border-top:50px solid transparent;
    border-bottom:50px solid transparent;
    border-left:50px solid #f00;
}
.box::after{
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    bottom:-46px;
    right:4px;
    border-top: 46px solid transparent;
    border-bottom:46px solid transparent;
    border-left:46px solid #fff;
}

网页显示如下:
29.png


以上仅是个人见解,若有不足之处欢迎在下方评论指出,那就先分享到这里!! :smile: 后续继续更新!!

目录
相关文章
|
5天前
|
人工智能 定位技术 SEO
我学 GEO 第 15 天:终于知道AI GEO该如何做?
我是暴走的莉莉酱,边旅行边研究AI GEO的数字游民。专注普通人如何提升“AI可见度”——让AI在回答用户问题时准确识别、理解并推荐你。不讲玄学,只做可测、可调、可持续的GEO实践。
407 125
|
7天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
694 5
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
5天前
|
缓存 人工智能 运维
阿里云618百炼大模型Qwen3.7-Max功能、免费试用、订阅计费、配置接入详解
Qwen3.7-MAX是阿里云百炼平台推出的通义千问3.7系列旗舰大语言模型,专为智能体时代复杂任务打造,依托阿里云全域算力与自研技术,在逻辑推理、长文本处理、代码工程、长周期自主执行等领域达到行业顶尖水平。2026年618期间,该模型推出多重免费试用权益、按量计费5折、订阅套餐优惠等专属福利,覆盖个人开发者、团队与企业全场景需求,以下从核心功能、免费试用、订阅计费、配置接入四方面展开详细解析。
404 123
|
3天前
|
人工智能 自然语言处理 API
阿里云Token Plan团队版解析:功能、三档套餐与省钱订阅指南
阿里云百炼平台推出的Token Plan团队版,是面向企业与团队的AI大模型订阅服务,以Credits为统一计量单位,整合文本与图像生成模型,提供团队管理、数据安全、多工具兼容等核心能力,解决团队零散订阅AI服务的管理混乱、成本失控、数据安全等痛点。本文将从核心定位、套餐详情、计费规则、团队管理、工具兼容、便宜订阅技巧等方面,全面解析Token Plan团队版,帮助企业与团队高效、低成本地使用AI服务。
302 108
|
4天前
|
存储 人工智能 数据可视化
别再手动复制 Skill 了:多 Agent 时代的 Skill 管理方案
多 Agent 场景下 Skill 的统一管理与同步。
243 124
|
18天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
11天前
|
缓存 人工智能 运维
GLM 5.2自托管全流程实战:硬件选型、vLLM/SGLang部署与成本盈亏测算
2026年智谱发布GLM 5.2超大混合专家模型,区别于以往仅开放API的闭源大模型,该模型权重以MIT开源协议对外发布,企业与开发者可完整下载、本地审计、私有化部署,实现数据不出环境、自定义微调、自主调度推理资源。GLM 5.2拥有753B总参数,原生支持百万级上下文窗口,在代码生成、长文档推理、数学逻辑等多项基准测试中对标国际顶尖商用模型,是首款可完整自托管的前沿代码向大模型。
909 0
|
13天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)