SVG 样例解析

2025-07-01
标签: SVG
SVG demonstration Mozilla CSS Getting Started - SVG demonstration SVG demonstration 把鼠标放在花瓣上看看效果

生成逻辑

坐标系与画布

SVG 的 viewBox="-300 -300 600 600" 将坐标原点移到画布中心,整个花朵以 (0,0) 为圆心向外绘制。

整体层次结构

花朵 #flower 由三层叠加而成:

#flower
├── #outer-petals     外层20片花瓣
├── #inner-petals     内层20片花瓣(旋转9°,缩放0.33)
└── #overlay          径向渐变蒙层(压在最上面)

单片花瓣的构成

每片花瓣是一个 <g class="segment">,由两个 path 叠加:

填充路径 .segment-fill

d="M0,0 v-200 a40,40 0 0,0 -62,10 z"
  • M0,0:从圆心出发
  • v-200:向上画竖线到 (0,-200),即花瓣的主干轴
  • a40,40 0 0,0 -62,10:画一段圆弧,rx=ry=40,逆时针(sweep=0),终点偏移 (-62,10),即到达 (-62,-190),这段弧形成花瓣的弯曲外缘
  • z:闭合回原点,形成扇形花瓣面

边缘路径 .segment-edge

d="M0,-200 a40,40 0 0,0 -62,10"

与 segment-fill 中的圆弧完全重合,单独绘制以便用更粗的描边(stroke-width:3/9)突出花瓣轮廓,无填充。

20片花瓣的排列

花瓣每隔 18° 旋转一次(360°/20片=18°),分4个 .quadrant 组,每组5片,旋转角度从 0° 到 342°。旋转变换作用在 <g class="segment"> 上,以坐标原点为中心旋转,使所有花瓣均匀分布一圈。

内外两层的差异

  外层 #outer-petals 内层 #inner-petals
尺寸 原始大小(半径约200) scale(0.33) 缩到约1/3
旋转偏移 rotate(9°),正好错位在外层花瓣之间
颜色 azure / deepskyblue yellow / yellowgreen
hover 颜色 plum / slateblue darkseagreen / green
透明度 opacity: 0.75 默认 1.0

径向渐变蒙层

<defs> 中定义了 <radialGradient id="fade">,圆心在 (0,0),半径200,渐变从33%处的蓝色过渡到95%处的白色。一个半径200的圆 #overlay 引用此渐变 fill="url(#fade)",覆盖在所有花瓣之上,制造出花朵中央深蓝、边缘淡白的光晕效果。

CSS 交互样式

用 CSS 变量(var(--xxx))统一配置内外层的颜色,:hover 伪类实现鼠标悬停变色。同时保留了兼容旧浏览器的直接 class 样式写法(注释中说明这是非标准的旧方式)。

参考链接

SVG: Scalable Vector Graphics

Scalable Vector Graphics (SVG) 2