Jak wygenerować kolorowy pasek (js i html canvas)

Dzisiaj generowanie kolorowych pasków. Zapraszam na szybki kodzik.
Zaprogramuję generowanie prostej grafiki - poziomego paska składającego się z pionowych, kolorowych prostokątów, na podstawie wybranego koloru bazowego. Rezultat końcowy wygląda tak:
Przykłady
A tutaj kolejne paski - dla zabawy: 🐁
Jak to napisać?
Canvas
Canvas i kod javascript umieściłam bezpośrednio w treści wpisu (w markdown). Jak na razie wydaje mi się, że wszystko działa. Pod canvasem dodałam selektor koloru bazowego oraz przycisk do przegenerowania paska.
|
|
Sam pasek ma szerokość 100% i wysokość 100px (te właściwości CSS zdefiniowałam w tagu style
):
|
|
#Rysowanie
Rysuję kolorowe prostokąty o szerokości losowej od 2 do 20. Funkcja do losowania wartości z przedziału:
|
|
Kolory
Konwersja z modelu RGB to HSL
Selektor barw zwraca mi jako wartość DOMString, pobieram więc wartości r, g, b odczytane z selektora przy użyciu funkcji rgbStrToRgbArr(rgbstr)
:
|
|
Otrzymane wartości r, g, b konwertuję na wartości h, s, l. Do przejścia między modelem barw RGB a HSL używam funkcji rgbToHsl(r, g, b)
znalezionej tutaj.
HSL dużo bardziej nadaje się do generowania wizualnie atrakcyjnych połączeń barw niż model RGB; właściwość hue w trójce (hue, saturation, lightness) bezpośrednio przekłada się na znane artystom malarzom koło barw, z którego można łatwo odczytać barwy dopełniające czy wygenerować różne “pasujące” barwy.
Generowanie palety
Moja “paleta barw” jest bardzo skromna: to tylko cztery kolory (licząc razem z kolorem bazowym).
Kolory pasków są generowane losowo z puli czterech kolorów: koloru bazowego, koloru dopełniającego (znajdującego się na kole barw 180 stopni dalej) oraz dwóch kolorów oddalonych od bazowego o +30 oraz -30 stopni.
Do stworzenia palety użytam funkcji create_palettes(cs)
|
|
Wstawianie wielu pasków na stronę
Deklaracja “komponentu”
Przyznam się, że po wstawieniu kilku bloków htmla zawierających canvas, input i button rozbolał mnie brzuch (zawsze mnie boli jak widzę powtórzenia w kodzie), więc zredukowałam deklarację paska do pojedynczego elementu div
z klasą .stripewrap
, atrybutem id
oraz atrybutem data-color
definiującym kolor bazowy.
To taki “mini-komponent”, który będzie utworzony dynamicznie, a potrzebuje jedynie unikalnego (przynajmniej na stronie) id oraz koloru bazowego.
|
|
Oddzielenie konstrukcji i używania
W kodzie javascript wyszukuję elementy po klasie .stripewrap
i dynamicznie dodaję do niego elementy: canvas, selektor i przycisk w metodzie generateGuiWithId(idstring)
- to etap konstrukcji “bebechów” mojego mini-komponentu.
Następnie te elementy przekazuję do konstruktora new Stripe(canvas, input, button , color)
- on statyczną strukturę uczyni żywym, “używalnym” obiektem reagującym na zdarzenia:
|
|
Dynamiczne konstruowanie elementów
A po co to wszystko?
Uparłam się, żeby na stronie było kilka pasków - wtedy łatwo mogę sprawdzić, czy kod związany z “obsługą” paska jest dobrze odizolowany, a samo konstruowanie paska - proste i przyjemne.
Gui paska generuję więc w metodzie generateGuiWithId(idname)
wyłącznie na podstawie identyfikatora id znalezionego diva o klasie .stripewrap
oraz związanego z nim atrybutu data-color (patrz atrybut dataset).
Całe “gui” to trzy elementy canvas, input i buton, którym ustawiam atrybut id jako połączenie id diva i napisu określającego element (“canvas”, “input” lub “button”):
|
|
Obiekt Stripe - obsługa zdarzeń
Po utworzeniu elementów (składowych komponentu) przekazuję je do konstruktora Stripe
, który “ożywia” komponent, czyli odpowiada za:
- zdefiniowanie metody
refresh()
rysującej paski losowej szerokości i kolorze - ustawienie tej metody jako handlera zdarzenia
onchange
w input orazonclick
w button - pierwsze narysowanie paska
|
|
I teraz można się w pełni rozkoszować wspaniałymi kolorowymi paskami (definicje kolorów wzięłam z wikipedii):