2013-07-06 11 views
25

Próbuję mieć płynne płótno SVG, które można łatwo zmienić rozmiar. Do tej pory używam wszędzie procentów. Wygląda jednak na to, że SVG polygon i path nie obsługują wartości procentowych w atrybucie point. Oto przykład:Punkty wieloboku SVG z jednostkami procentowymi wsparcie

(jsFiddle)

<svg width='90%' height='90%' style='background-color: whitesmoke'> 
    <rect x='40%' y='40%' width='25%' height='25%' /> 

    <polygon points="0,0 0,100 30,20 30,0" /> 
    <polygon points="30,0 30,20 60,0 60,0" /> 
    <polygon points="60,0 60,0 90,30 90,0" /> 
</svg> 

Jednak jeśli zacznę zmienić numery w atrybucie points procentom nie powiedzie się z analizowania błędów w konsoli. Szukam sposobu na zmianę rozmiaru wielokąta z elementem <svg>.

+0

możliwy duplikat [Jak przeskalować wielobok SVG w ems?] (Http://stackoverflow.com/questions/8515524/how-do-i-scale-an-svg-polygon-in-ems) –

Odpowiedz

40

Korzystając viewBox i element kontenera (niezależnie od ich wielkości), myślę, że można osiągnąć efekt, którego szukasz: http://jsfiddle.net/davegaeddert/WpeH4/

<div id="svg-container" style="width:100%;height:100%;"> 
    <svg width='100%' height='100%' viewBox="0 0 100 100" preserveAspectRatio="none" style='background-color: whitesmoke'> 
     <rect x='40%' y='40%' width='25%' height='25%' /> 

     <polygon points="0,0 0,100 30,20 30,0" /> 
     <polygon points="30,0 30,20 60,0 60,0" /> 
     <polygon points="60,0 60,0 90,30 90,0" /> 
    </svg> 
</div> 

Jeśli dać viewBox rozmiar 0 0 100 100 następnie punkty można zapisać jak procenty i kształt będą skalowane z SVG.

+6

Świetnie, ale niestety rozmiar linii (szerokość obrysu) również się rozciąga) – FlorianB

+5

@FlorianB - Atrybut vector-effect = "non "Skalowanie-Skok" powinien rozwiązać ten problem. –

+1

Świetnie, ale zachowuje to jako sqare, prawda? Czy istnieje rozwiązanie, które ma mieć pełnoekranowy ekran (w większości przypadków ze współczynnikiem poziomym)? –

1

Można grupować elementy, wraz ze g i użyć transformacji:

<svg width='90%' height='90%' style='background-color: whitesmoke'> 
    <rect x='40%' y='40%' width='25%' height='25%' /> 

    <g transform="scale(0.4 0.4)"> 
     <polygon points="0,0 0,100 30,20 30,0"/> 
     <polygon points="30,0 30,20 60,0 60,0"/> 
     <polygon points="60,0 60,0 90,30 90,0"/> 
    </g> 
</svg> 
+0

To nie pomaga. Na koniec przeskalowano grupę wielokątów o szerokości 90 pikseli do stałej liczby 45 pikseli. To, czego potrzebuję, to, że coś zmienia się wraz z elementem 'svg'. W tej chwili 'rect' robi tak, nie ma nic stałego. Załóżmy, że mam trójkąt z 'poligonem', jak ja zachowam się w ten sam sposób? Spróbuj zrobić "' dostaniesz co mam na myśli. –

+1

Czy nie można wtedy użyć 'viewBox'? Skaluje wszystko automatycznie. – simonzack

+0

OK 'viewBox' robi to, teraz coś uderzyło, wygląda jak bug' d3.js'. Dzięki! –