仅在svg <rect>的一侧有圆角

Dha*_*nya 16 html svg css3

我正在尝试实现类似图表的条形图.我有以下html元素

<rect x="35" y="-135" width="10" height="51" style="stroke: rgb(255, 255, 255); opacity: 0.8; fill: rgb(255, 122, 0);"></rect>
Run Code Online (Sandbox Code Playgroud)

我想给矩形的顶角一个圆角形状.这怎么可能?
我无法应用border-radius属性.

小智 10

写了一篇文章解释这个https://medium.com/@dphilip/one-side-rounded-rectangle-using-svg-fb31cf318d90

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
  <path
    d="M10,40
       h50
       q5,0 5,5
       v10
       q0,5 -5,5
       h-50
       z
    "
    fill="#4EDFA5"
  >
<svg>
Run Code Online (Sandbox Code Playgroud)


web*_*iki 9

正如Robert Longson所评论的那样,您需要将rect元素转换为路径元素以控制圆角.

在下面的示例中,我使用带有命令的三次贝塞尔曲线Q来制作左上角的圆角(Q1 1 5 1d属性中):

svg{
  height:90vh;
  width:auto;
  }
Run Code Online (Sandbox Code Playgroud)
<svg viewbox="0 0 10 50">
  <path d="M1 49 V5 Q1 1 5 1 H9 V49z"
        fill="rgba(255, 122, 0, 0.8)" />
</svg>
Run Code Online (Sandbox Code Playgroud)

  • 使用贝塞尔曲线是不正确的。贝塞尔曲线只能逼近一个圆。您需要使用 `arc` 命令:http://devdocs.io/svg/attribute/d#arcto (3认同)
  • 从网站显示(光栅渲染)的实际角度来看,贝塞尔曲线可以绘制像素完美的圆,因为它是在有限的分辨率下光栅化的。理论数学对于本次对话并不重要,因为它在这种情况下不适用于现实生活场景。选择真正重要的教条战斗。 (3认同)
  • @adius 我从数学的角度理解你的观点,但我认为你看不出用贝塞尔曲线和使用 arc 命令制作的圆的输出有什么不同。顺便提一下,OP 不是试图制作一个圆,而是用一条曲线连接两条线,因此在这种情况下使用贝塞尔曲线命令是合适的。 (2认同)
  • 好吧,你是对的,OP 只要求圆角,所以使用贝塞尔曲线本身并不是不正确的,因为它会产生“圆角”。但是你应该用你的语言更精确,因为“贝塞尔曲线可以做圆圈”是完全错误的。 (2认同)

adi*_*ius 7

<path>元素与arc命令 ( http://devdocs.io/svg/attribute/d#arcto ) 一起使用。

句法: a rx,ry x-axis-rotation large-arc-flag sweep-flag dx,dy

<svg width="200" height="200" viewBox="0 0 10 10">
  <path d="M0,8 v-3 a5,5 0 0 1 5,-5 h3 v8 z" />
</svg>
Run Code Online (Sandbox Code Playgroud)


bor*_*Blu 5

您也可以使用clipPath。这是一种hack,但是可能更容易实现。

假设如下:

  • 你的直肠是 width="10" height="51"
  • 顶角将是rx="5"ry="5"

<svg>
        <defs>
            <clipPath id="round-corner">
                <rect x="0" y="0" width="10" height="56" rx="5" ry="5"/>
            </clipPath>
        </defs>

        <!-- if you want to use x="35" y="-135" put clip-path on a `g` element --> 
        <rect width="10" 
              height="51" 
              clip-path="url(#round-corner)"
              style="stroke: rgb(255, 255, 255); opacity: 0.8; fill: rgb(255, 122, 0);"></rect>
    </svg>
Run Code Online (Sandbox Code Playgroud)

注意事项:
因此,与clipPath > rect > width完全相同rect

相反,clipPath > rect > height您必须考虑顶部的拐角半径,因此高度应为rect.height+ desired-corner-radius(在这种情况下为51px + 5px)。

这样,您就不会用触碰矩形的底部clipPath

  • 小提示:我将此代码用于具有不同长度的多个矩形“&lt;rect&gt;”。舍入并不总是正常工作。Ofc 发现 `id="round-corner"` 是一个全局标识符。因此,我必须将其调整为“id={"round-corner" + uniqueIdentifier}”之类的内容,以使解决方案适用于多个矩形。也许这对某人有帮助。 (2认同)