chatgpt 使用 svg 绘制魔法阵

使用 SVG 绘制魔法阵

本文包含 15 个循序渐进的 SVG 示例,从三个同心圆开始,逐步加入几何骨架、元素复用、主题颜色、渐变、发光和动画,最终完成一个会漂移、浮现并归位的魔法阵。

所有示例都使用原生 SVG,不依赖图片、框架或第三方动画库。可以直接用浏览器打开,也可以嵌入 HTML。

为什么使用 SVG

SVG 很适合绘制魔法阵,因为它具有以下特点:

  • 图形可以任意缩放,不会失真。
  • 圆、线、多边形和路径适合构造规则几何图案。
  • 相同元素可以定义一次,再旋转复用。
  • 颜色、透明度和线宽可以通过 CSS 统一控制。
  • 支持渐变、滤镜、文字路径和动画。
  • 每个图层都可以单独移动、旋转、显现或隐藏。

魔法阵看起来复杂,但通常只是少量基础图形经过同心排列、旋转复制和分层叠加后的结果。

基础结构

一个常见的魔法阵可以分成四层:

  1. 外环:确定整体边界,放置刻度、符号或文字。
  2. 几何层:使用三角形、六芒星或多边形建立主体结构。
  3. 能量层:使用虚线、渐变和光晕增强空间感。
  4. 核心:用小圆、渐变或脉动动画形成视觉焦点。

基础画布通常将坐标原点放在中心:

<svg width="600" height="600" viewBox="-300 -300 600 600">

这样所有圆都可以直接使用 cx="0"cy="0",旋转也会自然围绕中心进行。

常用 SVG 能力

元素或属性用途
<circle>同心圆、节点和能量核心
<polygon>三角形、六芒星和规则几何骨架
<path>自定义轮廓、符文路径和复杂连线
<g>将外环、内环和核心组织为独立图层
<defs>保存可复用图形、渐变、滤镜和文字路径
<use>重复刻度、光点和符号
transform平移、旋转和缩放图层
currentColor使用 CSS 统一控制描边和填充颜色
stroke-dasharray制作虚线,也可隐藏整条路径
stroke-dashoffset推动虚线或实现路径逐渐绘制
pathLength将不同路径的长度统一为便于控制的数值
<linearGradient>制作沿某个方向变化的颜色
<radialGradient>制作由中心向外扩散的能量光核
<filter>制作模糊、发光和阴影
<textPath>让文字沿圆形路径排列

15 个演进步骤

Step 01:基础圆阵

文件:step-01.svg

使用 <rect> 绘制深色背景,再用三个 <circle> 建立外环、中环和核心区域。这一步主要理解 viewBox、中心坐标和同心圆。

Step 01 基础圆阵

Step 02:几何骨架

文件:step-02.svg

加入两个方向相反的三角形,组成六芒星。重点是使用 <polygon> 的顶点坐标构造对称图形。

Step 02 几何骨架

Step 03:径向重复

文件:step-03.svg

<defs> 中定义一个刻度和一个节点,再通过 <use>rotate() 围绕中心复制。复杂感开始由重复而不是大量手写代码产生。

Step 03 径向重复

Step 04:图层分组

文件:step-04.svg

使用 <g> 将图形拆成外环、中环和核心。分组之后,可以给每一层独立设置样式、变换和动画。

Step 04 图层分组

Step 05:主题换色

文件:step-05.svg

使用 CSS 变量控制主色和背景色,并提供火焰、寒冰和奥术主题。修改根元素上的类名即可切换整体配色。

<svg class="magic fire">

可将 fire 改为 icearcane

Step 05 主题换色

Step 06:线条层次

文件:step-06.svg

通过线宽、透明度、虚线和圆形线帽区分不同结构。即使不增加新图形,也能让魔法阵产生更丰富的层次。

Step 06 线条层次

Step 07:渐变核心

文件:step-07.svg

