Strona główna » Poradniki » Grafika SVG » Gradient liniowy
 

Gradient liniowy

Wstęp

Dotychczas poznane metody stylizowania elementów pozwalały na uzyskania jednokolorowych kształtów o ewentualnie innym kolorze obramowania. Do prostych schematów i rysunków jest to wystarczające. Grafika wektorowa ma do zaoferowania znacznie więcej - pozwala na użycie gradientów, aby przechodzenie pomiędzy kolorami było płynne. Ponadto można tworzyć również własne wzory, którymi następnie można wypełnić dowolny kształt. Obydwie metody pozwalają uzyskać efekty, które w grafice rastrowej trudno byłoby zmienić.

Gradient liniowy na już

W celu uzyskania gradientu należy zadeklarować styl w definicjach. Definicję zapisuje się w obiekcie defs, który zazwyczaj ustawia się umownie na początku pliku tak, aby z dowolnego miejsca w kodzie był dostęp do definicja. Ustawienie defs wewnątrz jakieś grupy ograniczy widoczność definicji tylko do grupy w której się znajduje. Z kolei sam gradient to obiekt linearGradient. Przykładowo, aby uzyskać gradient, który przejdzie od koloru białego do czarnego wystarczy wpisać:

  1. <svg width="300px" height="150px" viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
  2.   <defs>
  3.     <linearGradient id="wypelnienie">
  4.       <stop offset="0%" stop-color="#FFF" />
  5.       <stop offset="100%" stop-color="#000" />
  6.     </linearGradient>
  7.   </defs>
  8.   <rect fill="url(#wypelnienie)" x="10" y="10" width="180" height="80"/>
  9. </svg>

(2.) Rozpoczęcie definicji: (3.) zadeklarowanie gradientu liniowego o nazwie wypelnienie. To bardzo ważne, żeby każdy gradient miał unikalny identyfikator. W ten sposób możliwe jest jego wykorzystanie. Gradient (4.) ma się rozpocząć od początku kolorem białym, a (5.) kończyć czarnym. Ustawienie 0% i 100% oznacza, że ustalony stop-color występuje na offset miejscu czyli w tym przypadku pełne kolory są tylko na początku i na końcu. (6.) Koniec definicji i (7.) narysowanie prostokąta wypełnionego gradientem. Należy zauważyć, że odwołanie do gradientu polega na wpisaniu identyfikatora gradientu jako argument funkcji url(). Dodatkowo należy pamiętać, że identyfikator zawsze podaje się z # (kratką).

Zmiana ustawień

Przypuśćmy teraz, że zmiana z białego koloru na czarny powinna trwać tylko 40% całej szerokości prostokąta. Ponadto część biała i czarna powinny być jednakowej szerokości. Wtedy obrazek i kod będą wyglądać następująco:

  1. <svg width="300px" height="150px" viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
  2.   <defs>
  3.     <linearGradient id="wypelnienie2">
  4.       <stop offset="30%" stop-color="#FFF" />
  5.       <stop offset="70%" stop-color="#000" />
  6.     </linearGradient>
  7.   </defs>
  8.   <rect fill="url(#wypelnienie2)" x="10" y="10" width="180" height="80"/>
  9. </svg>

Jak widać biały i czarny obszar jest wyraźnie widoczny i istnieje pomiędzy nimi płynne przejście. Warto zauważyć, że gradient zawsze biegnie od lewej do prawej tj. pierwszy element stop nadaje kolor pierwszemu przystankowi gradientu. Istnieje możliwość również przypisywania gradientu nie do wypełnienia, a linii otaczającej kształt. Przykładowo załóżmy, że prostokąt będzie miał stałe szare wypełnienie, a tylko jego obwódka będzie przechodzić od białego do czarnego. Obrazek i kod będą miały następującą postać:

  1. <svg width="300px" height="150px" viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
  2.   <defs>
  3.     <linearGradient id="wypelnienie2">
  4.       <stop offset="30%" stop-color="#FFF" />
  5.       <stop offset="70%" stop-color="#000" />
  6.     </linearGradient>
  7.   </defs>
  8.   <rect fill="gray" stroke="url(#wypelnienie2)" stroke-width="4px"
  9.     x="10" y="10" width="180" height="80"/>
  10. </svg>

(8.) W tym przypadku odwołanie do gradientu znajduje się w atrybucie stroke. Zmienia to sposób rysowania obwódki prostokąta.

Więcej kolorów

Istnieje możliwość dodawania większej ilości kolorów w celu uzyskania bardziej skomplikowanych gradientów. Przykładowo:

  1. <svg width="300px" height="150px" viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
  2.   <defs>
  3.     <linearGradient id="wypelnienie3">
  4.       <stop offset="0%" stop-color="#F00" />
  5.       <stop offset="50%" stop-color="#0F0" />
  6.       <stop offset="100%" stop-color="#00F" />
  7.     </linearGradient>
  8.   </defs>
  9.   <rect fill="url(#wypelnienie3)x="10" y="10" width="180" height="80"/>
  10. </svg>

W celu dodania koloru wystarczyło wpisać nowy element stop i określić jego kolor poprzez atrybut stop-color. W oczy rzuca się pewnego rodzaju dysproporcja - na rysunku dominuje kolor zielony. W celu zmiany tego należałoby dokładnie przyjrzeć się podanym wartościom. Kolor czerwony zaczyna się od lewej strony, ale występuje tylko jako pasek pikseli, a następnie przez pół rysunku zmienia się na kolor zielony. W celu wyrównania szerokości kolorów należy ustalić na przykład, że początkowo rysunek jest biały, a następnie zmienia się w czerwony i w tej samej szerokości w zielony. Wtedy kod będzie wyglądał następująco:

  1. <svg width="300px" height="150px" viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
  2.   <defs>
  3.     <linearGradient id="wypelnienie4">
  4.       <stop offset="0%" stop-color="#FFF" />
  5.       <stop offset="25%" stop-color="#F00" />
  6.       <stop offset="50%" stop-color="#0F0" />
  7.       <stop offset="75%" stop-color="#00F" />
  8.       <stop offset="100%" stop-color="#FFF" />
  9.     </linearGradient>
  10.   </defs>
  11.   <rect fill="url(#wypelnienie4)x="10" y="10" width="180" height="80"/>
  12. </svg>

Chociaż w tym momencie wydaje się, że zielony zajmuje mniej miejsca niż pozostałe kolory to w rzeczywistości wszystkie zajmują tyle samo: czerwony biegnie od 0% do 50%. Zielony od 25% do 75%, a niebieski od 50% do 100%. Wszystkie szerokości podanych kolorów są takie same.

Zadania

W celu utrwalenia nabytych umiejętności postaraj się napisać kod poniższych obrazków bez korzystania z żadnej pomocy (artykułu, notatek, dokumentacji SVG i innych).

Zadanie 1

Zadanie 2