4 คะแนน โดย GN⁺ 2023-12-23 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Rough.js เป็นไลบรารี JavaScript ขนาดเบาสำหรับสร้างกราฟิก สไตล์สเก็ตช์ ที่ดูเหมือนวาดด้วยมือ แทนรูปทรงดิจิทัลคมกริบ
  • มีขนาดเล็ก ต่ำกว่า 9kB เมื่อ gzip แต่รองรับทั้งเส้น เส้นโค้ง ส่วนโค้ง รูปหลายเหลี่ยม วงกลม วงรี และแม้แต่ SVG path
  • รองรับทั้ง Canvas และ SVG ด้วยลำดับการใช้งาน API เดียวกัน จึงเลือก rough.canvas() หรือ rough.svg() ได้ตามเป้าหมายการเรนเดอร์
  • นอกจากการเติมพื้นแบบค่าเริ่มต้น hachure แล้วยังรองรับ solid, zigzag, cross-hatch, dots, sunburst, dashed, zigzag-line
  • ปรับความสั่นของเส้นและความหนาแน่นของการเติมพื้นได้ด้วยออปชันอย่าง roughness, bowing, strokeWidth, hachureAngle, hachureGap

ไลบรารีขนาดเบาสำหรับวาดรูปทรงสไตล์วาดมือ

  • Rough.js เป็นไลบรารี JavaScript สำหรับสร้างกราฟิกสไตล์สเก็ตช์
  • ขนาดไลบรารี ต่ำกว่า 9kB เมื่อ gzip
  • รองรับทั้งรูปทรงพื้นฐานและ path
    • เส้น
    • เส้นโค้ง
    • ส่วนโค้ง
    • รูปหลายเหลี่ยม
    • วงกลม
    • วงรี
    • SVG paths
  • เป้าหมายการเรนเดอร์สามารถใช้ได้ทั้ง Canvas และ SVG

การติดตั้งและการใช้งานพื้นฐาน

  • ติดตั้งด้วย npm
npm install --save roughjs
  • ในโค้ด ให้นำเข้า 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);
  • ยังมี API พื้นฐานสำหรับวาดวงกลม วงรี และเส้น
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 ความคิดเห็น

 
GN⁺ 2023-12-23
ความคิดเห็นจาก Hacker News
  • RoughNotation(https://roughnotation.com/) ก็น่าสนใจเช่นกัน รองรับการขีดเส้นใต้ ไฮไลต์ และอื่น ๆ โดยใช้ RoughJS
    เว็บไซต์ของฉันเองก็ได้แรงบันดาลใจบางส่วนจากที่นี่ ลองเอาเมาส์ไปวางเหนือหัวข้อที่ถูกไฮไลต์ได้เลย: 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, ความคิดเห็น 1 รายการ
    Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=29555853 - ธันวาคม 2021, ความคิดเห็น 23 รายการ
    Show HN: Hand-drawn timelines using RoughJS - https://news.ycombinator.com/item?id=23998225 - กรกฎาคม 2020, ความคิดเห็น 1 รายการ
    Rough.js – Create graphics with a hand-drawn, sketchy, appearance - https://news.ycombinator.com/item?id=22787187 - เมษายน 2020, ความคิดเห็น 13 รายการ
    Rough.js v4.0 – hand-drawn, sketchy graphics - https://news.ycombinator.com/item?id=22141526 - มกราคม 2020, ความคิดเห็น 20 รายการ
    Show HN: RoughJS – Create hand-drawn graphics using JavaScript - https://news.ycombinator.com/item?id=16571827 - มีนาคม 2018, ความคิดเห็น 92 รายการ
    Show HN: Rough.js simple lib to create hand-drawn, sketchy, scribbly graphics - https://news.ycombinator.com/item?id=13662347 - กุมภาพันธ์ 2017, ความคิดเห็น 1 รายการ

  • Wired Elements คือชุดเว็บคอมโพเนนต์จากผู้เขียนคนเดียวกัน และเรนเดอร์สไตล์สเก็ตช์ด้วย Rough.js
    ใช้งานได้กับทุกเฟรมเวิร์ก
    https://wiredjs.com/

  • กำลังใช้ร่วมกับ https://wiredjs.com ตอนทำ interactive mockup ตัวอย่างมีดังนี้
    https://edea-dev.gitlab.io/mockups/ (ซอร์ส: https://gitlab.com/edea-dev/mockups)
    https://otfn.development.fabcity.hamburg/git-pdm-mockups/

  • ทำให้นึกถึง https://excalidraw.com/

    • จากหน้านี้ดูเหมือนว่า Excalidraw รองรับไลบรารีนั้น ดังนั้นน่าจะใช้ภายใน
      อัปเดต: มีกรณีแบบนี้จริง เช่น https://github.com/excalidraw/excalidraw/issues/362
  • เมื่อก่อนเคยทำ ไลบรารีแสดงผลข้อมูล roughviz โดยใช้ RoughJS
    https://www.jwilber.me/roughviz/
    ผู้สร้างอย่าง Preet ก็ทำโปรเจกต์เจ๋ง ๆ ไว้อีกเยอะ ดังนั้นเว็บไซต์ของเขาก็น่าลองดูด้วย: https://shihn.ca/creations/

  • ใช้ Rough.js ในการทำ ตัวสร้าง Sketchify ของ Boxy SVG(https://boxy-svg.com/ideas/23)
    สิ่งที่ชอบเป็นพิเศษคือ Rough.js มี dependency น้อยมาก และ รันใน web worker ได้ด้วย

    • เอ๊ะ รองรับแค่เบราว์เซอร์ที่ใช้เอนจิน Chrome เหรอ
    • แล้ว Firefox Android ไม่รองรับเหรอ แปลกดี
  • เป็นไลบรารีที่ยอดเยี่ยม เคยใช้ตอนทำตัวห่อ svg2roughjs สำหรับ แปลงไฟล์ SVG ปกติให้เป็นสไตล์สเก็ตช์: https://github.com/fskpf/svg2roughjs

  • Rough.js มีเสน่ห์มาก กำลังใช้วาด data grid ที่ https://www.vanillacomponents.com/

  • ฉันชอบ Rough.js เคยใช้ตอนทำ Sketchy Shapes ที่เพิ่มเข้าไปในโปรเจกต์ Hatch ได้
    สนุกดีที่ลองปรับพารามิเตอร์แบบเรียลไทม์ได้: https://hatch.one/@darrin/sketchy-shapes/edit