CSS实现三角形的三种方法(超详细)

www.jswusn.com CSS 2025-04-11 09:36:28 17次浏览


这篇详细介绍一下三种用 CSS 画三角形的方法(附代码和效果图),之前面试的时候经常被问到,看完这篇你将彻底搞懂它们的实现原理。


方法一:通过边框(border)实现

平时给元素设置边框时往往设置为1px,如果边框再厚一些呢?比如20px:

732f04190e8fa00fb8af1f7a8cd70973.jpg

边框加厚后出现了四个梯形,可以想到边框越厚梯形会越高。如果继续加厚边框同时减小元素宽度呢?

33ae20faf90920e126a517d1092b71c3.jpg

可以看出梯形的上底变短了,那如果元素宽度为0的话...

20cc2cce2fb0ca8ea7657620652c76df.jpg

四个三角形!!如果我就想保留红色三角形,那把其他三个边框设置为透明色不就可以了!

.triangle {
    width: 0;
    height: 0;
    background: #409eff;
    border-left: 50px solid transparent;  /* transparent 透明 */
    border-right: 50px solid transparent;
    border-top: 50px solid transparent;
    border-bottom: 50px solid #ff0000;
}
/* 若去掉上边框 */
.triangle {
    width: 0;
    height: 0;
    background: #409eff;
    border-left: 50px solid transparent; 
    border-right: 50px solid transparent;
    border-bottom: 50px solid #ff0000;
}

a2ca410d338cf385d73f9b4937ca523b.jpg

可以看到若想保留红色三角,则需将其他边框设为透明(对边去不去掉都行)。最后再去掉底色就完成了:

83bb10db0531b06798b4a603e47e4bad.jpg

向下三角(黑色)

6192b9878aaad7a53a948cd8de65ade9.jpg

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-top: 50px solid #000000;
}

