当前位置: 首页 > 知识库问答 >
问题:

如何在多画布html5上绘制圆圈?

胡向阳
2023-03-14

我想用javascript在响应画布上画一个圆圈。我得到了画布的宽度和高度,但由于div标签的宽度和高度%,我能够正确地画出圆圈。div标记的宽度和高度以%为单位,因为我想在单个页面上显示5个画布。是否有其他方法可以在一页上放置5块画布,并使用画布的高度和宽度在每个画布上画一个圆圈?还有一件事,我不想要绝对位置,因为根据浏览器的宽度,我想要改变画布的位置

图片:192.168。10.29/1.巴布亚新几内亚

CSS

.all
{
    width:30%;
    height:45%;
    float:left;
}

canvas
{
    width:100%;
    height:100%;
}

HTML

<div id='container'>
<div class='all'>
<canvas id='clock1' style="border:solid">
</div>
<div class='all'>
<canvas id='clock2' style="border:solid">
</div>
<div class='all'>
<canvas id='clock3' style="border:solid">
</div>
<div class='all'>
<canvas id='clock4' style="border:solid">
</div>
<div class='all'>
<canvas id='clock5' style="border:solid">
</div>
</div>

Javascript

function draw(canvasarray)
{

    var clock = document.getElementById(canvasarray);

    var style = getComputedStyle(document.getElementById(canvasarray));

    var height = parseInt(style.getPropertyValue("height"),10);
    var width = parseInt(style.getPropertyValue("width"),10);

    var radius = 0;

    console.log('Width : ' + width + ' Height : ' + height);

    if(width < height)
    {
        radius = width/2;
    }
    else
    {
        radius = height/2;
    }
    console.log('Radius : '+ radius);
    var ctx = clock.getContext('2d');
    ctx.beginPath();
    ctx.arc(width/2,height/2,radius,0,Math.PI*2);
    ctx.stroke();
}

共有1个答案

谷梁宏恺
2023-03-14

您可以首先使用所有画布定义数组:

/// store references to element directly - define in global scope
var canvasArray = [
    document.getElementById('clock1'),
    document.getElementById('clock2'),
    document.getElementById('clock3'),
    document.getElementById('clock4'),
    document.getElementById('clock5')
]

这将保留对每个时钟画布的引用,因此我们不必每次都查找它们。

然后参考你之前的问题,我们可以从绘制代码中分离出调整大小代码:

function resizeCanvases() {

    /// iterate array and update each canvas' bitmap according to CSS size
    for(var i = 0, c; c= canvasArray[i]; i++) {
        var style = getComputedStyle(c);
        c.width   = parseInt(style.getPropertyValue("width"),10);
        c.height  = parseInt(style.getPropertyValue("height"),10);
    }

    draw(canvasArray);
}

/// initial call when code starts
resizeCanvases();

/// update when window resizes (remember to redraw as well)
window.addEventListener('resize', resizeCanvases, false);

现在我们可以关注绘制代码:

function draw(clocks) {

    var clock,
        ctx,
        width, height,
        radius,
        i = 0;

    for(; clock = clocks[i]; i++) {

        /// get dimension of this canvas - remember to subtract line width
        width = clock.width;
        height = clock.height;

        /// get radius
        radius = Math.min(width, height) * 0.5;

        /// draw circle
        ctx = clock.getContext('2d');
        ctx.beginPath();
        ctx.arc(width/2,height/2,radius,0,Math.PI*2);
        ctx.stroke();
    }
}

然后打电话:

draw(canvasArray);

需要的时候。

最新消息

参考图像中的问题。我有这样的结果:

我稍微修改了你的CSS,但它不会影响外观,但会使回流效果更好:

.all
{
    width:30%;
    height:45%;
    display:inline-block;
    /*float:left;*/
}

以及:

html, body {
    width:100%;
    height:100%;
    margin:0;
    overflow:hidden;
}

尽管Chrome在Firefox和Opera中运行良好,但它似乎在CSS(或者getComputedStyle())方面存在问题。

在这里拉小提琴

希望这有帮助!

 类似资料:
  • 问题内容: 似乎没有绘制椭圆形形状的本机功能。我也不是在寻找蛋形。 是否可以绘制具有2个贝塞尔曲线的椭圆形?有人遇到过吗? 我的目的是画一些眼睛,实际上我只是使用弧线。提前致谢。 解 因此,scale()更改所有下一个形状的缩放比例。Save()之前保存设置,还原用于还原设置以绘制新形状而无需缩放。 感谢Jani 问题答案: 更新: 缩放方法可能会影响笔触宽度的外观 正确的缩放方法可以保持笔画宽度

  • 问题内容: 我需要知道如何在画布上绘制多边形。不使用jQuery或类似的东西。 问题答案: 使用和创建一个路径:

  • 我想在画布上画一段视频。为了实现这一点,我在Javascript中捕获onMouseDown和onMouseUp事件,以获得每个事件的x和y坐标(我需要在画布中设置视频的位置、宽度和高度)。 因此,每次我在画布上绘制视频时,我创建的上一个视频都应该停止,并且必须播放新的视频。两个问题: 1)视频不播放(功能只画第一帧),但他的音频可以 2) 如何停止以前绘制的视频? 演示:http://jsfid

  • 实际上,我可以使用函数来完成。我从“HTML5画布-如何在图像背景上画一条线?”中得到的东西。但是我需要在不使用from函数的情况下绘制图像,如下所示:

  • 问题内容: 我发现只能填充矩形,而没有圆角,该怎么办? 问题答案: HTML5画布没有提供绘制带有圆角的矩形的方法。 如何使用和方法? 您也可以使用方法代替方法。

  • 问题内容: 是否有将SVG文件绘制到HTML5画布上的默认方法?GoogleChrome支持将SVG加载为图像(并简单地使用),但是开发者控制台会对此进行警告。 我知道将SVG转换为canvas命令的可能性,但是我希望这不是必需的。我不在乎较旧的浏览器(因此,如果FireFox 4和IE 9支持某些功能,那就足够了)。 问题答案: 编辑2019年12月16日 现在所有主要浏览器都支持Path2D