- Rough.jsは、くっきりしたデジタル図形の代わりに、手で描いたようなスケッチスタイルのグラフィックを作る軽量な JavaScript ライブラリ
- gzip 圧縮時で 9kB 未満と小さいが、線・曲線・弧・多角形・円・楕円と SVG pathまで扱える
- 同じ API フローで Canvas と SVG の両方をサポートし、描画対象に応じて
rough.canvas() または rough.svg() を選べる
- 標準の塗りつぶしである hachure のほか、
solid, zigzag, cross-hatch, dots, sunburst, dashed, zigzag-line をサポート
roughness, bowing, strokeWidth, hachureAngle, hachureGap などのオプションで、線の揺らぎや塗りの密度を調整できる
手描き風図形を描く軽量ライブラリ
- Rough.jsは、スケッチ風グラフィックを作るための JavaScript ライブラリ
- ライブラリのサイズは gzip 圧縮時で 9kB 未満
- 基本図形とパスをあわせてサポート
- 描画先として Canvas と SVG の両方を利用可能
インストールと基本的な使い方
npm install --save roughjs
import rough from 'roughjs';
- Canvas では
rough.canvas() でコンテキストを作成して図形を描画
const rc = rough.canvas(document.getElementById('canvas'));
rc.rectangle(10, 10, 200, 200); // x, y, width, height
- SVG では
rough.svg() でノードを作成し、SVG に追加
const rc = rough.svg(svg);
let node = rc.rectangle(10, 10, 200, 200); // x, y, width, height
svg.appendChild(node);
rc.circle(80, 120, 50); // centerX, centerY, diameter
rc.ellipse(300, 100, 150, 80); // centerX, centerY, width, height
rc.line(80, 120, 300, 100); // x1, y1, x2, y2
塗りつぶしとスケッチ表現の調整
- 塗りつぶしは
fill と関連オプションで設定
fill: 'red' は赤い hachure 塗りつぶしを使用
fillWeight で hachure 線の太さを調整
hachureAngle と hachureGap で hachure の角度と間隔を変更
fillStyle: 'solid' で単色塗りつぶしを使用可能
rc.circle(50, 50, 80, { fill: 'red' });
rc.rectangle(120, 15, 80, 80, { fill: 'red' });
rc.circle(50, 150, 80, {
fill: "rgb(10,150,10)",
fillWeight: 3
});
rc.rectangle(220, 15, 80, 80, {
fill: 'red',
hachureAngle: 60,
hachureGap: 8
});
rc.rectangle(120, 105, 80, 80, {
fill: 'rgba(255,0,200,0.2)',
fillStyle: 'solid'
});
- 対応する塗りつぶしスタイルは
hachure, solid, zigzag, cross-hatch, dots, sunburst, dashed, zigzag-line
- 線の揺らぎや輪郭表現は
roughness, bowing, stroke, strokeWidth などのオプションで変更できる
rc.rectangle(15, 15, 80, 80, { roughness: 0.5, fill: 'red' });
rc.rectangle(120, 15, 80, 80, { roughness: 2.8, fill: 'blue' });
rc.rectangle(220, 15, 80, 80, { bowing: 6, stroke: 'green', strokeWidth: 3 });
SVG path と API ドキュメント
- SVG path 文字列は
rc.path() で描画できる
rc.path('M80 80 A 45 45, 0, 0, 0, 125 125 L 125 80 Z', { fill: 'green' });
rc.path('M230 80 A 45 45, 0, 1, 0, 275 125 L 275 80 Z', { fill: 'purple' });
rc.path('M80 230 A 45 45, 0, 0, 1, 125 275 L 125 230 Z', { fill: 'red' });
rc.path('M230 230 A 45 45, 0, 1, 1, 275 275 L 275 230 Z', { fill: 'blue' });
1件のコメント
Hacker Newsの意見
RoughNotation(https://roughnotation.com/)も参考になります。RoughJSを使って下線やハイライトなどをサポートしています
私のWebサイトもここから一部インスピレーションを受けていて、ハイライトされたタイトルにマウスを乗せてみるとわかります: https://muxup.com/
実装方法はhttps://muxup.com/2022q3/muxup-implementation-notes#randomly-generated-title-highlightsにまとめてあり、見てみると実際のコードは本当に少ないことがわかります
意図した動作かもしれませんが、そうでないなら参考までに。環境はChrome/Linuxです
関連資料:
Show HN: Sketchy-appearance interactive timeline made using RoughJS - https://news.ycombinator.com/item?id=29563678 - 2021年12月、コメント1件
Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=29555853 - 2021年12月、コメント23件
Show HN: Hand-drawn timelines using RoughJS - https://news.ycombinator.com/item?id=23998225 - 2020年7月、コメント1件
Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=22787187 - 2020年4月、コメント13件
Rough.js v4.0 – hand-drawn, sketchy graphics - https://news.ycombinator.com/item?id=22141526 - 2020年1月、コメント20件
Show HN: RoughJS – Create hand-drawn graphics using JavaScript - https://news.ycombinator.com/item?id=16571827 - 2018年3月、コメント92件
Show HN: Rough.js simple lib to create hand-drawn, sketchy, scribbly graphics - https://news.ycombinator.com/item?id=13662347 - 2017年2月、コメント1件
Wired Elementsは同じ作者が作ったWeb Componentsのコレクションで、Rough.jsでスケッチ風にレンダリングします
どのフレームワークでも動作します
https://wiredjs.com/
インタラクティブなモックアップを作るときにhttps://wiredjs.comと一緒に使っています。例は以下のとおりです
https://edea-dev.gitlab.io/mockups/(ソース: https://gitlab.com/edea-dev/mockups)
https://otfn.development.fabcity.hamburg/git-pdm-mockups/
https://excalidraw.com/を思い出します
更新: 実際にhttps://github.com/excalidraw/excalidraw/issues/362のような事例があります
以前、RoughJSベースでデータ可視化ライブラリroughvizを作りました
https://www.jwilber.me/roughviz/
作者のPreetはほかにも素晴らしいプロジェクトをたくさん手がけているので、サイトもチェックする価値があります: https://shihn.ca/creations/
Boxy SVGのSketchifyジェネレーター(https://boxy-svg.com/ideas/23)の実装にRough.jsを使いました
Rough.jsは依存関係が非常に少なく、Web Worker内でも実行できる点が特に良いです
素晴らしいライブラリです。通常のSVGファイルをスケッチ風に変換するsvg2roughjsラッパーを作るときに使いました: https://github.com/fskpf/svg2roughjs
Rough.jsはとても魅力的です。https://www.vanillacomponents.com/でデータグリッドを描画するのに使っています
Rough.jsが好きです。Hatchプロジェクトに追加できるSketchy Shapesを作るときに使いました
パラメータをリアルタイムで変えてみるのが楽しいです: https://hatch.one/@darrin/sketchy-shapes/edit