前端生成三角形的几种方法

923 阅读8分钟

方法一:使用 CSS 边框 (border)

这是最常见且最简单的方法,利用 CSS 边框的特性来创建三角形。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Triangle</title>
    <style>
        .triangle-up {
            width: 0;
            height: 0;
            border-left: 50px solid transparent;
            border-right: 50px solid transparent;
            border-bottom: 100px solid red;
        }
        .triangle-down {
            width: 0;
            height: 0;
            border-left: 50px solid transparent;
            border-right: 50px solid transparent;
            border-top: 100px solid blue;
        }
        .triangle-left {
            width: 0;
            height: 0;
            border-top: 50px solid transparent;
            border-bottom: 50px solid transparent;
            border-right: 100px solid green;
        }
        .triangle-right {
            width: 0;
            height: 0;
            border-top: 50px solid transparent;
            border-bottom: 50px solid transparent;
            border-left: 100px solid orange;
        }
        .triangle-top-left {
            width: 0;
            height: 0;
            border-top: 100px solid red;
            border-right: 100px solid transparent;
        }
        .triangle-top-right {
            width: 0;
            height: 0;
            border-top: 100px solid blue;
            border-left: 100px solid transparent;
        }
        .triangle-bottom-left {
            width: 0;
            height: 0;
            border-bottom: 100px solid green;
            border-right: 100px solid transparent;
        }
        .triangle-bottom-right {
            width: 0;
            height: 0;
            border-bottom: 100px solid orange;
            border-left: 100px solid transparent;
        }
    </style>
</head>
<body>
    <div class="triangle-up"></div>
    <div class="triangle-down"></div>
    <div class="triangle-left"></div>
    <div class="triangle-right"></div>
    <div class="triangle-top-left"></div>
    <div class="triangle-top-right"></div>
    <div class="triangle-bottom-left"></div>
    <div class="triangle-bottom-right"></div>
</body>
</html>

代码解释:

  • 原理: 当一个元素的 widthheight 都设置为 0 时,元素的边框会形成一个三角形。通过设置不同方向的边框颜色和透明度,可以创建不同方向的三角形。
  • .triangle-up:
    • width: 0; height: 0;:将元素的宽高设置为 0。
    • border-left: 50px solid transparent; border-right: 50px solid transparent;:设置左右边框为透明,宽度为 50px。
    • border-bottom: 100px solid red;:设置底部边框为红色,宽度为 100px。
    • 结果:一个向上指的红色三角形。
  • .triangle-down:
    • .triangle-up 类似,但将 border-bottom 替换为 border-top,颜色为蓝色。
    • 结果:一个向下指的蓝色三角形。
  • .triangle-left:
    • border-top: 50px solid transparent; border-bottom: 50px solid transparent;:设置上下边框为透明,宽度为 50px。
    • border-right: 100px solid green;:设置右边框为绿色,宽度为 100px。
    • 结果:一个向左指的绿色三角形。
  • .triangle-right:
    • .triangle-left 类似,但将 border-right 替换为 border-left,颜色为橙色。
    • 结果:一个向右指的橙色三角形。
  • .triangle-top-left:
    • border-top: 100px solid red;:设置顶部边框为红色,宽度为 100px。
    • border-right: 100px solid transparent;:设置右边框为透明,宽度为 100px。
    • 结果:一个指向左上角的红色三角形。
  • .triangle-top-right:
    • .triangle-top-left 类似,但将 border-right 替换为 border-left,颜色为蓝色。
    • 结果:一个指向右上角的蓝色三角形。
  • .triangle-bottom-left:
    • border-bottom: 100px solid green;:设置底部边框为绿色,宽度为 100px。
    • border-right: 100px solid transparent;:设置右边框为透明,宽度为 100px。
    • 结果:一个指向左下角的绿色三角形。
  • .triangle-bottom-right:
    • .triangle-bottom-left 类似,但将 border-right 替换为 border-left,颜色为橙色。
    • 结果:一个指向右下角的橙色三角形。

方法二:使用 CSS clip-path

