Wstawianie wektorowej grafiki SVG w HTML-5

Stronę tą wyświetlono już: 264 razy

Wstęp

Format zapisu danych w grafikach SVG (Scalable Vector Graphics) gwarantuje uzyskanie grafiki o dostosowującej się do rozmiaru strony rozdzielczości. Taką grafikę (jak sama nazwa wskazuje) można skalować w zasadzie do woli, bez utraty danych. Co najważniejsze dane te są zapisywane w formacie XML Extensible Markup Language co oznacza, że format ten odpowiada formatowi zapisu treści stron internetowych w plikach HTML. Dzięki temu, pliki SVG mogą być w HTML-5 zamieszczane na stronie. Możliwość tworzenia grafiki wektorowej daje niekomercyjne i dostępne na wolnej licencji oprogramowanie jakim jest Inkscap-e.

Znacznik <svg> - definiowanie obszaru rysowania SVG

Ten znacznik umożliwia określenie obszaru rysowania grafiki wektorowej na stronie. Oto prosty przykład użycia tego znacznika z podstawowymi jego atrybutami:

Listing 1
  1. <svg width="100px" height="50px" style="margin:auto;display:block; background: yellow;">
  2. <circle cx="25" cy="25" r="20" style="stroke: black; stroke-width: 5; fill: green" />
  3. </svg>

W powyższym kodzie dodałem jeden obiekt graficzny, żeby było wiadomo, że coś się dzieje. Oto efekt działania:

Znacznik <line /> - rysowanie pojedynczej linii w SVG

Znacznik ten wykorzystywany jest do rysowania pojedynczej linii. Oto przykład jego użycia:

Listing 2
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <line x1="0" y1="2" x2="100" y2="50" style="stroke: rgb(0, 0, 0); stroke-width: 5px" />
  3. </svg>

Rezultat działania:

Znacznik <polyline /> - rysowanie linii łamanej w SVG

Znacznik ten wykorzystywany jest do rysowania linii łamanej. Oto przykład jego użycia:

Listing 3
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <polyline points="0,0 25,50 50,0 75,50 100,0" style="stroke: #000000; fill: none; stroke-width: 5px" />
  3. </svg>

Rezultat działania:

W powyższym kodzie wyłączone zostało wypełnienie poprzez ustawienie stylu fill na wartość none. Oto co się dzieje, gdy ta wartość zostanie ustawiona na jakiś kolor:

Znacznik <rect /> - rysowanie prostokąta w SVG

Znacznik ten posiada nieco więcej atrybutów określających jego kształt, wszystkie te atrybuty wykorzystane zostały w przykładzie poniżej:

Listing 4
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <rect width="50" height="50" style="stroke: none; fill: green;" />
  3. <rect x="55" y="5" width="40" height="40" rx="10" ry="10" style="stroke: #000000; fill: none; stroke-width: 5px" />
  4. <rect x="5" y="10" width="90" height="30" rx="10" ry="10" style="stroke: none; fill: blue; opacity: 0.5;" />
  5. </svg>

Rezultat działania kodu:

Znacznik <circle /> - rysowanie koła w SVG

Znacznik ten rysuje koło w następujący sposób:

Listing 5
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <circle cx="50" cy="25" r="20" style="stroke: black; stroke-width: 5; fill: green" />
  3. </svg>

W powyższym kodzie dodałem jeden obiekt graficzny, żeby było wiadomo, że coś się dzieje. Oto efekt działania:

Atrybuty cx i cy określają położenie środka koła.

Znacznik <ellipse /> - rysowanie elipsy w SVG

Oto przykład kodu rysującego elipsę:

Listing 6
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <ellipse cx="50" cy="25" rx="90" ry="20" style="stroke: black; stroke-width: 5; fill: green" />
  3. </svg>

Efekt działania:

Znacznik <polygon /> - rysowanie wielokątów w SVG

