仅在内部或外部描边 SVG 路径
Stroke SVG Path only inside or only outside
考虑 2 html svg 路径,一个正方形 (class inside
) 和一个具有相同高度的矩形 (class outside
)。当我应用 stroke-width: 10px
时,笔划在内部应用 5px
,在外部应用 5px
。 Fiddle
如何只在内侧或外侧抚摸?
.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
宽且 stroke
且 stroke-width
为 12px
,则矩形将显示为:
- 一个
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-width
从 12px
更改为 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>
进一步阅读:
考虑 2 html svg 路径,一个正方形 (class inside
) 和一个具有相同高度的矩形 (class outside
)。当我应用 stroke-width: 10px
时,笔划在内部应用 5px
,在外部应用 5px
。 Fiddle
如何只在内侧或外侧抚摸?
.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
宽且 stroke
且 stroke-width
为 12px
,则矩形将显示为:
- 一个
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-width
从 12px
更改为 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>
进一步阅读: