104

私は次のSVGを持っています:

<svg>
  <g>
    <path id="k9ffd8001" d="M64.5 45.5 82.5 45.5 82.5 64.5 64.5 64.5 z" stroke="#808600" stroke-width="0" transform="rotate(0 0 0)" stroke-linecap="square" stroke-linejoin="round" fill-opacity="1" stroke-opacity="1" fill="#a0a700"></path>
    <path id="kb8000001" d="M64.5 45.5 82.5 45.5 82.5 64.5 64.5 64.5 z" stroke="#808600" stroke-width="0" transform="rotate(0 0 0)" stroke-linecap="square" stroke-linejoin="round" fill-opacity="1" stroke-opacity="1" fill="url(#k9ffb0001)"></path>
  </g>
</svg>

border-top-right-radiusCSSのようなborder-top-bottom-radius効果を出したいです。

どうすればその丸みを帯びたコーナー効果を実現できますか?

4

15 に答える 15

65

誰も実際の SVG 回答を投稿しなかった理由がわかりません。これは、上部に角が丸い (半径 3) の SVG 長方形です。

<path d="M0,0 L0,27 A3,3 0 0,0 3,30 L7,30 A3,3 0 0,0 10,27 L10,0 Z" />

Move To (M)、Line To (L)、Arc To (A)、Line To (L)、Arc To (A)、Line To (L)、Close Path (Z) です。

コンマ区切りの数字は絶対座標です。円弧は、円弧の半径とタイプを指定する追加のパラメーターで定義されます。これは、相対座標でも実現できます (L と A には小文字を使用します)。

これらのコマンドの完全なリファレンスは、W3C SVG パスページにあり、SVG パスに関する追加の参考資料は、この記事にあります。

于 2015-09-30T20:46:17.777 に答える
46

You have explicitly set your stroke-linejoin to round but your stroke-width to 0, so of course you're not going to see rounded corners if you have no stroke to round.

Here's a modified example with rounded corners made through strokes:
http://jsfiddle.net/8uxqK/1/

<path d="M64.5 45.5 82.5 45.5 82.5 64.5 64.5 64.5 z"
      stroke-width="5"
      stroke-linejoin="round"
      stroke="#808600"
      fill="#a0a700" />

Otherwise—if you need an actual rounded shape fill and not just a rounded fatty stroke—you must do what @Jlange says and make an actual rounded shape.

于 2012-04-17T03:08:37.457 に答える
44

また、属性と属性<rect>を提供する単純な古いものを使用することも検討しますrxry

MDN SVG ドキュメント<- 2 番目に描画された rect 要素に注意してください

于 2014-09-01T06:42:50.213 に答える
5

この質問は、グーグル「svg rounded corners path」の最初の結果です。使用する Phrogz の提案にstrokeはいくつかの制限があります (つまり、ストロークを他の目的に使用することはできず、ストロークの幅に合わせて寸法を修正する必要があります)。

曲線を使用するという Jlange の提案は優れていますが、あまり具体的ではありません。丸みを帯びた角を描くために二次ベジエ曲線を使用することになりました。隣接するエッジに青い点と 2 つの赤い点でマークされたコーナーのこの図を検討してください。

隣接するエッジに 2 つの点がある青色でマークされた図形の角

この 2 行は、コマンドで作成できますL。この鋭い角を丸い角に変えるには、左の赤い点から曲線を描き始めます ( を使用M x,yしてその点に移動します)。二次ベジエ曲線には、青い点に設定する必要がある制御点が 1 つだけあります。曲線の終点を右の赤い点に設定します。2 つの赤い点での接線は前の線の方向にあるため、滑らかな遷移、「丸みを帯びた角」が表示されます。

丸みを帯びた角の後の形状を継続するには、2 つの角の間の線上に制御点を設定することで、ベジエ曲線の直線を実現できます。

パスの決定を支援するために、エッジと半径を受け入れるこの Python スクリプトを作成しました。ベクトル演算により、これは実際には非常に簡単になります。出力から得られた画像:

スクリプト出力から作成された形状

#!/usr/bin/env python
# Given some vectors and a border-radius, output a SVG path with rounded
# corners.
#
# Copyright (C) Peter Wu <peter@lekensteyn.nl>

from math import sqrt

class Vector(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def sub(self, vec):
        return Vector(self.x - vec.x, self.y - vec.y)

    def add(self, vec):
        return Vector(self.x + vec.x, self.y + vec.y)

    def scale(self, n):
        return Vector(self.x * n, self.y * n)

    def length(self):
        return sqrt(self.x**2 + self.y**2)

    def normal(self):
        length = self.length()
        return Vector(self.x / length, self.y / length)

    def __str__(self):
        x = round(self.x, 2)
        y = round(self.y, 2)
        return '{},{}'.format(x, y)

# A line from vec_from to vec_to
def line(vec_from, vec_to):
    half_vec = vec_from.add(vec_to.sub(vec_from).scale(.5))
    return '{} {}'.format(half_vec, vec_to)

# Adds 'n' units to vec_from pointing in direction vec_to
def vecDir(vec_from, vec_to, n):
    return vec_from.add(vec_to.sub(vec_from).normal().scale(n))

# Draws a line, but skips 'r' units from the begin and end
def lineR(vec_from, vec_to, r):
    vec = vec_to.sub(vec_from).normal().scale(r)
    return line(vec_from.add(vec), vec_to.sub(vec))

# An edge in vec_from, to vec_to with radius r
def edge(vec_from, vec_to, r):
    v = vecDir(vec_from, vec_to, r)
    return '{} {}'.format(vec_from, v)


# Hard-coded border-radius and vectors
r = 5
a = Vector(  0,  60)
b = Vector(100,   0)
c = Vector(100, 200)
d = Vector(  0, 200 - 60)

path = []
# Start below top-left edge
path.append('M {} Q'.format(a.add(Vector(0, r))))

# top-left edge...
path.append(edge(a, b, r))
path.append(lineR(a, b, r))
path.append(edge(b, c, r))
path.append(lineR(b, c, r))
path.append(edge(c, d, r))
path.append(lineR(c, d, r))
path.append(edge(d, a, r))
path.append(lineR(d, a, r))

# Show results that can be pushed into a <path d="..." />
for part in path:
    print(part)
于 2014-05-31T23:07:38.663 に答える
-4

パス要素を使用しています。パスに曲線を付けてみませんか? パス要素を使用して曲線を作成する方法については、こちらを参照してください: http://www.w3.org/TR/SVG/paths.html#PathDataCurveCommands

于 2012-04-16T22:49:57.067 に答える