- Rough.js é uma biblioteca JavaScript leve para criar gráficos em estilo de esboço, como se fossem desenhados à mão, em vez de formas digitais perfeitamente nítidas
- Mesmo pequena, com menos de 9 kB gzipada, ela consegue lidar com linhas, curvas, arcos, polígonos, círculos, elipses e até SVG path
- Suporta tanto Canvas quanto SVG com o mesmo fluxo de API, permitindo escolher
rough.canvas() ou rough.svg() conforme o destino de renderização
- Além do preenchimento padrão hachure, também oferece suporte a
solid, zigzag, cross-hatch, dots, sunburst, dashed e zigzag-line
- Opções como
roughness, bowing, strokeWidth, hachureAngle e hachureGap permitem ajustar a irregularidade das linhas e a densidade do preenchimento
Biblioteca leve para desenhar formas em estilo feito à mão
- Rough.js é uma biblioteca JavaScript para criar gráficos em estilo de esboço
- O tamanho da biblioteca é de menos de 9 kB gzipada
- Suporta formas básicas e caminhos
- linhas
- curvas
- arcos
- polígonos
- círculos
- elipses
- SVG paths
- Como destino de renderização, é possível usar tanto Canvas quanto SVG
Instalação e uso básico
npm install --save roughjs
- No código, importe e use
roughjs
import rough from 'roughjs';
- No Canvas, crie um contexto com
rough.canvas() e então desenhe as formas
const rc = rough.canvas(document.getElementById('canvas'));
rc.rectangle(10, 10, 200, 200); // x, y, width, height
- No SVG, crie um nó com
rough.svg() e adicione-o ao SVG
const rc = rough.svg(svg);
let node = rc.rectangle(10, 10, 200, 200); // x, y, width, height
svg.appendChild(node);
- Também são fornecidas APIs básicas para desenhar círculos, elipses e linhas
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
Ajuste de preenchimento e da expressão de esboço
- O preenchimento é configurado com
fill e opções relacionadas
fill: 'red' usa preenchimento hachure vermelho
fillWeight ajusta a espessura das linhas hachure
hachureAngle e hachureGap alteram o ângulo e o espaçamento do hachure
fillStyle: 'solid' permite usar preenchimento de cor sólida
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'
});
- Os estilos de preenchimento suportados são
hachure, solid, zigzag, cross-hatch, dots, sunburst, dashed e zigzag-line
- A irregularidade das linhas e a expressão dos contornos podem ser alteradas com opções como
roughness, bowing, stroke e 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 e documentação da API
- Strings de SVG path podem ser desenhadas com
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 comentários
Opiniões no Hacker News
RoughNotation(https://roughnotation.com/) também vale conferir. Usa RoughJS para dar suporte a sublinhados, destaques etc.
Meu site também se inspirou em parte nisso; basta passar o mouse sobre o título destacado: https://muxup.com/
Resumi a implementação em https://muxup.com/2022q3/muxup-implementation-notes#randomly-generated-title-highlights; ao entrar lá, dá para ver que o código real é bem pequeno
Pode ser o comportamento intencional, mas deixo o registro caso não seja. Meu ambiente é Chrome/Linux
Materiais relacionados:
Show HN: Sketchy-appearance interactive timeline made using RoughJS - https://news.ycombinator.com/item?id=29563678 - dezembro de 2021, 1 comentário
Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=29555853 - dezembro de 2021, 23 comentários
Show HN: Hand-drawn timelines using RoughJS - https://news.ycombinator.com/item?id=23998225 - julho de 2020, 1 comentário
Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=22787187 - abril de 2020, 13 comentários
Rough.js v4.0 – hand-drawn, sketchy graphics - https://news.ycombinator.com/item?id=22141526 - janeiro de 2020, 20 comentários
Show HN: RoughJS – Create hand-drawn graphics using JavaScript - https://news.ycombinator.com/item?id=16571827 - março de 2018, 92 comentários
Show HN: Rough.js simple lib to create hand-drawn, sketchy, scribbly graphics - https://news.ycombinator.com/item?id=13662347 - fevereiro de 2017, 1 comentário
Wired Elements é uma coleção de Web Components feita pelo mesmo autor e renderiza em estilo de esboço com Rough.js
Funciona em qualquer framework
https://wiredjs.com/
Estou usando junto com https://wiredjs.com para criar mockups interativos. Exemplos abaixo
https://edea-dev.gitlab.io/mockups/ (fonte: https://gitlab.com/edea-dev/mockups)
https://otfn.development.fabcity.hamburg/git-pdm-mockups/
Lembra https://excalidraw.com/
Atualização: na prática, há casos como https://github.com/excalidraw/excalidraw/issues/362
Há algum tempo criei o roughviz, uma biblioteca de visualização de dados baseada em RoughJS
https://www.jwilber.me/roughviz/
O autor, Preet, também fez muitos outros projetos legais, então vale conferir o site dele: https://shihn.ca/creations/
Usei Rough.js para implementar o gerador Sketchify do Boxy SVG (https://boxy-svg.com/ideas/23)
Gosto especialmente do fato de Rough.js ter pouquíssimas dependências e poder rodar também dentro de Web Workers
É uma ótima biblioteca. Usei para criar o wrapper svg2roughjs, que converte arquivos SVG comuns para estilo de esboço: https://github.com/fskpf/svg2roughjs
Rough.js é muito atraente. Estou usando para desenhar um data grid em https://www.vanillacomponents.com/
Gosto de Rough.js. Usei para criar Sketchy Shapes, que pode ser adicionado ao projeto Hatch
É divertido alterar os parâmetros em tempo real: https://hatch.one/@darrin/sketchy-shapes/edit