Jak zrobić własną ikonę SVG?
Mam pomysł na własne ikony SVG, którymi mogłabym oznaczyć tagi oraz kategorie na moim blogu. Oto mój plan:
- Sprawdzić, jakie tagi i kategorie posiada mój blog.
- Stworzyć plik(i) .svg z odpowiadającymi im ikonami.
- Zmienić motyw bloga tak, aby wyświetlał ikony obok kategorii i tagów.
Oto utworzone ikony - do ich wykonania użyłam jedynie (najlepszego na świecie) edytora tekstu:
Tagi i kategorie bloga: ripgrep
Najpierw chcę się dowiedzieć, jakich ikon będę w ogóle potrzebować. Planuję więc przeszukać wpisy na bogu i sprawdzić, ile już "wygenerowałam" tagów. Jeśli niezbyt wiele, to jest szansa, że podejmę się tworzenia własnych ikon.
Do wyszukania w metadanych postów przypisanych im tagów i kategorii używam fantastycznego programu ripgrep:
|
|
- Opcja
-I
nie wypisuje nazw plików, w których znaleziono dopasowanie - Opcja
-N
wyłącza wypisywanie numerów wierszy w plikach, w których znaleziono dopasowanie - Opcja
-e
określa wyrażenie regularne, którego szukam; tu: chcę uzyskać napis znajdujący się po tags: lub category:, poprzedzony dwoma kropkami i spacją (taki jest format metadanych w postach ze źródłem reStructuredText) - Opcja
-r
definiuje tekst zastąpienia, w którym mogę się odwołać się do indeksu bądź nazwy grupy dopasowania; tu: grupa druga; pierwszą grupę stanowi alternatywa
Ponieważ posty mogą być oznaczone wieloma tagami oddzielonymi przecinkiem, używam tr
do zamiany przecinkow (i - dla ujednolicenia - spacji) na znaki nowego wiersza, po czym sortję i usuwam duplikaty inkantacją sort | uniq
.
Tworzenie ikon - kartka, ołówek i edytor tekstowy
Planuję zatem utworzyć sześć ikon:
- aoc (choinka świąteczna)
- blog (kartka i pióro)
- grafika (obrazek z ramką i haczykiem)
- howto (śrubokręt?)
- programowanie (klawiatura)
Spróbuję naszkicować jakieś obrazki, a później zamknąć je w kwadracie 100x100. Ogólne właściwości elementów svg znajdujących się na tej stronie są opisane następującym fragmentem css-a. Dzięki narysowanej szarej obwódce widzę wyraźnie położenie obrazka wewnątrz obszaru ikony.
|
|
Każda z ikon będzie zdefiniowana wenątrz taga <svg>
, którego atrybuty width
i height
zdefiniują wymiary ikony, przy pomocy taga defs
zawierającego definicje (potencjalnie wielu) elementów; żaden z nich nie będzie jednak wyrenderowany. Dopiero użycie jednej z definicji (tag use
) spowoduje jego wyrenderowanie.
Choinka
Narysuję bardzo prostą, symboliczną choinkę - trójkąt równramienny - z “soplem” u góry - w kształcie równoległoboku. Użyję do tego elementu path
(ścieżki), którego atrybut d
(data) będzie zawierał dyrektywy:
M x y
ustawiającą punkt początkowy ścieżki na (x, y)L x y
dodający segment ścieżki od wcześniejszej pozycji do pozycji (x, y)Z
dodający ostatni segment od bieżącej pozycji do punktu początkowego (czyli segment “zamykający” ścieżkę)
|
|
A tu gotowy svg:
Blog - prosta ikona: kartka i pióro
Kolejna ikona to blog. Będzie to prosta kartka (prostokąt) z kilkoma liniami tekstu i proste pióro. Tag defs
zawiera definicję trzech elementów: notes
to prostokąt, blogline
to linia, którą użyję trzy razy, za każdym razem zwiększając pozycję y, a pen
to zamknięta ścieżka złożona z pięciu linii.
|
|
Grafika
Ikona kategorii “grafika” to prosta ramka z haczykiem do zwieszenia na ścianie. Po zastanowieniu dodałam jeszcze trzy symboliczne kółeczka.
|
|
Howto i tutoriale - ikona śrubokręta
To będzie wyzwanie - jak wygląda śrubokręt? Wykorzystam jego symetrię: zbuduję grupę ścieżek opisującą prawą część śrubokręta (#screwpath
), a następnie użyję tej grupy w odbicu względem osi Y (złożenie transformacji skalowania i przesunięcia) tak, aby otrzymać nową grupę (#screw
) zawierającą obydwie części, prawą i lewą.
|
|
Programowanie - ikona klawiatury
Załóżmy, że dobrą ikoną programowania będzie klawiatura. U góry narysuję trzy kółka (diody led), później narysuję cztery poziome linie (jedna ścieżka utworzona przez cztery fragmenty) oraz linie pionowe, spośród których dwie pierwsze i dwie ostatnie będą dłuższe (to boczne krawędzie klawiszy z prawej i lewej strony klawiatury).
Użwam dwóch nowych dyrektyw:
h <d>
rysuje linię poziomą o długościod bieżącej pozycji V <y>
rysuje linię pionową do współrzędnej y wynoszącej
|
|
Utworzenie jednego pliku .svg
Moim celem jest utworzenie jednego pliku .svg zawierającego wszystkie ikony i definicje widoków na każdą z nich.
Utworzyłam plik icons.svg
, w którym zgromadziłam utworzone tutaj definicje ikon. Dodałam do niego atrybut style
, aby przeglądarka miała możliwość wyrenderowania tego obrazka. Określiłam w nim również szerokość i wysokość (500px na 100px). Wyświetlam kolejne elementy zdefiniowane w defs
od strony lewej do prawej, co 100 pikseli (z niewielkim przesunięciem w pionie w przypadku #graphics
oraz #kbd
):
|
|
Dodatkowo, w sekcji <defs/>
, utworzyłam widoki na poszczególne elementy (wykorzystując viewBox
) i nadałam im opowiednie atrybuty id
:
|
|
Dzięki temu mogę w html-u użyć elementu img
ze ścieżką do widoku; na przykład, aby wyświetlić jedynie klawiaturę, piszę tak:
|
|
Cały icons.svg:
<img src="/icons.svg" alt=“Obraz svg zawierający wszystkie ikony” width=“500px” height=“100px” />
A tutaj poszczególne fragmenty:
Fragment #icon-aoc:
Fragment #icon-blog:
<img src="/icons.svg#icon-blog" width=“100px” height=“100px” /> Fragment #icon-grafika:
<img src="/icons.svg#icon-grafika" width=“100px” height=“100px” />
Fragment #icon-howto:
<img src="/icons.svg#icon-howto" width=“100px” height=“100px” />
Fragment #icon-programowanie:
<img src="/icons.svg#icon-programowanie" width=“100px” height=“100px” />
Żródła
Odnośniki do artykułów, z których korzystałam: