canvas画圆环(一)之渐变色,纯色

通过canvas画可自定义纯色或渐变色的圆环,可当进度条使用,本文章做了简单的封装可直接使用,也可自定义更改

html结构

<div class="item-canvas">
          <canvas id="procanvas1" class="procanvas"></canvas>
</di>

需要设置外层的item-canvas的宽高,内层canvas会设置成和外层一样。

javascript

定义函数
function process() {
        var ring = arguments[0]; //获取传入的第一个参数
        var canvas = document.getElementById(ring.canvasId);
        var context = canvas.getContext('2d');
        var center = [(ring.canvasW) / 2, (ring.canvasH) / 2];
        var borderWidth = ring.bdWidth;
        var r = ring.canvasW / 2 - borderWidth / 2; //因内层canvas的宽度和外层相等,所以需要减去圆环的宽度
        context.clearRect(0, 0, ring.canvasW, ring.canvasH); //清除canvas
        //开始画一个灰色的圆
        context.save();
        context.beginPath();
        context.lineWidth = borderWidth;
        context.strokeStyle = ring.bgcolor;
        context.arc(center[0], center[1], r, 0, 2 * Math.PI, false);
        context.stroke();
        context.restore();
        //设置渐变色,做了简单的判断传入的是渐变色或者纯色
        if (ring.color) {
                var gradient = context.createLinearGradient(ring.x1, ring.y1, ring.x2, ring.y2);
                ring.color.forEach(element => {
                        gradient.addColorStop(element.step, element.color);
                });
                context.strokeStyle = gradient;
        }
        if (ring.strokeColor) {
                context.strokeStyle = ring.strokeColor;
        }
        /*此处是添加圆环内部的文字*/
        context.save();
        context.beginPath();
        context.font = "20px Georgia";
        context.textAlign="center"; //基于基线水平居中,垂直目前没好的方法,有请告知
        context.fillStyle = gradient;
        context.fillText(ring.percent+"%", center[0] , center[1] ); 
        context.restore();
        //外层圆环
        context.save();
        context.beginPath();
        context.lineWidth = borderWidth;
        context.arc(center[0], center[1], r, 0, 2 * ring.percent / 100 * Math.PI, false);
        context.lineCap = "round";
        context.stroke();
        context.restore();
}
简单封装
//测试用渐变色
var arr = [{
        step: '0',
        color: '#43e8ff'
}, {
        step: '0.4',
        color: '#8024db'
}, {
        step: '0.6',
        color: '#a044ff'
}, {
        step: '0.9',
        color: '#5205ce'
}, {
        step: '1',
        color: '#25c1fb'
}];
var divItem = document.querySelector(".item-canvas");
var canvasW = divItem.offsetWidth; //获取外层div宽高,然后赋值给canvas
var canvasH = divItem.offsetWidth;
process({
        canvasId: "procanvas1",  //canvas的Id
        canvasW: canvasW,        //canvas的width
        canvasH: canvasH,        //canvas的height
        bdWidth: 10,          //圆环的宽
        color: arr,              //渐变需要设置渐变的颜色及占用的百分比需要写小数
        bgcolor: "gray",         //圆环的背景颜色
        //strokeColor:"red",       //纯色,没渐变写
        x1: canvasW / 2,                   //渐变的起始位置和结束位置x1,y1,x2,y2
        y1: canvasH,
        x2: canvasW / 2,
        y2: 0,
        percent: 100,             //转过的百分比

})

效果如下图:
渐变色效果图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下使用 Canvas 绘制渐变色立方体的示例代码: ```html <!DOCTYPE html> <html> <head> <title>Canvas Gradient Cube</title> <style> canvas { border: 1px solid #000; } </style> </head> <body> <canvas id="myCanvas" width="400" height="400"></canvas> <script> var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); // 绘制立方体的六个面 drawFace(100, 100, 100, 200, 200, 200, "#ff0000", "#00ff00", "#0000ff"); // 前面 drawFace(0, 100, 100, 100, 200, 200, "#0000ff", "#00ff00", "#ff0000"); // 左面 drawFace(200, 100, 100, 300, 200, 200, "#00ff00", "#0000ff", "#ff0000"); // 右面 drawFace(100, 0, 100, 200, 100, 200, "#ff0000", "#0000ff", "#00ff00"); // 上面 drawFace(100, 200, 100, 200, 300, 200, "#ff0000", "#00ff00", "#0000ff"); // 下面 drawFace(100, 100, 0, 200, 200, 100, "#00ff00", "#ff0000", "#0000ff"); // 后面 // 绘制一个立方体面 function drawFace(x1, y1, z1, x2, y2, z2, color1, color2, color3) { // 计算面的中心点 var centerX = (x1 + x2) / 2; var centerY = (y1 + y2) / 2; var centerZ = (z1 + z2) / 2; // 开始绘制面 context.beginPath(); // 绘制面的左下角点 context.moveTo(projectX(x1, z1), projectY(y1, z1)); // 绘制面的其它三个点 context.lineTo(projectX(x2, z1), projectY(y1, z1)); context.lineTo(projectX(x2, z2), projectY(y2, z2)); context.lineTo(projectX(x1, z2), projectY(y2, z2)); // 使用渐变色填充面 var gradient = context.createLinearGradient(0, 0, 0, canvas.height); gradient.addColorStop(0, color1); gradient.addColorStop(0.5, color2); gradient.addColorStop(1, color3); context.fillStyle = gradient; context.fill(); // 结束绘制面 context.closePath(); } // 将 3D 坐标投影到 2D 平面上 function projectX(x, z) { return canvas.width / 2 + (x - canvas.width / 2) * (200 / (200 - z)); } function projectY(y, z) { return canvas.height / 2 - (y - canvas.height / 2) * (200 / (200 - z)); } </script> </body> </html> ``` 上述代码使用了三个颜色值,可以根据需要进行调整。同时,也可以根据需要修改立方体的大小和位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值