Składnią znacznik ten przypomina do złudzenia znacznik <polyline>, jednak znacząca różnica jest w działaniu, ponieważ ten znacznik automatycznie zamyka kształt łącząc końce figury geometrycznej, na którą ten się składa. Oto przykład:

Listing 7
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <polygon points="0,0 25,50 50,0 75,50 100,0" style="stroke: #000000; fill: blue; stroke-width: 5px" />
  3. </svg>

Rezultat działania:

Znacznik <path /> - rysowanie ścieżki w SVG

Ten znacznik to bardziej zaawansowane narzędzie do rysowania nie tylko prostoliniowych obszarów, ale również krzywych Bezier-a. Oto przykład:

Listing 8
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <path d="M10,10 L90,10 L90,45 Z" style="stroke: #000000; fill: blue; stroke-width: 5px" />
  3. </svg>

Wynik działania powyższego kodu:

W kodzie zostały wykorzystane specjalne oznaczenia, które należy interpretować w następujący sposób:

  • M - przemieść do (ustawia punkt rysowania);
  • L - linia do (rysuje linię do danego punktu);
  • H - linia do w poziomie (rysuje linię do podanej współrzędnej x w poziomie);
  • V - linia do w pionie (rysuje linię do podanej współrzędnej y w pionie);
  • C - krzywa do;
  • S - wygładzona krzywa do;
  • Q - krzywa Bezier-a;
  • T - wygładzona krzywa Bezier-a;
  • A - łuk eliptyczny;
  • Z - zamknięcie ścieżki.

Wyżej wymienione oznaczenia pisane dużą literą określają współrzędne bezwzględne punktu, pisane małą opisują współrzędne względem ostatniego punktu ścieżki.

Znaczniki <text> i <tspan> - wyświetlanie i pozycjonowanie tekstu w SVG

Oto przykład wykorzystania tego znacznika do wstawiania elementów tekstowych:

Listing 9
  1. <svg width="200px" height="100px" style="margin:auto;display:block">
  2. <text x="100" y="25" style="stroke: red; fill: blue; stroke-width: 1px; text-anchor: middle;font-size: 20px;">SVG<tspan dy="-10px">2</tspan> <tspan dy="10px">rządzi!!!</tspan></text>
  3. <text style="stroke: none; fill: blue; text-anchor: middle;font-size: 20px;">
  4. <tspan x="100" y="50">Pierwsza linia tekstu</tspan>
  5. <tspan x="100" y="75">Druga linia tekstu</tspan>
  6. </text>
  7. </svg>

Rezultat działania kodu:

SVG2 rządzi!!! Pierwsza linia tekstu Druga linia tekstu

W powyższym kodzie warto zwrócić uwagę na styl text-anchor, który określa położenie punktu zaczepienia (kotwicy) wyświetlanego tekstu. Styl ten może przyjmować następujące wartości:

  • start - oznacza umieszczenie kotwicy na początku tekstu (wyrównanie tekstu do lewej);
  • middle - oznacza umieszczenie kotwicy na środku tekstu (wyrównanie do środka);
  • end - oznacza umieszczenie kotwicy na końcu tekstu (wyrównanie do prawej)

Znacznik <tpsan> umożliwia pozycjonowanie tekstu w sposób bezwzględny za pomocą atrybutów x i y lub w sposób względny (względem położenia końca ostatniego znaku tekstu) z wykorzystaniem atrybutów dx i dy.

Znacznik <g> - grupowanie elementów SVG

SVG oferuje również możliwość grupowania elementów, dzięki czemu można wykonywać różne operacje np. transformacji grupy elementów znajdujących się w takim znaczniku. Oto prosty przykład zastosowania:

Listing 10
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <g transform="rotate(30 50,25)">
  3. <rect width="50" height="50" style="stroke: none; fill: green;" />
  4. <rect x="55" y="5" width="40" height="40" rx="10" ry="10" style="stroke: #000000; fill: none; stroke-width: 5px" />
  5. <rect x="5" y="10" width="90" height="30" rx="10" ry="10" style="stroke: none; fill: blue; opacity: 0.5;" />
  6. </g>
  7. </svg>

