Node-REDでアニメーションをしたいと考えています。
GSAP – GreenSockというJSのライブラリがあるので、これとtemplateノードを組み合わせたら、下記の様なアニメーションができたのでやり方を紹介します。
全体のフロー
[{"id":"7ef639a1.33b0b8","type":"http response","z":"8ca241e2.b6049","name":"","statusCode":"","headers":{},"x":990,"y":660,"wires":[]},{"id":"46395fcb.69c27","type":"template","z":"8ca241e2.b6049","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<!DOCTYPE html>\n<html>\n\n<head>\n <meta charset=\"UTF-8\" />\n <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js\"></script>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/gsap/3.4.0/gsap.min.js\"></script>\n <style>\n body {\n margin: 0;\n padding: 0;\n display: flex;\n justify-content: center;\n overflow: hidden;\n background: #333;\n}\n\n.container {\n position: relative;\n width: 960px;\n height: 540px;\n\n background: #000;\n}\n\n{{{css}}}\n\n </style>\n</head>\n\n<body>\n <div class=\"container\">\n {{{html}}}\n \n </div>\n <script>\n \n gsap.to(\".box\", {\n duration: 3, // 秒指定\n x: 700,\n rotate: 360,\n repeat: -1, // 繰り返し指定\n ease: Cubic.easeInOut // 加減速の種類\n });\n \n \n </script>\n</body>\n\n</html>","output":"str","x":920,"y":620,"wires":[["7ef639a1.33b0b8"]]},{"id":"455b87a.312f078","type":"http in","z":"8ca241e2.b6049","name":"","url":"/anime","method":"get","upload":false,"swaggerDoc":"","x":750,"y":540,"wires":[["d1c544d2.9bb6a8"]]},{"id":"d1c544d2.9bb6a8","type":"function","z":"8ca241e2.b6049","name":"","func":"var html = \"\";\nvar css = \"\";\nvar top;\nvar left;\nvar color = \"white\";\n\nfor(i=1;i<10;i++){\n html += \"<div class=\\'rect\"+i+\" box\\'+></div>\\r\";\n top= i*30;\n left = i*10;\n css += \".rect\"+i+\"{width: 30px;height: 30px;display: block;position: absolute;background:\"+color+\";top:\"+top+\"px;left:\"+left+\"px;}\";\n\n}\n\nmsg.html= html;\nmsg.css = css;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":840,"y":580,"wires":[["46395fcb.69c27"]]}]
フローはこんな感じです。
GASPについてはこちらのサイトを参考にさせていただきました。
GSAP(GreenSock Animation Platform) -アニメーションライブラリのデファクトスタンダード – 第3章 応用・JavaScript関連技術 – [SMART]
フロー解説(functionノード)
まずはfunctionノード。
var html = ""; var css = ""; var top; var left; var color = "white"; for(i=1;i<10;i++){ html += "<div class=\'rect"+i+" box\'+></div>\r"; top= i*30; left = i*10; css += ".rect"+i+"{width: 30px;height: 30px;display: block;position: absolute;background:"+color+";top:"+top+"px;left:"+left+"px;}"; } msg.html= html; msg.css = css; return msg;
10個の四角形を表示させるHTMLとCSSですが、for文を使って自動で表示させています。
フロー解説(templateノード)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.4.0/gsap.min.js"></script> <style> body { margin: 0; padding: 0; display: flex; justify-content: center; overflow: hidden; background: #333; } .container { position: relative; width: 960px; height: 540px; background: #000; } {{{css}}} </style> </head> <body> <div class="container"> {{{html}}} </div> <script> gsap.to(".box", { duration: 3, // 秒指定 x: 700, rotate: 360, repeat: -1, // 繰り返し指定 ease: Cubic.easeInOut // 加減速の種類 }); </script> </body> </html>
Templateノードは、前のfunctionノードで生成したhtmlとcssを使っています。
最初、サニタイズされてうまくいきませんでしたが、
{{{ html }}}
のように、波括弧3個で囲むことによって、この問題は解決できました。
ちなみに、jqueryが入っていますが、このフローでは必要ありません。次回、AJAXを導入するために入れています。
以上でGASPのアニメーションをNode-REDから表示することができます。
まとめ
ということで、次回はこれをAJAXで変化できるようにしたいと考えています。