Hướng dẫn SVG
(svg-tutorial.com)- Đây là tài liệu học SVG để vẽ hình ảnh trực tiếp bằng mã trong HTML, có thể theo dõi từng bước từ các hình cơ bản đến tương tác
- Lộ trình học đi từ các phần tử nền tảng như
viewBox,polygon,polyline, rồi mở rộng sangpath, đường cong Bézier và arc - Phần biến đổi đề cập đến xoay, di chuyển, tái sử dụng, scale và biến đổi tổng quát; phần CSS kết nối đến animation, hover, animation dựa trên đường dẫn và SVG inline trong CSS
- Các chủ đề nâng cao bao gồm văn bản,
clip-path, gradient; phần JavaScript cho thực hành với đồng hồ hiển thị thời gian thực, tương tác, sơ đồ dựa trên dữ liệu và tách thành nhiều component - Cũng cung cấp liên kết trình chỉnh sửa cho
line,circle,rect,polyline,polygon,textcùng quadratic/cubic Bézier curve và arc, giúp thử nghiệm ngay theo từng phần tử
Cấu trúc hướng dẫn
- TLDR: SVG Tutorial Summary: Tóm tắt toàn bộ hướng dẫn
-
Cơ bản về SVG
-
Phần tử path
-
Biến đổi
-
SVG và CSS
-
Chủ đề nâng cao
-
SVG và JavaScript
Các phần tử SVG và path segment để thực hành
- Có thể thử nghiệm ngay các hình cơ bản bằng trình chỉnh sửa theo từng phần tử SVG
- Phần tử
pathtạo nên các hình dạng phức tạp từ nhiều path segment
1 bình luận
Ý kiến trên Hacker News
Sự kết hợp SVG + React đang bị đánh giá thấp. Bạn có thể tận dụng nguyên vẹn lớp trừu tượng và sức mạnh của React, nhưng thay vì render DOM thì render đồ họa tùy ý; với một số mục đích như render đồ thị hay biểu đồ, tôi nghĩ nó tốt hơn Canvas rất nhiều
Đặc biệt phù hợp khi bạn không cần những thứ phức tạp về đồ họa như thao tác từng pixel mà chỉ cần một chút tương tác. Trong Canvas, để tạo hiệu ứng hover, bạn phải tự tính xem chuột đang ở trên phần tử nào nên khá phiền, còn với SVG thì chỉ cần dùng các tính năng tích hợp sẵn như
onmouseoverSẽ rất tốt nếu có ví dụ hoạt động nào đó để định hướng hoặc truyền cảm hứng
Nhìn chung đây là tài liệu tuyệt vời và các ví dụ thật sự rõ ràng. Tuy nhiên, ở phần clip-path, đoạn code được đề xuất mô tả vòng tròn lớn hai lần, nên nếu muốn đổi kích thước vòng tròn thì phải sửa ở hai chỗ
Vì đã dùng
defs, tôi nghĩ viết theo kiểu tái sử dụng cùng một định nghĩa sẽ tốt hơnclipPathlà đượcCá nhân tôi cũng muốn bỏ cả việc bọc bằng
<g>. Tôi chưa bao giờ hiểu lý do khuyến nghị cấu trúc như vậy, và ngoài những trường hợp cực hiếm khi muốn đặt vào một phần tử sẽ được render nếu không nằm trong<defs>, tôi không thấy nó mang lại gì. Với tình huống nhưdefs/circletrong ví dụ thì thường nên dùng<symbol>Thật tuyệt. SVG là một định dạng gọn gàng và linh hoạt; nó liên quan trực tiếp đến side project tôi đang làm nên tôi định dành thời gian làm theo tutorial này
Giống như những người khác, tôi thấy việc tạo component React dựa trên SVG khá thú vị. React và JSX giúp dễ thêm tương tác, còn SVG cho phép tạo những UI mà chỉ với HTML thì không dễ làm được
Tôi từng công khai một component React để render Circle of Fifths tương tác cho side project về nhạc lý. Vẫn còn nhiều việc phải làm nhưng đã dùng được: https://github.com/epiccoleman/react-circle-of-fifths
Tôi cũng viết một bài về quá trình tạo Circle of Fifths bằng SVG, và đặc biệt thích phần giải thích trung gian khi đi qua quá trình vẽ các phần tử phức tạp: https://epiccoleman.com/posts/2023-04-05-svg-circle-of-fifth...
Hiện tôi đang làm một trình tạo sơ đồ cần đàn theo cách tương tự, và việc có thể xem lại bài viết cũ như tài liệu tham khảo rất hữu ích. Điểm hay của việc ghi lại quá trình làm là bạn có thể “phát lại” cách mình đã giải quyết vấn đề
Tôi thích tài liệu này. Tôi đã tạo vài SVG inline trong React và thêm tương tác, chơi với nó thật sự rất vui
Đặc biệt thẻ
<foreignObject>rất hữu ích. Nó cho phép đưa HTML thông thường vào trong SVG, nên bạn có thể xử lý trong một dự án nghệ thuật SVG những việc mà HTML làm tốt hơn, như liên kết, hình ảnh và styling flexbox cơ bảnGửi thêm tới tác giả: một số liên kết trên site không hoạt động. bio.link ở cuối trang và liên kết demo đường cong Bézier tương tác trong Day 11 “How to Draw Quadratic Bézier Curves with SVG” đều đang chết
Còn phía bio.link thì tôi không thấy vấn đề; tôi tò mò bạn thấy lỗi gì
/svg/pathnên bị 404; có vẻ liên kết đúng là/svg/useTôi cũng không biết
foreignObject, mà nó thật sự hayVài năm trước, khi làm giao diện, tôi có dùng SVG cho một phần đồ họa. Có hai color scheme, nhưng một đồ họa chỉ có ở một scheme, nên tôi đi sang bên kia hành lang để lấy mã hex của màu còn lại
Tôi đã rất ngạc nhiên khi thấy designer mở file SVG và chỉ cần tìm rồi thay toàn bộ màu để tạo ra phiên bản màu thứ hai
Tuyệt vời. Tôi đặc biệt thích các ví dụ về đường cong và clipping, những thứ tôi vẫn còn thấy khó
Cá nhân tôi thích
path, vì nó có thể làm gần như mọi thứ và ít dài dòng hơn các cách khácTôi đã học khá lâu nhưng vẫn cảm thấy còn nhiều thứ phải học. Vì tôi vẽ rất tệ và cũng không thích ảnh lắm, nên vì sự tiện lợi và hiệu năng, tôi đã làm toàn bộ side project bằng SVG
Sau khi xem tài liệu hôm nay, có lẽ tôi sẽ phải refactor khá nhiều: https://eddiots.com/1
Cảm ơn những phản hồi tốt, và tôi đã sửa vài lỗi được chỉ ra. Nếu vẫn còn chỗ nào chưa ổn thì mong mọi người cho biết. Hiện vẫn đang tinh chỉnh nốt phần cuối
Chẳng hạn có ai biết vì sao phần xem trước thumbnail trên Twitter không hoạt động không? Ở các trang con thì hoạt động tốt
Rất hay. Vấn đề tôi đang vật lộn hiện giờ là văn bản + hình ảnh, nên nếu có một hai ví dụ liên quan thì tốt
Căn chỉnh thật sự rất đau đầu. Tôi cũng đã thử Inkscape, nhưng để tạo thứ mình cần thì rõ ràng gần với việc “tự viết XML” hơn
Tôi biết
text-anchor: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/t...Và có người gợi ý rằng thẻ
foreignObjectcó thể hữu ích ở đây: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/for...svgwrite, và việc đặt văn bản vào đúng vị trí mình muốn đúng là địa ngụcCuối cùng tôi chỉ hiệu chỉnh đại khái nhiều giá trị rồi chốt kiểu “thế này là đủ”. Tôi đồng ý với yêu cầu cần có ví dụ về bố cục văn bản không tầm thường
[0] Liên kết GitHub nằm trong hồ sơ
ctrl+shift+xrồi nhập tọa độ trực tiếpTrình chỉnh sửa XML của Inkscape trên môi trường của tôi khá hay bị crash, nhưng nếu nhớ lưu mỗi lần chỉnh sửa thì vẫn dùng được
Thường thì mọi người làm thế nào? Người ta code SVG trực tiếp, hay vẽ ở Figma chẳng hạn rồi tạo tệp SVG?
Để giảm kích thước tệp ở http://shapeoko.github.io/Docs/ xuống mức hợp lý thì cần khá nhiều công sức
Về sau tôi cũng tạo cơ chế để khi bấm vào hình ảnh thì nó mở trong cửa sổ mới: http://shapeoko.github.io/Docs/content/tPictures/PS20028-100...
Và còn có thể làm cho khi bấm tên linh kiện trong danh sách linh kiện thì linh kiện tương ứng được tô nổi bật trong sơ đồ
Với các hình dạng hoặc đường cong phức tạp, thỉnh thoảng tôi đưa vào trình chỉnh sửa online để trực quan hóa; công cụ này khá tốt: https://yqnn.github.io/svg-path-editor/
Nếu cần mũi tên hay biểu tượng menu hamburger, tôi có thể đi thẳng vào code. Đôi khi bắt đầu bằng giấy và bút, rồi chỉnh tọa độ cho đến khi nhìn đủ ổn
Thỉnh thoảng một trang tĩnh cụ thể cần đồ họa riêng nên tôi nhúng vào trong trang, nhưng đồ họa trong những trường hợp đó cũng không quá phức tạp
Một điều gần đây tôi nhận ra là trong ứng dụng React có thể đặt thẻ SVG inline như thẻ JSX
Tôi không biết chính xác đây có phải hỗ trợ hạng nhất hay do Webpack xử lý, nhưng trong một số trường hợp cảm giác tạo component SVG có logic bên trong rất tuyệt. Giờ có thể thay đổi hình dạng, màu sắc và việc lược bỏ một số phần của SVG bằng logic dựa trên React
Nhưng nếu đưa mã SVG inline, trình duyệt không thể cache hình ảnh. Nếu SVG lớn hoặc chỉ có vài biến thể, có thể tốt hơn là tạo endpoint riêng cho từng biến thể ảnh
https://chat.openai.com/share/49e91be6-bdef-4f4d-a263-80a884...
Một trong các ví dụ của tutorial này cũng là sơ đồ dựa trên dữ liệu được tạo trong React. Kết hợp hai thứ này có thể làm được khá nhiều điều thú vị