仅在内部或外部描边 SVG 路径

Stroke SVG Path only inside or only outside

考虑 2 html svg 路径,一个正方形 (class inside) 和一个具有相同高度的矩形 (class outside)。当我应用 stroke-width: 10px 时,笔划在内部应用 5px,在外部应用 5pxFiddle

如何只在内侧或外侧抚摸?

.inside { 
  stroke: #333;
  stroke-mode: inside;     // property does not exist
  stroke-width: 5px;
}

.outside {
   stroke: #333;
   stroke-mode: outside;   // property does not exist
   stroke-width: 5px;
}

如果没有这样的 属性,是否有解决方法来实现类似:

上面 @enxaneta 的评论完全正确。

通常情况下,如果填充的矩形 48px 宽且 strokestroke-width12px,则矩形将显示为:

  • 一个12px宽边框
  • 表观宽度 36px

为什么 36px 而不是 48px

因为沿矩形左侧绘制的 12px 宽笔触遮挡了矩形的 6px,而沿矩形右侧绘制的 12px 宽笔触矩形遮挡了矩形的 6px

查看此示例,其中 stroke 具有 50% 的不透明度 - 您可以看到 stroke 的一半与 fill 重叠:

svg rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgba(0, 0, 0, 0.5);
  stroke-width: 12px;
  fill: rgb(255, 0, 0);
}
<svg>
  <rect />
</svg>


创建12px外边框的解决方案:

要创建一个外边框,解决方法是然后然后[=168=绘制笔划] 在顶部绘制填充。

我们可以使用:

paint-order: stroke;

现在矩形将显示为:

  • 明显的 6px 宽边框(因为 12px 宽边框的一半宽度被 fill 遮盖在顶部)
  • 宽度为 48px

svg rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgba(0, 0, 0, 0.5);
  stroke-width: 12px;
  fill: rgb(255, 0, 0);
  paint-order: stroke;
}
<svg>
  <rect />
</svg>

最后,要确保矩形显示:

  • 一个12px宽边框
  • 宽度为 48px

stroke-width12px 更改为 24px(即,将预期的显示宽度加倍):

svg rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgb(0, 0, 0);
  stroke-width: 24px;      /* double the intended display width */
  fill: rgb(255, 0, 0);
  paint-order: stroke;
}
<svg>
  <rect />
</svg>


创建 12px 内边框的解决方案:

要创建一个内边框,我们需要三个步骤而不是两个。

前两步很简单:

  • 两倍 stroke-width(与外边框一样)
  • 使用paint-order: fill(而不是paint-order: stroke

svg rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgba(0, 0, 0, 0.5);
  stroke-width: 24px;      /* double the intended display width */
  fill: rgb(255, 0, 0);
  paint-order: fill;
}
<svg>
  <rect />
</svg>

第三步 是定义和应用一个 <clipPath> ,它完全复制了具有 内边框 [=168= 的形状].

例如,如果形状是:

<rect width="200" height="100" />

那么<clipPath>应该是:

<clipPath id="my-clip-path">
  <rect width="200" height="100" /> <!-- Same as the shape -->
</clipPath>

工作示例:

#my-rect {
  stroke: rgb(0, 0, 0);
  stroke-width: 24px;
  fill: rgb(255, 0, 0);
  paint-order: fill;
  clip-path: url(#my-clip-path);
}

#my-rect,
#my-clip-path-rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
}
<svg>
  <defs>
    <clipPath id="my-clip-path">
      <rect id="my-clip-path-rect" />
    </clipPath>
  </defs>
  
  <rect id="my-rect" />
</svg>


所有矩形加在一起:

svg {
  display: block;
  float: left;
  width: 220px;
  margin-left: 12px;
}

svg:nth-of-type(1) rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgba(0, 0, 0, 0.5);
  stroke-width: 12px;
  fill: rgb(255, 0, 0);
}

svg:nth-of-type(2) rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgba(0, 0, 0, 0.5);
  stroke-width: 24px;
  fill: rgb(255, 0, 0);
}

svg:nth-of-type(3) rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgb(0, 0, 0);
  stroke-width: 24px;
  fill: rgb(255, 0, 0);
  paint-order: stroke;
}

#svg3clip {
  width: 200px;
  height: 100px;
}

svg:nth-of-type(4) rect {
  x: 10px;
  y: 10px;
  width: 200px;
  height: 100px;
  stroke: rgb(0, 0, 0);
  stroke-width: 24px;
  fill: rgb(255, 0, 0);
  paint-order: fill;
  clip-path: url(#svg3clip);
}
<svg>
  <rect />
</svg>

<svg>
  <rect />
</svg>

<svg>
  <defs>
    <clipPath id="svg3clip">
      <rect />
    </clipPath>
  </defs>
  
  <rect />
</svg>

<svg>
  <rect />
</svg>


进一步阅读: