2012-04-16 44 views
42

Tôi có SVG sau:SVG tròn góc

<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> 

Tôi muốn có được một border-top-right-radiusborder-top-bottom-radius hiệu ứng CSS-như thế nào.

Làm cách nào để đạt được hiệu ứng góc tròn?

+0

Thật tệ khi CSS ''border-radius' và các biến thể của nó không hoạt động trong SVG. –

Trả lời

-2

Bạn đang sử dụng phần tử đường dẫn, tại sao bạn không chỉ cung cấp đường dẫn cho đường cong? Xem ở đây để làm thế nào để làm cho đường cong sử dụng các yếu tố đường dẫn: http://www.w3.org/TR/SVG/paths.html#PathDataCurveCommands

+0

Cảm ơn câu trả lời của bạn. Họ thực sự hữu ích, nhưng vấn đề là tôi sử dụng biểu đồ KendoUI và đường dẫn đang tạo động. Tôi đã cố gắng thay đổi chúng bằng phương pháp cung cấp Phrogz, nhưng tôi nhận được hiệu ứng border-radius = 10px, nhưng tôi cần border-top- bán kính trái = 10px và đường viền dưới-dưới-bán kính = 10px chỉ. Tôi thực sự mới trong SVG vì vậy phương pháp thứ hai không phải cho tôi. Vì vậy, bạn có thể viết các điều phối đường dẫn cho tôi. Cảm ơn trước – Danis

+0

Nhiều như tôi muốn làm điều này cho bạn, tôi chỉ đơn giản là không có thời gian để đi qua vị trí toán/phối hợp. Nó không nên quá khó nếu bạn sử dụng các lệnh arc elliptical trong liên kết. – Jlange

20

Bạn đã thiết lập một cách rõ ràng của bạn stroke-linejoin để round nhưng bạn stroke-width-0, vì vậy tất nhiên bạn sẽ không thấy các góc tròn nếu bạn không có đột quỵ để tròn.

Dưới đây là một ví dụ sửa đổi với góc tròn thực hiện thông qua đột quỵ:
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" /> 

Nếu-nếu bạn cần một hình dạng điền thực tế tròn và không chỉ là một béo tròn đột quỵ-bạn phải làm những gì @Jlange nói và tạo hình tròn thực tế.

+0

Tôi thấy điều này một cách chính xác trên jsfiddle, nhưng khi sao chép vào một tài liệu HTML địa phương nó chỉ là một hình chữ nhật đơn giản. –

+2

Bạn có thể sử dụng 'stroke-linecap' thay vì' stroke-linejoin'. Nó làm việc cho tôi. – lobodart

4

Câu hỏi này là kết quả đầu tiên cho "con đường góc tròn svg" của Googling. Đề xuất của Phrogz để sử dụng stroke có một số hạn chế (cụ thể là, tôi không thể sử dụng đột quỵ cho các mục đích khác và kích thước phải được sửa cho chiều rộng nét).

Đề xuất của Jlange để sử dụng đường cong tốt hơn, nhưng không cụ thể lắm. Tôi đã kết thúc bằng cách sử dụng đường cong Bézier bậc hai để vẽ các góc tròn. Xem xét bức tranh này của một góc được đánh dấu bằng một dấu chấm màu xanh và hai điểm đỏ trên các cạnh liền kề:

corner of a figure marked blue with two points on the adjacent edges

Hai dòng có thể được thực hiện với lệnh L. Để biến góc nhọn này thành một góc tròn, bắt đầu vẽ một đường cong từ điểm đỏ bên trái (sử dụng M x,y để di chuyển đến điểm đó). Bây giờ đường cong Bézier bậc hai chỉ là một điểm điều khiển duy nhất mà bạn phải đặt trên điểm màu xanh. Đặt đầu của đường cong tại điểm màu đỏ bên phải. Khi ốp tại hai điểm màu đỏ là theo hướng của các dòng trước đó, bạn sẽ thấy một chuyển đổi trôi chảy, "góc tròn".

Bây giờ để tiếp tục hình dạng sau góc tròn, một đường thẳng trong đường cong Bézier có thể đạt được bằng cách đặt điểm điều khiển giữa trên đường giữa hai góc.

Để giúp tôi xác định đường dẫn, tôi đã viết tập lệnh Python này chấp nhận các cạnh và bán kính. Vector toán học làm cho điều này thực sự rất dễ dàng.Hình ảnh thu được từ kết quả:

shape created from script output

#!/usr/bin/env python 
# Given some vectors and a border-radius, output a SVG path with rounded 
# corners. 
# 
# Copyright (C) Peter Wu <[email protected]> 

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) 
10

Tôi cũng muốn xem xét sử dụng một đồng bằng cũ <rect> cung cấp các rxry thuộc tính

MDN SVG docs < - lưu ý các yếu tố rect rút thứ hai

+2

Nhưng OP chỉ muốn một số góc được làm tròn. –

+3

Điều này trả lời câu hỏi của tôi, đó là những gì đã đưa tôi đến trang này. Vì vậy, cảm ơn! –

+1

Nếu bạn cần sử dụng các góc được làm tròn thành một số nhóm phần tử, và không chỉ ở dạng trực tràng, bạn có thể làm điều đó bằng cách sử dụng clipPath https://developer.mozilla.org/pt-BR/docs/Web/SVG/Element/clipPath như bạn có thể thấy ở đây http://jsfiddle.net/thiagomata/mp28rnj6/1/ –

26

Được tham chiếu trong câu trả lời của tôi cho Applying rounded corners to paths/polygons, tôi đã viết một thường trình trong javascript cho generi cally làm tròn các góc của đường dẫn SVG, với các ví dụ, tại đây: http://plnkr.co/edit/kGnGGyoOCKil02k04snu.

Nó sẽ hoạt động độc lập với mọi hiệu ứng đột quỵ mà bạn có thể có. Để sử dụng, hãy bao gồm tệp rounding.js từ Plnkr và gọi hàm như sau:

roundPathCorners(pathString, radius, useFractionalRadius) 

Kết quả sẽ là đường tròn.

Các kết quả tìm kiếm như thế này:

SVG Path Rounding Examples

+0

Tốt, mặc dù hỗ trợ cho các lệnh tương đối thậm chí còn đẹp hơn. –

+0

Tôi đồng ý :) Đây chỉ là một chút một lần để giải quyết vấn đề của tôi, không phải là một nỗ lực tại một thư viện chính thức. Tôi muốn chào đón một cái nĩa với chức năng đó! –

38

Không chắc tại sao không ai đăng một câu trả lời SVG thực tế. Dưới đây là một hình chữ nhật SVG với góc tròn (bán kính 3) trên đầu:

<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" /> 

Đây là một Move To (M), Line Để (L), Arc Để (A), Line Để (L), Arc To (A), Line To (L), Đường dẫn Đóng (Z).

Các số được phân cách bằng dấu phẩy là tọa độ tuyệt đối. Các cung được xác định với các tham số bổ sung xác định bán kính và loại cung. Điều này cũng có thể được thực hiện với các tọa độ tương đối (sử dụng các chữ thường cho L và A).

Tham chiếu hoàn chỉnh cho các lệnh đó nằm trên trang W3C SVG Paths và tài liệu tham chiếu bổ sung trên đường dẫn SVG có thể được tìm thấy trong this article.

+8

Đây không phải là câu trả lời trực tiếp mà tôi đang tìm kiếm, nhưng là một vị thần tốt nếu nó không hữu ích. Luôn luôn tự hỏi những gì các chữ cái được cho. –

38

Tôi biết đó là muộn để trả lời này nhưng đối với SO sake, đây là cách bạn có thể tạo một hình chữ nhật tròn với SVG Đường dẫn:

<path d="M100,100 h200 a20,20 0 0 1 20,20 v200 a20,20 0 0 1 -20,20 h-200 a20,20 0 0 1 -20,-20 v-200 a20,20 0 0 1 20,-20 z" /> 

Expaination:

M100,100:Di chuyển đến điểm (100,100)

h200:Vẽ Một 200px ngang dòng Từ Where We Are

a20,20 0 0 1 20,20:Vẽ Một Arc Với 20px X Radius, 20px Y Radius, chiều kim đồng hồ, đến một điểm Với 20px Difference Trong X và trục Y

V200:Vẽ Một 200px dọc đường Từ Where We Are

a20,20 0 0 1 -20,20:Vẽ Một Arc Với 20px X Và Y Radius, chiều kim đồng hồ, đến một điểm khác biệt Với ​​-20px Trong X và 20px Difference Trong Trục Y

h-200:Vẽ một đường ngang -200px Từ Where We Are

A20 , 20 0 0 1 -20, -20:Vẽ Một Arc Với 20px x và y Radius, chiều kim đồng hồ, đến một điểm khác biệt Với ​​-20px Trong X Và Difference -20px Trong trục Y

v-200 :Vẽ Một Dọc Đường dây -200px Từ Where We Are

a20,20 0 0 1 20, -20:Vẽ Một Arc Với 20px x và y Radius, chiều kim đồng hồ, đến một điểm Với 20px Difference Trong X và sự khác biệt -20px Trong trục Y

z:Đóng Con đường

<svg width="440" height="440"> 
 
    <path d="M100,100 h200 a20,20 0 0 1 20,20 v200 a20,20 0 0 1 -20,20 h-200 a20,20 0 0 1 -20,-20 v-200 a20,20 0 0 1 20,-20 z" fill="none" stroke="black" stroke-width="3" /> 
 
</svg>

+0

khá vững chắc và đơn giản để hiểu – Shea

-1
<?php 
$radius = 20; 
$thichness = 4; 
$size = 200; 

if($s == 'circle'){ 
    echo '<svg width="' . $size . '" height="' . $size . '">'; 
    echo '<circle cx="' . ($size/2) . '" cy="' . ($size/2) . '" r="' . (($size/2)-$thichness) . '" stroke="black" stroke-width="' . $thichness . '" fill="none" />'; 
    echo '</svg>'; 
}elseif($s == 'square'){ 
    echo '<svg width="' . $size . '" height="' . $size . '">'; 
    echo '<path d="M' . ($radius+$thichness) . ',' . ($thichness) . ' h' . ($size-($radius*2)-($thichness*2)) . ' a' . $radius . ',' . $radius . ' 0 0 1 ' . $radius . ',' . $radius . ' v' . ($size-($radius*2)-($thichness*2)) . ' a' . $radius . ',' . $radius . ' 0 0 1 -' . $radius . ',' . $radius . ' h-' . ($size-($radius*2)-($thichness*2)) . ' a' . $radius . ',' . $radius . ' 0 0 1 -' . $radius . ',-' . $radius . ' v-' . ($size-($radius*2)-($thichness*2)) . ' a' . $radius . ',' . $radius . ' 0 0 1 ' . $radius . ',-' . $radius . ' z" fill="none" stroke="black" stroke-width="' . $thichness . '" />'; 
    echo '</svg>'; 
} 
?>