shape-rendering

CSS

在浏览器渲染 SVG 的时候,可以通过 shape-rendering 这一属性,来控制浏览器对 SVG 抗锯齿效果的展示。shape-rendering 支持从三个纬度来权衡 SVG 的渲染效果,这三个纬度分别是:速度、曲线精细度以及曲线的锐利程度。

  • auto,这个是默认值,表示由浏览器来决定改如何显示
  • optimizeSpeed,顾名思义,这个要求浏览器以渲染的速度优先,抗锯齿可能会被浏览器关闭
  • crispEdges,这个选项要求浏览器以曲线的锐利程度为第一优先级。这种情况下,速度和精细度的优先级会被降低。浏览器可能会关闭抗锯齿,或者只针对接近垂直和水平的线才开启抗锯齿的功能。同时,浏览器可能会微调线的位置和宽度,以适应显示器的物理像素点
  • geometricPrecision,这个选项要求浏览器以更好的精度来渲染图像,为此可能会牺牲渲染的性能(速度)和边界的清晰度

下图从左到右分别展示了 geometricPrecisioncrispEdgesoptimizeSpeed 三种情况下,同一个圆的显示效果。

不难看出,geometricPrecision 的效果是最平滑的,但是边缘清晰度不足;crispEdges 边缘很锐利,但是有一些毛边(越是低分辨率的屏幕,效果越明显);optimizeSpeed 的显示效果也明显有毛边,不过效果和 crispEdges 略微不同,可以看得出底层使用的算法是不太一样的。

上图的 HTML 代码如下:

<svg viewBox="0 0 640 200" xmlns="http://www.w3.org/2000/svg" width="740">
  <circle
    cx="100"
    cy="100"
    r="100"
    shape-rendering="geometricPrecision"
    fill="#ff8787"
  />
  <circle
    cx="100"
    cy="100"
    r="100"
    shape-rendering="crispEdges"
    fill="#da77f2"
  />
  <circle
    cx="100"
    cy="100"
    r="100"
    shape-rendering="optimizeSpeed"
    fill="#748ffc"
  />
</svg>

另外,除了在 SVG 中直接写属性之外,也可以通过 CSS 来给 SVG 加上相关的 shape-rendering 值:

svg {
  shape-rendering: geometricPrecision;
}

MDN 的相关介绍见这里