- Rough.js là một thư viện JavaScript gọn nhẹ để tạo đồ họa phong cách phác thảo như được vẽ bằng tay thay vì các hình số sắc nét
- Dù nhỏ với kích thước dưới 9kB khi nén gzip, thư viện vẫn xử lý được đường thẳng, đường cong, cung, đa giác, hình tròn, hình elip và cả SVG path
- Hỗ trợ cả Canvas và SVG với cùng một luồng API, nên có thể chọn
rough.canvas() hoặc rough.svg() tùy theo đối tượng render
- Ngoài kiểu tô mặc định hachure, thư viện còn hỗ trợ
solid, zigzag, cross-hatch, dots, sunburst, dashed, zigzag-line
- Có thể điều chỉnh độ rung của nét vẽ và mật độ phần tô bằng các tùy chọn như
roughness, bowing, strokeWidth, hachureAngle, hachureGap
Thư viện gọn nhẹ để vẽ hình phong cách vẽ tay
- Rough.js là thư viện JavaScript để tạo đồ họa phong cách phác thảo
- Kích thước thư viện dưới 9kB khi nén gzip
- Hỗ trợ cả các hình cơ bản và đường dẫn
- Đường thẳng
- Đường cong
- Cung
- Đa giác
- Hình tròn
- Hình elip
- SVG paths
- Có thể dùng cả Canvas và SVG làm đích render
Cài đặt và sử dụng cơ bản
npm install --save roughjs
- Trong mã, import
roughjs để sử dụng
import rough from 'roughjs';
- Với Canvas, tạo context bằng
rough.canvas() rồi vẽ hình
const rc = rough.canvas(document.getElementById('canvas'));
rc.rectangle(10, 10, 200, 200); // x, y, width, height
- Với SVG, tạo node bằng
rough.svg() rồi thêm vào SVG
const rc = rough.svg(svg);
let node = rc.rectangle(10, 10, 200, 200); // x, y, width, height
svg.appendChild(node);
- Cũng cung cấp API cơ bản để vẽ hình tròn, hình elip và đường thẳng
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
Điều chỉnh phần tô và biểu đạt kiểu phác thảo
- Phần tô được thiết lập bằng
fill và các tùy chọn liên quan
fill: 'red' dùng kiểu tô hachure màu đỏ
- Điều chỉnh độ dày các nét hachure bằng
fillWeight
- Thay đổi góc và khoảng cách hachure bằng
hachureAngle và hachureGap
- Có thể dùng kiểu tô đơn sắc với
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'
});
- Các kiểu tô được hỗ trợ gồm
hachure, solid, zigzag, cross-hatch, dots, sunburst, dashed, zigzag-line
- Độ rung của nét vẽ và cách thể hiện đường viền có thể thay đổi bằng các tùy chọn như
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 và tài liệu API
- Có thể vẽ chuỗi SVG path bằng
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 bình luận
Ý kiến trên Hacker News
RoughNotation(https://roughnotation.com/) cũng đáng tham khảo. Nó dùng RoughJS để hỗ trợ gạch chân, highlight, v.v.
Website của tôi cũng lấy cảm hứng một phần từ đây; chỉ cần rê chuột lên tiêu đề được highlight: https://muxup.com/
Tôi đã ghi lại cách triển khai tại https://muxup.com/2022q3/muxup-implementation-notes#randomly-generated-title-highlights, và nếu vào xem bạn sẽ thấy mã thực tế rất ít
Có thể đó là hành vi có chủ ý, nhưng nếu không thì để lại đây cho bạn tham khảo. Môi trường là Chrome/Linux
Các tài liệu liên quan:
Show HN: Sketchy-appearance interactive timeline made using RoughJS - https://news.ycombinator.com/item?id=29563678 - tháng 12/2021, 1 bình luận
Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=29555853 - tháng 12/2021, 23 bình luận
Show HN: Hand-drawn timelines using RoughJS - https://news.ycombinator.com/item?id=23998225 - tháng 7/2020, 1 bình luận
Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=22787187 - tháng 4/2020, 13 bình luận
Rough.js v4.0 – hand-drawn, sketchy graphics - https://news.ycombinator.com/item?id=22141526 - tháng 1/2020, 20 bình luận
Show HN: RoughJS – Create hand-drawn graphics using JavaScript - https://news.ycombinator.com/item?id=16571827 - tháng 3/2018, 92 bình luận
Show HN: Rough.js simple lib to create hand-drawn, sketchy, scribbly graphics - https://news.ycombinator.com/item?id=13662347 - tháng 2/2017, 1 bình luận
Wired Elements là bộ web component do cùng tác giả tạo ra, render theo phong cách phác thảo bằng Rough.js
Hoạt động với bất kỳ framework nào
https://wiredjs.com/
Tôi đang dùng nó cùng https://wiredjs.com khi tạo mockup tương tác. Ví dụ như dưới đây
https://edea-dev.gitlab.io/mockups/ (mã nguồn: https://gitlab.com/edea-dev/mockups)
https://otfn.development.fabcity.hamburg/git-pdm-mockups/
Làm tôi nhớ đến https://excalidraw.com/
Cập nhật: thực tế có những trường hợp như https://github.com/excalidraw/excalidraw/issues/362
Trước đây tôi từng tạo roughviz, một thư viện trực quan hóa dữ liệu dựa trên RoughJS
https://www.jwilber.me/roughviz/
Tác giả Preet cũng làm nhiều dự án thú vị khác, nên website này cũng đáng xem: https://shihn.ca/creations/
Tôi đã dùng Rough.js để triển khai trình tạo Sketchify của Boxy SVG (https://boxy-svg.com/ideas/23)
Điểm tôi đặc biệt thích ở Rough.js là nó có rất ít dependency và có thể chạy cả bên trong web worker
Một thư viện tuyệt vời. Tôi đã dùng nó khi tạo wrapper svg2roughjs để chuyển đổi file SVG thông thường sang phong cách phác thảo: https://github.com/fskpf/svg2roughjs
Rough.js rất cuốn hút. Tôi đang dùng nó để vẽ data grid tại https://www.vanillacomponents.com/
Tôi thích Rough.js. Tôi đã dùng nó khi tạo Sketchy Shapes có thể thêm vào dự án Hatch
Thay đổi tham số theo thời gian thực khá thú vị: https://hatch.one/@darrin/sketchy-shapes/edit