向左三角(绿色

6aa183821cb5034497198a201f662273.jpg

.triangle {
  width: 0;
  height: 0;
  border-right: 50px solid #22e000;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

向右三角(紫色

1514af0cb42b08bb7fcf214f2b53628f.jpg

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid #9d00ff;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

如果是指向四个顶点的三角形呢?

左上

213245c5d8a0d89c15df35ba653e2f1a.png

.triangle {
    width: 0;
    height: 0;
    border-top: 50px solid #000000;
    border-right: 50px solid transparent;
}
/* 同等效果 */
.triangle {
    width: 0;
    height: 0;
    border-left: 50px solid #000000;
    border-bottom: 50px solid transparent;
}

右上

5a6b578aab953006b289a387bdd8533c.jpg

.triangle {
    width: 0;
    height: 0;
    border-top: 50px solid #000000;
    border-left: 50px solid transparent;
}
/* 同等效果 */
.triangle {
    width: 0;
    height: 0;
    border-right: 50px solid #000000;
    border-bottom: 50px solid transparent;
}

其余两个大家自己试一试吧~

方法二:使用clip-path属性(更灵活)

clip-path 属性利用裁剪的方式创建元素的可显示区域

/* clip-path 的属性值有很多种写法,这里只讲实现三角形的写法 */
clip-path: polygon(x1 y1, x2 y2, x3 y3, ...)

通过定义多边形的顶点坐标(至少 3 个点)来裁剪元素。坐标以百分比绝对单位表示,相对元素的尺寸计算

.triangle {
  width: 100px;
  height: 100px;
  background: #409eff;
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
}

6f1e10aed532b604e7906ef6bbd61e5c.jpg

  • 50% 0%:第一个顶点位于元素的x轴方向从左到右50%的位置,y轴方向从上到下0%的位置
  • 0% 100%:第二个顶点位于元素的x轴方向从左到右0%的位置,y轴方向从上到下100%的位置
  • 100% 100%:第三个顶点位于元素的x轴方向从左到右100%的位置,y轴方向从上到下100%的位置

polygon() 自动闭合路径(从最后一个点连回第一个点),图形外的内容(如文字、图片)不可见

方法三:利用backgroundlinear-gradient()

linear-gradient() 是 CSS 中用于创建线性渐变背景的函数,能够替代传统图片背景,常用于按钮、卡片、文字特效等场景

background: linear-gradient(
  [方向或角度], 
  [颜色1] [停止位置], 
  [颜色2] [停止位置], 
  ...
);
  • 方向或角度(可选):

    • 关键词:to topto rightto bottom left(默认 to bottom)。

    • 角度:0deg(向上)到 360deg,顺时针计算。0deg = 向上(同 to top);90deg = 向右(同 to right

  • 颜色停止位置:

    • 至少需要两个颜色,格式为 颜色 位置(如 #ff6b6b 20%)。

    • 位置可用百分比或像素(如 50%100px

先画一个长方形:

52e74520f2c3703e49589ae04dfa7b00.jpg

.triangle {
  width: 100px;
  height: 150px;
  border: 2px solid #000000;
}

加一个从左上到右下的渐变色图片(透明 -> 红色)试试:

54d55a00514c078d01afae4aac35cc8d.jpg

.triangle {
  width: 100px;
  height: 150px;
  border: 2px solid #000000;
  background-image: 
    linear-gradient(
      to bottom right,  /* 朝右下角 */
      transparent 50%,  /* 左上半透明 */
      #ff0000 50%      /* 右下半红色 */
    );
}

这个像上三角的左半部分,能否再加上它的右半部分呢?在 CSS3 里,background-image 可以通过逗号分隔来叠加多个背景图像:

.element {
    background-image: 
        url("image1.png"),  /* 最上层 */
        url("image2.png"),  /* 中间层 */
        linear-gradient(to right, #ff6b6b, #4ecdc4); /* 最底层 */
    background-repeat: no-repeat;
    background-position: 
        center,  /* image1 的位置 */
        left top, /* image2 的位置 */
        right bottom; /* 渐变的的位置 */
    background-size: 
        50%,   /* image1 的尺寸 */
        100px, /* image2 的尺寸 */
        cover; /* 渐变的尺寸 */
}

规则

  • 层叠顺序:先写的图层在上层,后写的在下层
  • 属性对应:其他背景属性(如 positionsize)也用逗号分隔,按顺序对应每个图层
  • 默认继承:若某个属性值的数量少于图层数,浏览器会重复最后一个值。 (例如:两个背景图,但只写了一个 background-position,则第二个图的位置与第一个相同)

现在让我们挪动当前渐变的位置:

9c6d5e185ec2cfba8f3db4ffcf4f6de3.jpg

.triangle {
    width: 100px;
    height: 150px;
    border: 2px solid #000000;
    background-image: 
        linear-gradient(
          to bottom right,  /* 朝右下角 */
          transparent 50%,  /* 左上半透明 */
          #ff0000 50%      /* 右下半红色 */
        );
    background-position: left;
    background-size: 50%100%;
    background-repeat: no-repeat;
}

右侧再加一个镜像方向渐变的图片:

9259a4682170ce104c5c2435ee025dd1.jpg

.triangle {
    width: 100px;
    height: 150px;
    border: 2px solid #000000;
    background-image: 
        linear-gradient(
          to bottom right,  /* 朝右下角 */
          transparent 50%,  /* 左上半透明 */
          #ff0000 50%      /* 右下半红色 */
        ),
        linear-gradient(
          to bottom left,  /* 朝左下角 */
          transparent 50%,  /* 右上半透明 */
          #ff0000 50%      /* 左下半红色 */
        );
    background-position: left, right;
    background-size: 50%100%, 50%100%;
    background-repeat: no-repeat;
}

最后去掉边框即可。

再尝试一下其他方向的三角形:

向下三角

0c7cf843b02623a0b19818da84b9cefd.jpg

.triangle {
    width: 100px;
    height: 150px;
    border: 2px solid #000000;
    background-image: 
        linear-gradient(
          to top right,  /* 朝右上角 */
          transparent 50%,  /* 左下半透明 */
          #ff0000 50%      /* 右上半红色 */
        ),
        linear-gradient(
          to top left,  /* 朝左上角 */
          transparent 50%,  /* 右下半透明 */
          #ff0000 50%      /* 左上半红色 */
        );
    background-position: left, right;
    background-size: 50%100%, 50%100%;
    background-repeat: no-repeat;
}

向左三角


111b65eb26f25dc6a178205dd883512a.jpg

.triangle {
    width: 100px;
    height: 150px;
    border: 2px solid #000000;
    background-image: 
        linear-gradient(
          to bottom right,  /* 朝右下角 */
          transparent 50%,  /* 左上半透明 */
          #ff0000 50%      /* 右下半红色 */
        ),
        linear-gradient(
          to top right,  /* 朝右上角 */
          transparent 50%,  /* 左下半透明 */
          #ff0000 50%      /* 右上半红色 */
        );
    background-position: top, bottom;
    background-size: 100%50%, 100%50%;
    background-repeat: no-repeat;
}

最后再画个风车吧~

c5395408669cd6d65fe025e590f43bf3.jpg

.item3 {
    width: 150px;
    height: 150px;
    background-image: 
        linear-gradient(
          to bottom left,  /* 朝左下角 */
          transparent 50%,  /* 右上半透明 */
          #22e000 50%      /* 左下半绿色 */
        ),
        linear-gradient(
          to top left,  /* 朝左上角 */
          transparent 50%,  /* 右下半透明 */
          #ff0000 50%      /* 左上半红色 */
        ),
        linear-gradient(
          to bottom right,  /* 朝右下角 */
          transparent 50%,  /* 左上半透明 */
          #00000050%      /* 右下半黑色 */
        ),
        linear-gradient(
          to top right,  /* 朝右上角 */
          transparent 50%,  /* 左下半透明 */
          #9d00ff 50%      /* 右上半紫色 */
        );
    background-position: left top , right top, left bottom, right bottom;
    background-size: 50%50%, 50%50%, 50%50%, 50%50%;
    background-repeat: no-repeat;
}


技术分享

苏南名片

  • 联系人:吴经理
  • 电话:152-1887-1916
  • 邮箱:message@jswusn.com
  • 地址:江苏省苏州市相城区

热门文章

Copyright © 2018-2025 jswusn.com 版权所有

技术支持:苏州网站建设  苏ICP备18036849号