【发布时间】:2021-02-10 19:03:48
【问题描述】:
我们的目标是制作一个 SVG 形状,它的容器垂直大小,但在顶部和底部边缘具有像素完美的多边形。看起来像这样的东西:
无论容器在垂直方向上有多大,顶部和底部的三角形都应保持相同大小(8 像素高)。从概念上讲,我想要的是一个 100% 高的实心矩形,以及用于切掉 4 个角的白色小三角形。理想情况下是这样的:
<div style="position:relative;padding-left:20px;width:200px;border:1px solid black;">
<svg style="position:absolute;top:0;left:0;height:100%;width:16px;">
<rect x="0" y="0" width="16" height="100%" style="fill:green"/>
<polygon points="0,0 8,0 0,8" style="fill:white"/>
<polygon points="8,0 16,0 16,8" style="fill:white"/>
<polygon points="0,0 8,0 0,-8" style="fill:white" transform="translate(0, 100%)"/>
<polygon points="8,0 16,0 16,-8" style="fill:white" transform="translate(0, 100%)"/>
</svg>
This is the<br>div content<br>of some random<br>vertical size.
</div>
但这当然行不通,因为您不能在 translate() 中使用百分比值。显而易见的解决方案是一个 100 单位高的 viewBox:
<div style="position:relative;padding-left:20px;width:200px;border:1px solid black;">
<svg style="position:absolute;top:0;left:0;height:100%;width:16px;" viewBox="0 0 16 100" preserveAspectRatio="none">
<rect x="0" y="0" width="16" height="100%" style="fill:green"/>
<polygon points="0,0 8,0 0,8" style="fill:white"/>
<polygon points="8,0 16,0 16,8" style="fill:white"/>
<polygon points="0,0 8,0 0,-8" style="fill:white" transform="translate(0, 100)"/>
<polygon points="8,0 16,0 16,-8" style="fill:white" transform="translate(0, 100)"/>
</svg>
This is the<br>div content<br>of some random<br><br><br><br><br><br><br><br><br>vertical size.
</div>
结果是正常的,但现在所有的多边形点都被垂直缩放,导致容器变大时顶部和底部的三角形会拉伸:
如何让顶部/底部三角形多边形保持(准确)8 像素高,同时允许整体尺寸垂直拉伸?如果有一种方法可以在没有 viewBox 的情况下转换到底部边缘(保留浏览器的像素单位),那么第一个代码 sn-p 就可以了。
【问题讨论】:
-
每次容器使用 javascript 拉伸时,您都需要重新计算多边形
标签: svg