使用线性渐变改变轮廓颜色,使用径向渐变制作从中心向外消散的能量核心。

Step 07 渐变核心

Step 08:霓虹发光

文件:step-08.svg

使用 <feGaussianBlur> 模糊轮廓,再通过 <feMerge> 将模糊层和清晰原图合并,形成霓虹光晕。

Step 08 霓虹发光

Step 09:整体旋转

文件:step-09.svg

使用 <animateTransform> 让整个法阵围绕中心旋转。这是最基础的 SVG 原生动画。

Step 09 整体旋转

Step 10:分层反向旋转

文件:step-10.svg

外环、中间几何层和核心使用不同速度与方向旋转。相对运动让结构看起来更精密,但每一层仍然只是独立的 <g>

Step 10 分层反向旋转

Step 11:呼吸与闪烁

文件:step-11.svg

通过半径、透明度和颜色变化,让核心产生周期性呼吸效果。这一步展示同一个元素可以同时动画多个属性。

Step 11 呼吸与闪烁

Step 12:路径流光

文件:step-12.svg

使用 stroke-dasharray 将描边切分,再改变 stroke-dashoffset,形成能量沿路径流动的效果。

Step 12 路径流光

Step 13:符文圆环

文件:step-13.svg

<defs> 中定义圆形路径,并通过 <textPath> 让文字沿圆周排列。替换文字内容即可制作符文、咒语或装饰环。

Step 13 符文圆环

Step 14:交互式漂移浮现

文件:step-14.svg

图层从不同方向漂移到中心,同时描边由无到有逐渐绘制。动画完成后保持静止。

  • 单击法阵:切换颜色主题。
  • 双击法阵:重新播放动画。

这里通过 pathLength="1" 统一路径长度,再将描边从完全偏移变为零:

.trace {
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
}

@keyframes draw {
  to { stroke-dashoffset: 0; }
}

Step 14 交互式漂移浮现

Step 15:完整漂移归位

文件:step-15.svg

最终版本整合了图形复用、颜色变量、滤镜、符文和组合动画。

开场时,各图层具有不同的平移、旋转和缩放状态。它们在移动过程中同步绘制轮廓、增强透明度,最后精确回到中心,组成完整且静止的魔法阵。

最终效果不是持续打散或循环旋转,而是一次完整的形成过程:

  1. 图层从不同方向漂移而来。
  2. 圆环与星形沿路径逐渐浮现。
  3. 刻度、符文和核心延迟出现。
  4. 所有结构回到准确位置。
  5. 动画停止,保留完整魔法阵。

Step 15 完整漂移归位

漂移与浮现的实现

漂移归位由 transform 动画完成:

.outer {
  --start: translate(-90px, -65px) rotate(-28deg) scale(.82);
}

@keyframes settle {
  0% {
    opacity: 0;
    transform: var(--start);
  }
  100% {
    opacity: 1;
    transform: translate(0, 0) rotate(0) scale(1);
  }
}

路径浮现由描边动画完成:

.trace {
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
  animation: draw 3.6s ease-out forwards;
}

@keyframes draw {
  to { stroke-dashoffset: 0; }
}

同一个元素可以同时播放 settledraw,因此它会一边移动,一边逐渐形成。

修改最终版本

修改颜色

编辑 step-15.svg 顶部的 CSS 变量:

.magic-circle {
  --magic: #67e8f9;
  --accent: #c084fc;
  --bg: #030712;
}

修改动画速度

调整 .arrive.traceanimation-duration。持续时间越长,聚合和浮现过程越缓慢。

修改漂移方向

每个图层都有独立的 --start

--start: translate(75px, -35px) rotate(22deg) scale(1.12);

改变 translate 控制初始位置,改变 rotate 控制初始角度,改变 scale 控制初始大小。

修改光晕

调整滤镜中的 stdDeviation

<feGaussianBlur stdDeviation="5"/>

数值越大,光晕越宽、越柔和,但图形边缘也会显得更模糊。