Rezultat działania powyższego kodu:

Znacznik <g> został wykorzystany do zgrupowania i obrócenia grupy obiektów o zadany kąt przy użyciu atrybutu transform ustawionego na wartość rotate(30 50,25), gdzie pierwsza liczba określa kąt obrotu, a dwie ostatnie punkt obrotu zgrupowanych elementów.

Znacznik <defs> - definicje formatowania obiektów w SVG

Znacznik ten przechowuje elementy, których zadaniem jest opisywanie pewnych właściwości elementów, którym dany znacznik został przypisany. Umieszczane są tutaj znaczniki filtrów graficznych, gradientów, kształtów znaczników kończących linie.

Znacznik definicji gradientu liniowego <linearGradient> w SVG

Definicję gradientu należy umieścić wewnątrz znacznika <defs>, oto przykład:

Listing 11
  1. <svg width="100px" height="50px" style="margin: auto; display: block">
  2. <defs>
  3. <linearGradient id="linearGradient1" x1="0%" y1="0%" x2="100%" y2="100%">
  4. <stop offset="0%" style="stop-color: red;stop-opacity:1" />
  5. <stop offset="50%" style="stop-color: blue;stop-opacity:0.5" />
  6. <stop offset="100%" style="stop-color: yellow;stop-opacity:1" />
  7. </linearGradient>
  8. </defs>
  9. <rect width="100px" height="50px" style="fill: url(#linearGradient1)">
  10. </svg>

Rezultat działania:

W powyższym przykładzie wykorzystane zostały atrybuty x1, y1, x2 i y2 w celu określenia położenia początkowego i końcowego punktu gradientów. Użycie jednostek procentowych sprawia, że odwołuje się do wymiarów obiektu lub grupy obiektów, które tym gradientem zostaną wypełnione. Dużo lepszym sposobem definiowania gradientów jest:

Listing 12
  1. <svg width="100px" height="50px" style="margin: auto; display: block">
  2. <defs>
  3. <linearGradient id="linearGradient2">
  4. <stop offset="0%" style="stop-color: red;stop-opacity:1" />
  5. <stop offset="50%" style="stop-color: blue;stop-opacity:0.5" />
  6. <stop offset="100%" style="stop-color: yellow;stop-opacity:1" />
  7. </linearGradient>
  8. <linearGradient id="linearGradient3" xlink:href="#linearGradient2" x1="0" y1="0" x2="100" y2="50" gradientUnits="userSpaceOnUse"/>
  9. </defs>
  10. <rect width="100px" height="50px" style="fill: url(#linearGradient3)">
  11. </svg>

Rezultatem czego jest taki efekt:

Znacznik definicji gradientu promieniowego <radialGradient> w SVG

Gradient ten definiuje się w podobny sposób jak linearGradient:

Listing 13
  1. <svg width="100px" height="50px" style="margin: auto; display: block">
  2. <defs>
  3. <radialGradient id="radialGradient1">
  4. <stop offset="0%" style="stop-color: red;stop-opacity:1" />
  5. <stop offset="50%" style="stop-color: blue;stop-opacity:0.5" />
  6. <stop offset="100%" style="stop-color: yellow;stop-opacity:1" />
  7. </radialGradient>
  8. <radialGradient id="radialGradient2" xlink:href="#radialGradient1" cx="50%" cy="50%" fx="50%" fy="50%" r="50%"/>
  9. </defs>
  10. <rect width="100px" height="50px" style="fill: url(#radialGradient2)">
  11. </svg>

Rezultatem czego jest taki efekt:

Znacznik definicji obszaru przycinania <clipPath> w SVG

Znacznik ten umożliwia przycinanie elementów grafiki SVG w następujący przykładowy sposób:

