JavaScript 动态调整 HTML5 Canvas 大小

更新日期: 2023-12-08阅读: 572标签: Canvas
如何在窗口大小改变时自动调整画布大小?

通常, html5 canvas元素能够动态更改大小以更好地适应当前窗口是很有用的,例如在运行全屏基于画布的浏览器游戏时窗口恢复向下时。本教程将讨论一种使用普通 JavaScript 来实现此目的的简单技术,特别关注我们希望画布尽可能大,同时适合调整大小的窗口的情况。请注意,本教程假设您对 HTML5 画布有基本的了解 - 如果您不熟悉它,请考虑查看本教程,了解画布的基本用法。

首先,我们需要确保画布上绘制的所有内容都使用画布宽度和/或高度的分数来调整大小和位置,而不是以像素为单位指定大小或位置。这样,在调整画布大小时,更容易保持相对间距和大小一致。

var circleX = canvas.width/16;
var circleY = canvas.height/8;
var circleRad = canvas.height/32;

如果我们在画布上写有任何文本元素,我们需要确保我们的字体大小也被指定为宽度和/或高度的分数。

var txtFnt = Math.round(canvas.height/32)+"px monospace";

现在,我们需要一种方法来检测窗口大小何时发生变化。我们可以使用window对象的addEventListener方法来做到这一点。

window.addEventListener("resize", resizeCanvas, false);

第一个参数指定正在侦听的事件类型,在本例中resize为窗口级别的事件。第二个参数指定发生此类事件时要调用的函数(我们将resizeCanvas很快定义我们的函数)。第三个参数useCapture确定有嵌套元素侦听同一事件时要使用的顺序。在我们仅指定一个侦听器的简单示例中,我们可以坚持使用默认false值。

现在,当调整窗口大小时,我们的resizeCanvas函数将被触发。在这个函数中,我们首先需要调整canvas.width和canvas.height参数以适应新窗口。虽然我们可以将它们设置为匹配窗口的新宽度和高度,但如果新窗口的宽高比与原始画布的宽高比显着不同,这可能会导致问题。相反,我们可以尝试在调整大小的画布中保持与原始画布相同的宽高比,因此画布上绘制的任何内容仍将按预期显示。

在下面的示例中,我们尝试最大化画布尺寸,同时保持 16:9 的宽高比。如果新窗口高度大于或等于新窗口宽度的 (9/16) 倍,那么我们知道我们可以将画布的宽度设置为等于窗口宽度,然后能够将画布的高度设置为(9/16)*canvas.width同时仍适合新窗口。否则,我们知道可用的窗口宽度必须大于新窗口高度的(16/9)倍,因此我们可以将画布高度设置为等于新窗口高度,然后将画布宽度设置为等于(16/9)倍高度。

function resizeCanvas() {
//resize canvas
if(window.innerHeight >= (9*window.innerWidth/16)) {
canvas.width = window.innerWidth;
canvas.height = Math.floor(9*canvas.width/16);
}
else {
canvas.height = window.innerHeight;
canvas.width = Math.floor(16*canvas.height/9);
}
ctx = canvas.getContext("2d");

如果我们想让画布尽可能多地使用初始窗口,同时保持我们选择的宽高比,那么当我们第一次定义画布时,我们也可以使用相同的技术。否则,如果我们根据像素数定义初始画布大小,则应确保函数中使用的比率与resizeCanvas初始画布大小的比率相匹配。

更新画布的宽度和高度后,我们仍然需要更新其他大小和位置变量以反映这些新值。我们可以将它们设置为与之前相同的比率(尽管这些比率现在将转换为不同的像素值),从而使这变得简单。

// update dependent variables
circleX = canvas.width/16;
circleY = canvas.height/8;
circleRad = canvas.height/32;
txtFnt = Math.round(canvas.height/32)+"px monospace";

最后,我们需要重新绘制画布上的所有内容以反映新的尺寸和位置。这可能就像使用修改后的大小和位置变量调用我们的各种自定义绘图函数来重新创建我们的图像一样简单,但所需的细节将根据我们的用例而有所不同。例如,如果我们的画布反映了依赖于用户输入的游戏状态,我们可能需要检查各种游戏状态变量的值以确定到底需要绘制什么。

// re-draw image
drawCircle(circleX,circleY,circleRad);
drawText(txtFnt);
} //end of resizeCanvas function

此时,我们的事件侦听器将自动检测窗口大小调整事件,并且resizeCanvas将触发我们的函数来更新画布的大小并重新绘制图像以适应新的大小。

链接: https://www.fly63.com/article/detial/12606

HTML5 Canvas绘图基本使用方法, H5使用Canvas绘图

Canvas 是H5的一部分,允许脚本语言动态渲染图像。Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的绘图功能(API),在网页上渲染动态效果图。

web图片前端裁剪功能实现_利用html5 canvas技术实现图片裁剪

上传截图很多做法是把图像发送到后端,把裁剪后的结果发送给浏览器,这种方式会增加处理时延。用canvas提供的API实现纯前端的剪切:这里头关键有三步:显示未经处理的图片,得到裁剪区域,显示裁剪后的区域。

原生js使用canvas实现图片格式webp/png/jpeg在线转换

javascript完成图片格式转换: 通过input上传图片,使用FileReader将文件读取到内存中。将图片转换为canvas,canvas.toDataURL()方法设置为我们需要的格式,最后将canvas转换为图片。

离屏Canvas — 使用Web Worker提高你的Canvas运行速度

现在因为有了离屏Canvas,你可以不用在你的主线程中绘制图像了!Canvas 是一个非常受欢迎的表现方式,同时也是WebGL的入口。它能绘制图形,图片,展示动画,甚至是处理视频内容

canvas高效绘制10万图形,你必须知道的高效绘制技巧

最近的一个客户项目中,简化的需求是绘制按照行列绘制很多个圆圈。需求看起来不难,上手就可以做,写两个for循环。,IT行业的知识更新越来越快,能够以不变应万变的人,就是拥有良好的学习力、创造力、判断力和思考力的人。这些能力会让你在变换万千的技术海洋中,屹立不倒,不被淹没。

利用canvas将网页元素生成图片并保存在本地

利用canvas将网页元素生成图片并保存在本地,首先引入三个文件,createElementNS() 方法可创建带有指定命名空间的元素节点。 createElementNS(ns,name) > createElementNS() 方法与 createElement() 方法相似

基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块

随着大数据时代的来临,物联网的日益发展,原先的 SCADA 系统本身也在求新求变,从最开始的专业计算机和操作系统,到通用计算机和相关软件,再到现在基于 HTML5 Canvas 的新型组态开发,其应用的范围也从最初的电力

js用canvas实现简单的粒子运动

在写下合格粒子运动时要先清楚你的思路,不能一开始就盲目的开始写,首先先要确定思路然后在去一步步的实现,在写的过程要注意细节,要思考js有些知识是跟数学知识相关的要注意观察

Canvas 点线动画案例

canvas 画的圆不是圆,是椭圆。不要在style里指定 Canvas 的宽度,Canvas 画布的尺寸的大小和显示的大小是有很大的区别的,在 canvas 里面设置的是才是 Canvas 本身的大小。不要企图通过闭合现有路径来开始一条新路径

Canvas在移动端绘制模糊的原因与解决办法

由于一些移动端的兼容性原因,我们某个项目需要前端将pdf转换成在移动端页面可直接观看的界面。为了方便解决,我们采用了pdf.js这个插件,该插件可以将pdf转换成canvas绘制在页面上

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!