有没有办法让squircle的边框、阴影或内部发光也符合方形?
houdini可以通过CSS paintWorklet
创建一个squircle,但这非常poor support from browsers,使用率只有71.35%(2023),可能是因为security vulnerabilities关于油漆工作。
其他替代方案包括using an SVG <clipPath>
with the squircle shape,但添加方形边框必须使用原始剪辑路径重新绘制,这使得转换变得困难。在缩放元素时,需要重新渲染笔划路径和剪辑路径。元素的CSS属性需要转换为路径数据。
<svg xmlns="http://www.w3.org/2000/svg" width="220" height="220" viewBox="-10 -10 220 220">
<defs>
<clipPath id="squircle-clip">
<path d="M20,0
L180,0
Q200,0 200,20
L200,180
Q200,200 180,200
L20,200
Q0,200 0,180
L0,20
Q0,0 20,0"
style="vector-effect: non-scaling-stroke;"
/>
</clipPath>
</defs>
<rect x="0" y="0" width="200" height="200" fill="#222" clip-path="url(#squircle-clip)"
/>
<path d="M20,0
L180,0
Q200,0 200,20
L200,180
Q200,200 180,200
L20,200
Q0,200 0,180
L0,20
Q0,0 20,0"
fill="none" stroke="#484848" stroke-width="2" style="vector-effect: non-scaling-stroke;"
/>
</svg>
是否有其他方法来创建一个带边框的方形?Houdini是一个很难选择的解决方案,因为它只有约71%的用户,并且不支持Safari(iOS和macOS)或Firefox。
2条答案
按热度按时间m4pnthwp1#
裁剪路径(以及蒙版)将裁剪笔划和滤镜
如果你不需要任何笔触或滤镜/效果,比如dropshadow,使用clip-paths效果很好。
如果你的最终目标是创建一个类似iOS的图标svg可能是你最好的选择:
上面的squircle是用我创建的一个简单的助手生成的:
codepen "Squircle generator (clothoid rounded corners)"
如果你需要动态创建一个squircle(例如在绘图应用程序中),你可以将svg
<rect>
与动态更新的<path>
元素同步:同步的
<path>
在调整大小时动态更新您可以创建一个
<path>
作为圆形<rect>
元素的“克隆”,共享其宽度,高度和其他属性。rect是隐藏的,但会响应转换。
转换rect后,
<path>
d属性将根据当前rect维度重新计算。计算伪回旋曲线圆角
基于矩形初始
rx
边界半径属性,我们可以计算二次或三次曲线段,如下所示:较高的
rC
将增加初始边界半径,以获得更平滑的曲线。三次贝济耶允许对曲率进行更多控制。
较高的
tension
值将控制点“拉”到角落,从而导致视觉上较小的边界半径。与基于添加圆弧的默认边界半径方法相比,这两个选项(二次和三次)都将在直线和曲线之间生成更平滑的过渡。
CSS方法:使用CSS clip-path Package squircle
你也可以使用css的squircle生成器,比如"CSS Clothoid Corners"。
此剪辑路径实际上是一个多边形近似。
我们需要将squircle Package 在一个相对定位的父div中。
这个 Package 器引入了一个伪元素-使用相同的clip-path进行裁剪。
伪元素具有将导致最终伪笔划颜色的背景颜色。
笔划宽度由应用于 Package 元素的填充来定义。
6kkfgxo02#
我没有得到你的观点100%,但我试着按照我的理解。请检查我的代码。