Bạn có thể thực hiện việc này với d3 mà không phụ thuộc vào hình ảnh bên ngoài, hình thu nhỏ SVG hoặc bất kỳ thứ gì trong DOM - chỉ cần d3.js.
Đây là số working fiddle. Việc thực hiện được giải thích dưới đây. Nhưng ngoài ra, đây là một mã số more advanced làm hoạt hình đường dẫn clip trên vòng cung đang phát triển. Kiểm tra its predecessor để xem mặt nạ trông như thế nào mà không bị cắt.
Trước tiên, bạn cần đại diện cho đồ họa dưới dạng mảng dữ liệu mà bạn liên kết với d3. Cụ thể, bạn cần có một màu sắc và một "dòng lệnh" (chuỗi bạn gán cho d như trong <path d="...">
Something như thế này:.
var segmentData = [
{ color:"#ED6000", cmd:"M42.6,115.3c5.2,1.5,11,2.4,16.8,2.4c1.1,0,2.7,0,3.7-0.1v-2.2c-7,0-13.1-1.3-18.8-3.6L42.6,115.3z" },
{ color:"#EF7D00", cmd:"M25.7,99.3c4.3,4.7,9.5,8.6,15.3,11.3l-1.4,3.8c-6.9-2.4-13.2-6.1-18.6-10.8L25.7,99.3z" },
{ color:"#F4A300", cmd:"M23.7,97c-5.2-6.4-8.8-14-10.3-22.4L2.9,75.7c2.9,10,8.5,18.9,15.8,25.9L23.7,97z" },
{ color:"#F7BC00", cmd:"M13,71.5c-0.2-2-0.4-4-0.4-6c0-10.7,3.4-20.6,9.2-28.8L9.4,28.3c-5.6,9-8.9,19.6-8.9,30.9 c0,4.6,0.6,9.1,1.6,13.5L13,71.5z" },
{ color:"#FFCF36", cmd:"M63,15.7V0.8c-1-0.1-2.5-0.1-3.7-0.1c-19.9,0-37.5,9.9-48.1,25l12.7,8.6C33.1,23,46,15.7,63,15.7z" }
];
Sau đó, bạn cần một sản phẩm nào <svg>
và có lẽ một <g>
bên trong nó, vào đó để vẽ đồ họa:
var svg = d3.select("body").append("svg")
.attr("width", 125)
.attr("height", 125);
var gauge = svg.append("g");
Sau đó, bạn sử dụng D3 ràng buộc để tạo ra các phân đoạn:
var segments = gauge.selectAll(".segment")
.data(segmentData);
segments.enter()
.append("path")
.attr("fill", function(d) { return d.color; })
.attr("d", function(d) { return d.cmd; });
này chỉ tạo ra gr aphic, nhưng không tô màu nó dựa trên giá trị số nguyên. Cho rằng, bạn có thể xác định một update
chức năng:
function update(value) {
segments
.transition()
.attr("fill", function(d, i) {
return i < value ? d.color : "#ccc";
})
}
Calling update(4)
sẽ tô màu tất cả ngoại trừ phân khúc cuối cùng. Gọi số update(0)
không màu (để tất cả màu xám).
Trong fiddle, cũng có chức năng tick()
gọi update
với giá trị mới trên cơ sở setTimeout, nhưng đó chỉ là bản demo.
Cuối cùng, nếu bạn muốn, bạn có thể bọc tất cả những mã tăng và tạo ra một thành phần tái sử dụng bằng cách làm theo những lời khuyên trong [bài viết này]. (http://bost.ocks.org/mike/chart/)
Cám ơn câu trả lời của bạn cho đến nay. Hy vọng rằng một người khác đến với một giải pháp d3. Nếu không, tôi phải chấp nhận một trong những câu trả lời của bạn. –