Interaktivita SVG + JavaScript Cvičení 3 Z8144 Počítačová grafika v kartografii Jaro 2021 Filip Leitner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rozvrh Minimum 60% bodov Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 2 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ”Use strict” Zbavuje JavaScript niektorých nástrah - upozorní na chyby Disallows global variables. (Catches missing var declarations and typos in variable names) Silent failing assignments will throw error in strict mode (assigning NaN = 5;) Attempts to delete undeletable properties will throw (delete Object.prototype) Requires all property names in an object literal to be unique (var x = x1: ”1”, x1: ”2”) Function parameter names must be unique (function sum (x, x) ...) Forbids octal syntax (var x = 023; some devs assume wrongly that a preceding zero does nothing to change the number.) Forbids the with keyword Forbids deleting plain names (delete x;) Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 3 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ”Postrehy” Obecnejší kód ... cx:${randomPosition(x, y)}; const randomPosition = (min, max) => { return Math.random() * (max - min) + min; }; function randomMove(x){ x.style.cx=Math.random() * 580 - 60; x.style.cy=Math.random() * 580 - 60 ; }; Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 4 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ”Postrehy” Zamedzenie duplicity const circ1 = document.getElementById("circle1"); const circ2 = document.getElementById("circle2"); circ1.addEventListener("click", moveit); circ2.addEventListener("click", moveit); document.querySelectorAll('circle').forEach(circle => { circle.addEventListener('click',moveIt) }) Komentujte kód Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 5 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základní tvary rectangle rect obdélník/čtverec circle circle kruh ellipse ellipse elipsa line line úsečka polygon polygon polyline polyline lomená čára path path trasa text text Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 6 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trasa Path Velká písmena – absolutní pozice malá písmena – relativní pozice moveto M(x y) (posun do bodu x y) closepath Z (uzavření trasy) lineto L(x y) (vykreslí čáru do bodu x y) horizontal lineto H(x) (horizontální čára až do) vertical lineto V(y) (svislá čára) curveto C(x1 y1 x2 y2 x y) smooth curveto S(x2 y2 x y) quadratic Bézier curve Q(x1 y1 x y) smooth quadratic Bézier curveto T(x y) elliptical Arc A(…) (eliptická výšeč/úseč) http://www.w3.org/TR/SVG/paths.html Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 7 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trasa – příklad 1 ^^I ^^I ^^I ^^I Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 8 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trasa – příklad 2 ^^I Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 9 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trasa – příklad 3 ^^I Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 10 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JavaScript – základní eventy (události) HTML atribut název eventu akce onclick click kliknutí myší onmousedown mousedown stisknutí tlačítka myši onmouseup mouseup uvolnění tlačítka myši onmouseover mouseover najetí myší na prvek onmouseout mouseout odjetí myší z prvku onkeydown keydown stisk klávesy onkeyup keyup konec stisku klávesy Rozdíly mezi eventy click, mousedown, mouseup viz https://stackoverflow.com/a/14805233. Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 11 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . onclick
^^I

Testovací div

Příklad: https://codepen.io/LeSimon/pen/ywgovB Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 12 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . onmouseover / onmouseout function testmouseover(element){ ^^Ielement.style.backgroundColor='green'; }; function testmouseout(element){ ^^Ielement.style.backgroundColor='red'; };
^^I

Testovací div

Příklad: https://codepen.io/LeSimon/pen/oVBeqe Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 13 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . onkeydown / onkeyup function testKeyUp(event){ ^^Ievent.target.style.backgroundColor='red'; } function testKeyDown(event){ ^^Ievent.target.style.backgroundColor='green'; } document.getElementById("input").addEventListener("keyup", testKeyUp); document.getElementById("input").addEventListener("keydown", testKeyDown); Příklad: https://codepen.io/LeSimon/pen/ywgoEL Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 14 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Array methods and iterations let myArray = [2, 'Pete', 2.99, 'another string']; let cars = [{"color": "purple","type": "minivan"}, {"color": "red","type": "station wagon",}] Methods Converting Arrays to Strings - toString(), join() ...pop, push, delete , splice, concat Iterations forEach(), map(), filter(), includes(), some(), every(), findIndex() Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 15 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. úkol https://gist.github.com/FilipLeitner/bdbc65b4f1e87bdb162189fd1194916b Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 16 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. úkol V SVG: Vytvořte mapové pole, které bude obsahovat smyšlený stát a jeho kraje (alespoň 5 krajů). Toto mapové pole (obrysy jednotlivých krajů) vytvořte pomocí tras. Použijte i křivky nebo kruhové výseče. Jednotlivým „krajům“ přidejte atribut ”data-population”, který bude obsahovat fiktivní data o populaci. Výsledek si uložte někam na disk (budeme s ním dále pracovat). Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 17 / 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. úkol Přidejte interaktivitu této „mapě“. Pomocí JavaScriptu (mimo SVG) nastavte ”mouseover” a ”mouseout” event. Po najetí myší na libovolný „kraj“ by se tento kraj měl zabarvit definovanou barvou (vyberte si vlastní). Zároveň by se někde na stránce měl zobrazit údaj o populaci daného kraje. Pokud jste správně nastavili atribut data-population, dostanete se k němu v JS pomocí element.dataset.population Po odjetí myší by se měl obnovit původní vzhled kraje a informace o populaci zmizí. Úkol odevzdávejte jako jeden HTML soubor nebo archiv .zip Termín odevzdání 14.3 4:00, max. 10 b. Filip Leitner Interaktivita SVG + JavaScript Počítačová grafika 18 / 19 Díky za pozornost! . . . . . . . . . . . . . . . . . . . .