Listing 14
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <defs>
  3. <clipPath id="clipPath1">
  4. <rect x="25px" y="0px" width="50px" height="50px" />
  5. </clipPath>
  6. </defs>
  7. <g style="clip-path: url(#clipPath1);">
  8. <rect width="50" height="50" style="stroke: none; fill: green;" />
  9. <rect x="55" y="5" width="40" height="40" rx="10" ry="10" style="stroke: #000000; fill: none; stroke-width: 5px" />
  10. <rect x="5" y="10" width="90" height="30" rx="10" ry="10" style="stroke: none; fill: blue; opacity: 0.5;" />
  11. </g>
  12. </svg>

Rezultat działania powyższego kodu:

Znacznik definicji filtrów <filter> oraz znaczniki filtrów w SVG

W znaczniku <defs> można również umieścić definicje filtrów graficznych. Oto ich lista:

  • <feBlend> - dokonuje kombinacji graficznej elementu z elementami znajdującymi się pod nim w taki sam sposób jak np. w Gimpie można ustawić tryb nakładania warstw;
  • <feColorMatrix> - filtr dla transformacji koloru;
  • <feComponentTransfer>;
  • <feComposite>;
  • <feConvolveMatrix>;
  • <feDiffuseLighting>;
  • <feDisplacementMap>;
  • <feFlood>;
  • <feGaussianBlur> - filtr rozmycia obiektu;
  • <feImage>;
  • <feMerge>;
  • <feMorphology>;
  • <feOffset> - filtr rzucający cień;
  • <feSpecularLighting> - filtr podświetlenia;
  • <feTile>;
  • <feTurbulence>;
  • <feDistantLight> - filtr podświetlenia;
  • <fePointLight> - filtr podświetlenia;
  • <feSpotLight> - filtr podświetlenia;

Oto przykład zastosowania definicji filtru <feGaussianBlur>:

Listing 15
  1. <svg width="100px" height="50px" style="margin:auto;display:block">
  2. <defs>
  3. <filter id="blur1">
  4. <feGaussianBlur in="SourceGraphic" stdDeviation="2">
  5. </filter>
  6. </defs>
  7. <rect x="10" y="10" width="80" height="30" style="stroke: none; fill: green;" filter="url(#blur1)" />
  8. </svg>

Wynik działania powyższego kodu:

Style obramowania elementów SVG

Format SVG umożliwia zaawansowane formatowanie stylu obramowania rysowanych elementów, z tego też względu warto przyjrzeć się stylom, które wpływają na wygląd obramowania elementów graficznych:

  • stroke - określa kolor obramowania. Styl ten może być ustawiony na wartość none, co oznacza brak obramowania;
  • stroke-width - określa szerokość obramowania;
  • stroke-linecap - określa sposób zakończenia linii, dostępne są następujące wartości:
    • butt - płaskie
    • round - zaokrąglone
    • square - kwadratowe
  • stroke-linejoin - sposób zakończenia narożników linii łamanych, dostępne są następujące wartości:
    • miter - zakończenie ostre
    • round - zakończenie zaokrąglone
    • bevel - zakończenie ścięte
  • stroke-dasharray - określa wzór linii przerywanej. Oto przykładowy kod:

    Listing 16
    1. <svg width="100px" height="100px" style="margin:auto;display:block">
    2. <polyline points="0,25 100,25" style="stroke: black; fill: none; stroke-width: 10px; stroke-linecap: butt; stroke-dasharray: 10,10" />
    3. <polyline points="0,50 100,50" style="stroke: black; fill: none; stroke-width: 10px; stroke-linecap: butt; stroke-dasharray: 10,10,20,10" />
    4. <polyline points="0,75 100,75" style="stroke: black; fill: none; stroke-width: 10px; stroke-linecap: butt; stroke-dasharray: 10,10,20,10,20" />
    5. </svg>

    i rezultat jego działania:

Komentarze