clip-path 属性可以裁剪元素,从而创建各种形状,包括三角形。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Clip-Path Triangle</title>
    <style>
        .triangle-clip-path {
            width: 100px;
            height: 100px;
            background-color: purple;
            clip-path: polygon(50% 0%, 0% 100%, 100% 100%); /* 等腰三角形 */
        }
        .triangle-clip-path-right {
            width: 100px;
            height: 100px;
            background-color: pink;
            clip-path: polygon(0 0, 100% 50%, 0 100%); /* 直角三角形 */
        }
        .triangle-clip-path-left {
            width: 100px;
            height: 100px;
            background-color: lightgreen;
            clip-path: polygon(100% 0, 0 50%, 100% 100%); /* 直角三角形 */
        }
        .triangle-clip-path-top-left {
            width: 100px;
            height: 100px;
            background-color: lightblue;
            clip-path: polygon(0 0, 0 100%, 100% 0); /* 直角三角形 */
        }
        .triangle-clip-path-top-right {
            width: 100px;
            height: 100px;
            background-color: lightcoral;
            clip-path: polygon(100% 0, 100% 100%, 0 0); /* 直角三角形 */
        }
        .triangle-clip-path-bottom-left {
            width: 100px;
            height: 100px;
            background-color: lightsalmon;
            clip-path: polygon(0 100%, 0 0, 100% 100%); /* 直角三角形 */
        }
        .triangle-clip-path-bottom-right {
            width: 100px;
            height: 100px;
            background-color: lightseagreen;
            clip-path: polygon(100% 100%, 100% 0, 0 100%); /* 直角三角形 */
        }
    </style>
</head>
<body>
    <div class="triangle-clip-path"></div>
    <div class="triangle-clip-path-right"></div>
    <div class="triangle-clip-path-left"></div>
    <div class="triangle-clip-path-top-left"></div>
    <div class="triangle-clip-path-top-right"></div>
    <div class="triangle-clip-path-bottom-left"></div>
    <div class="triangle-clip-path-bottom-right"></div>
</body>
</html>

代码解释:

  • 原理: clip-path: polygon() 属性使用一系列坐标点来定义一个多边形,元素只显示多边形内部的部分。
  • .triangle-clip-path:
    • width: 100px; height: 100px;:设置元素的宽高。
    • background-color: purple;:设置背景颜色。
    • clip-path: polygon(50% 0%, 0% 100%, 100% 100%);:定义一个等腰三角形,三个顶点分别为 (50%, 0%), (0%, 100%), (100%, 100%)。
    • 结果:一个紫色的等腰三角形。
  • .triangle-clip-path-right:
    • clip-path: polygon(0 0, 100% 50%, 0 100%);:定义一个直角三角形,三个顶点分别为 (0, 0), (100%, 50%), (0, 100%)。
    • 结果:一个粉色的向右直角三角形。
  • .triangle-clip-path-left:
    • clip-path: polygon(100% 0, 0 50%, 100% 100%);:定义一个直角三角形,三个顶点分别为 (100%, 0), (0, 50%), (100%, 100%)。
    • 结果:一个浅绿色的向左直角三角形。
  • .triangle-clip-path-top-left:
    • clip-path: polygon(0 0, 0 100%, 100% 0);:定义一个直角三角形,三个顶点分别为 (0, 0), (0, 100%), (100%, 0)。
    • 结果:一个浅蓝色的指向左上角的直角三角形。
  • .triangle-clip-path-top-right:
    • clip-path: polygon(100% 0, 100% 100%, 0 0);:定义一个直角三角形,三个顶点分别为 (100%, 0), (100%, 100%), (0, 0)。
    • 结果:一个浅珊瑚色的指向右上角的直角三角形。
  • .triangle-clip-path-bottom-left:
    • clip-path: polygon(0 100%, 0 0, 100% 100%);:定义一个直角三角形,三个顶点分别为 (0, 100%), (0, 0), (100%, 100%)。
    • 结果:一个浅鲑鱼色的指向左下角的直角三角形。
  • .triangle-clip-path-bottom-right:
    • clip-path: polygon(100% 100%, 100% 0, 0 100%);:定义一个直角三角形,三个顶点分别为 (100%, 100%), (100%, 0), (0, 100%)。
    • 结果:一个浅海绿色的指向右下角的直角三角形。

方法三:使用 SVG

SVG (Scalable Vector Graphics) 是一种基于 XML 的矢量图形格式,可以用来创建各种复杂的图形,包括三角形。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SVG Triangle</title>
    <style>
        .svg-container {
            display: inline-block;
        }
    </style>
</head>
<body>
    <div class="svg-container">
        <svg width="100" height="100">
            <polygon points="50,0 0,100 100,100" fill="teal" />
        </svg>
    </div>
    <div class="svg-container">
        <svg width="100" height="100">
            <polygon points="0,0 100,50 0,100" fill="coral" />
        </svg>
    </div>
    <div class="svg-container">
        <svg width="100" height="100">
            <polygon points="100,0 0,50 100,100" fill="darkcyan" />
        </svg>
    </div>
    <div class="svg-container">
        <svg width="100" height="100">
            <polygon points="0,0 0,100 100,0" fill="darkgoldenrod" />
        </svg>
    </div>
    <div class="svg-container">
        <svg width="100" height="100">
            <polygon points="100,0 100,100 0,0" fill="darkkhaki" />
        </svg>
    </div>
    <div class="svg-container">
        <svg width="100" height="100">
            <polygon points="0,100 0,0 100,100" fill="darkmagenta" />
        </svg>
    </div>
    <div class="svg-container">
        <svg width="100" height="100">
            <polygon points="100,100 100,0 0,100" fill="darkolivegreen" />
        </svg>
    </div>
