如何在 SVG 中绘制带角的矩形
How to draw a rectangle with an angled corner in SVG
我正在使用来自内联 SVG 的剪辑路径来屏蔽网站上具有不同纵横比的图像。遮罩应以固定角度 (-15deg) 隐藏右下角。
我无法实现右角始终保持一定角度,与蒙版图像的纵横比无关。
我当前的 SVG 如下所示:
<svg height="0" width="0" viewBox="0 0 1 1" preserveAspectRatio="none">
<defs>
<clipPath id="clipRight" clipPathUnits="objectBoundingBox">
<rect x=0 y=0 width=1 height=0.5 />
<rect x=0 y=0.5 width=1 height=0.5 transform="skewX(-15)" />
</clipPath>
</defs>
</svg>
并且 css 代码如下所示:
.img-clip-right {
clip-path: url(#clipRight);
}
剪辑路径应如下所示
我有一种方法可以在不知道确切的图像尺寸和不使用 javascript 的情况下,以特定角度与 svg canvas 的底端画一条线?
你可以用数学计算出每个三角形的边长,用<path />
代替<rect />
来搭建一个五边形。
但在你的问题中,你没有指定白色三角形的大小,即使使用相同的一组角度(在你的情况下为 15-90-75),它也可以是任何大小,并且只是缩放。如果你有任何三角形边的特定尺寸,那将是一个明确的任务。
我不太明白为什么需要 SVG 和遮罩。
此代码段仅将剪辑路径应用于图像。
无论图像的大小或宽高比如何,它都会在同一区域的 15 度角处切角,因为问题中没有指定要切掉的量:
.clipped {
--x: 100px;
--tan15: 0.267949192;
--y: calc(var(--tan15) * var(--x));
clip-path: polygon(0 0, 100% 0, 100% calc(100% - var(--y)), calc(100% - var(--x)) 100%, 0 100%);
}
<img class="clipped" src="https://picsum.photos/id/1015/200/300">
<img class="clipped" src="https://picsum.photos/id/1015/300/300">
<img class="clipped" src="https://picsum.photos/id/1015/300/200">
我喜欢将 SVG 用于剪辑路径的想法,但在这种情况下,也许更简单的解决方案就可以了。 polygon() 函数呢?以下是三个示例:
body {
display: flex;
}
div {
margin: 2px;
}
div:nth-child(1) {
background: CornflowerBlue;
width: 200px;
height: 200px;
clip-path: polygon(0 0, 100% 0, 100% 80%, 80% 100%, 0 100%);
}
div:nth-child(2) {
background: Peru;
width: 200px;
height: 200px;
clip-path: polygon(0 0, 100% 0, 100% 160px, 160px 100%, 0 100%);
}
div:nth-child(3) {
background: DarkSeaGreen;
width: 200px;
height: 300px;
clip-path: polygon(0 0, 100% 0, 100% calc(100% - 40px), calc(100% - 40px) 100%, 0 100%);
}
<div></div>
<div></div>
<div></div>
我正在使用来自内联 SVG 的剪辑路径来屏蔽网站上具有不同纵横比的图像。遮罩应以固定角度 (-15deg) 隐藏右下角。
我无法实现右角始终保持一定角度,与蒙版图像的纵横比无关。
我当前的 SVG 如下所示:
<svg height="0" width="0" viewBox="0 0 1 1" preserveAspectRatio="none">
<defs>
<clipPath id="clipRight" clipPathUnits="objectBoundingBox">
<rect x=0 y=0 width=1 height=0.5 />
<rect x=0 y=0.5 width=1 height=0.5 transform="skewX(-15)" />
</clipPath>
</defs>
</svg>
并且 css 代码如下所示:
.img-clip-right {
clip-path: url(#clipRight);
}
剪辑路径应如下所示
我有一种方法可以在不知道确切的图像尺寸和不使用 javascript 的情况下,以特定角度与 svg canvas 的底端画一条线?
你可以用数学计算出每个三角形的边长,用<path />
代替<rect />
来搭建一个五边形。
但在你的问题中,你没有指定白色三角形的大小,即使使用相同的一组角度(在你的情况下为 15-90-75),它也可以是任何大小,并且只是缩放。如果你有任何三角形边的特定尺寸,那将是一个明确的任务。
我不太明白为什么需要 SVG 和遮罩。
此代码段仅将剪辑路径应用于图像。
无论图像的大小或宽高比如何,它都会在同一区域的 15 度角处切角,因为问题中没有指定要切掉的量:
.clipped {
--x: 100px;
--tan15: 0.267949192;
--y: calc(var(--tan15) * var(--x));
clip-path: polygon(0 0, 100% 0, 100% calc(100% - var(--y)), calc(100% - var(--x)) 100%, 0 100%);
}
<img class="clipped" src="https://picsum.photos/id/1015/200/300">
<img class="clipped" src="https://picsum.photos/id/1015/300/300">
<img class="clipped" src="https://picsum.photos/id/1015/300/200">
我喜欢将 SVG 用于剪辑路径的想法,但在这种情况下,也许更简单的解决方案就可以了。 polygon() 函数呢?以下是三个示例:
body {
display: flex;
}
div {
margin: 2px;
}
div:nth-child(1) {
background: CornflowerBlue;
width: 200px;
height: 200px;
clip-path: polygon(0 0, 100% 0, 100% 80%, 80% 100%, 0 100%);
}
div:nth-child(2) {
background: Peru;
width: 200px;
height: 200px;
clip-path: polygon(0 0, 100% 0, 100% 160px, 160px 100%, 0 100%);
}
div:nth-child(3) {
background: DarkSeaGreen;
width: 200px;
height: 300px;
clip-path: polygon(0 0, 100% 0, 100% calc(100% - 40px), calc(100% - 40px) 100%, 0 100%);
}
<div></div>
<div></div>
<div></div>