</body>
</html>

代码解释:

  • 原理: 使用 <svg> 标签创建一个 SVG 画布,然后使用 <polygon> 标签定义一个多边形,通过 points 属性指定多边形的顶点坐标。
  • <svg width="100" height="100">: 创建一个 100x100 的 SVG 画布。
  • <polygon points="50,0 0,100 100,100" fill="teal" />:
    • points="50,0 0,100 100,100":定义一个等腰三角形,三个顶点分别为 (50, 0), (0, 100), (100, 100)。
    • fill="teal":设置填充颜色为青色。
    • 结果:一个青色的等腰三角形。
  • 其他 <polygon> 标签:
    • 通过修改 points 属性,可以创建不同方向和形状的三角形。
    • 例如,points="0,0 100,50 0,100" 创建一个向右的直角三角形。

方法四:使用 Canvas

HTML5 Canvas 元素提供了一个基于像素的绘图 API,可以用来绘制各种图形,包括三角形。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas Triangle</title>
    <style>
        canvas {
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <canvas id="myCanvas" width="200" height="200"></canvas>
    <script>
        const canvas = document.getElementById('myCanvas');
        const ctx = canvas.getContext('2d');

        // 绘制一个等腰三角形
        ctx.beginPath();
        ctx.moveTo(100, 20);
        ctx.lineTo(20, 180);
        ctx.lineTo(180, 180);
        ctx.closePath();
        ctx.fillStyle = 'brown';
        ctx.fill();

        // 绘制一个直角三角形
        ctx.beginPath();
        ctx.moveTo(20, 20);
        ctx.lineTo(180, 20);
        ctx.lineTo(20, 180);
        ctx.closePath();
        ctx.fillStyle = 'darkred';
        ctx.fill();

        // 绘制一个直角三角形
        ctx.beginPath();
        ctx.moveTo(180, 20);
        ctx.lineTo(180, 180);
        ctx.lineTo(20, 180);
        ctx.closePath();
        ctx.fillStyle = 'darkblue';
        ctx.fill();

        // 绘制一个直角三角形
        ctx.beginPath();
        ctx.moveTo(20, 20);
        ctx.lineTo(180, 180);
        ctx.lineTo(20, 180);
        ctx.closePath();
        ctx.fillStyle = 'darkgreen';
        ctx.fill();

        // 绘制一个直角三角形
        ctx.beginPath();
        ctx.moveTo(180, 20);
        ctx.lineTo(20, 20);
        ctx.lineTo(180, 180);
        ctx.closePath();
        ctx.fillStyle = 'darkorange';
        ctx.fill();

        // 绘制一个直角三角形
        ctx.beginPath();
        ctx.moveTo(20, 180);
        ctx.lineTo(180, 20);
        ctx.lineTo(180, 180);
        ctx.closePath();
        ctx.fillStyle = 'darkviolet';
        ctx.fill();
    </script>
</body>
</html>

代码解释:

  • 原理: 使用 Canvas API 的 moveTo(), lineTo(), closePath(), fill() 等方法来绘制三角形。
  • const canvas = document.getElementById('myCanvas');: 获取 Canvas 元素。
  • const ctx = canvas.getContext('2d');: 获取 2D 渲染上下文。
  • ctx.beginPath();: 开始一个新的路径。
  • ctx.moveTo(100, 20);: 将画笔移动到 (100, 20) 坐标。
  • ctx.lineTo(20, 180);: 从当前位置绘制一条直线到 (20, 180) 坐标。
  • ctx.lineTo(180, 180);: 从当前位置绘制一条直线到 (180, 180) 坐标。
  • ctx.closePath();: 关闭路径,将最后一个点与第一个点连接起来。
  • ctx.fillStyle = 'brown';: 设置填充颜色为棕色。
  • ctx.fill();: 填充当前路径。
  • 其他三角形: 通过修改 moveTo()lineTo() 的坐标,可以绘制不同方向和形状的三角形。

总结:

以上四种方法都可以用来在前端生成三角形,每种方法都有其优缺点:

  • CSS 边框: 简单易用,适用于简单的三角形,但灵活性较低。
  • CSS clip-path: 灵活性较高,可以创建各种形状的三角形,但兼容性可能稍差。
  • SVG: 矢量图形,可以缩放而不失真,适用于复杂的图形,但代码量可能稍多。
  • Canvas: 基于像素的绘图,可以实现更复杂的图形和动画,但代码量较多,且不适合响应式布局。

选择哪种方法取决于你的具体需求和场景。对于简单的三角形,CSS 边框通常是最佳选择。对于更复杂的图形或需要缩放的图形,SVG 或 Canvas 可能更合适。