p5.js画布操作实战:创建,绑定指定元素,动态调整大小,隐藏滚动条,删除画布

文章简介

之前在 《p5.js 光速入门》 里粗略讲过一下如何使用 p5.js 创建画布。

这次要介绍几个 p5.js 提供的画布相关的方法。

  • 创建画布时的相关配置。
  • 让画布绑定指定元素。
  • 重置画布大小。
  • 删除画布。

学习本文前你需要具备一点 p5.js 的知识,想了解的请查看 《p5.js 光速入门》

创建画布

p5.js 里创建画布的方法叫 createCanvas,但其实如果你不使用该方法一样可以创建画布。

如果你使用了p5.jssetup() 或者 draw() 之类的生命周期函数,它们也会默认在页面上创建一个画布。

js 复制代码
function setup() {
  background(123)
}

这是 p5.js 默认的动作,画布在不指定宽高时,会默认以 100px * 100px 的尺寸进行展示。

如果你想自定义画布宽高,可以使用 createCanvas(width, height) 方法传入宽高的值。

js 复制代码
function setup() {
  createCanvas(300, 200)
  background(123)
}

《p5.js 3D图形-立方体》 里有介绍渲染 3D 图形时可以在 createCanvas() 传入 WEBGL 参数,有兴趣的工友可以去看看。

让画布绑定指定元素

使用前面提到的方法创建画布,p5.js 默认会帮我们把画布添加到 <body> 标签的最后面。如下图所示。

如果希望把画布添加进指定的页面元素里,可以这么做:

  1. 获取页面指定元素
  2. 使用 createCanvas 创建画布并返回画布对象
  3. 将画布添加到页面的指定元素里
html 复制代码
<div>d1</div>
<div id="d2"></div>
<div>d3</div>

<script>
function setup() {
  // 【步骤1】
  let divElement = document.getElementById('d2')
  // 【步骤2】
  let canvas = createCanvas(300, 200)
  // 【步骤3】
  canvas.parent(divElement)

  background(123)
}
</script>

这个例子中,首先在页面创建3个 <div> ,然后把画布插入到第2个 <div> 里。

canvas.parent() 方法可以指定画布的父元素,传入的参数就是父元素对象。

让画布充满整个页面

通过前面的例子我们知道使用 createCanvas(width, height) 可以设置画布的宽高。

我们可以使用 window.innerWidthwindow.innerHeight 获取页面的宽高,这是原生知识点。

其实 p5.js 也提供了一些常用的常量,比如要获取页面宽高,可以使用 windowWidthwindowHeight

我们将这两个常量传入 createCanvas 就能创建一个和页面宽高一样的画布。

js 复制代码
function setup() {
  createCanvas(windowWidth, windowHeight)
  background(123)
}

但视力好的工友应该已经发现了,用这招会导致滚动条出现。

有开发经验的工友可能知道 <body> 这个根标签是有默认的 margin,如果将 <body>margin 设置为 0 是不是就能解决这个问题呢?

html 复制代码
<style>
  html, body {
    margin: 0;
    padding: 0;
  }
</style>

<script>
function setup() {
  createCanvas(windowWidth, windowHeight)
  background(123)
}
</script>

这么做问题只能解决一半,只看页面左上角的话确实把白边去掉了。但还是出现滚动条。

真正的解决方案是:

  1. bodymargin 设置为 0
  2. 把画布的 display 设置为 block

我们可以在创建画布之后再将它的 display 设置为 block,代码如下所示:

html 复制代码
<style>
  html, body {
    margin: 0;
    padding: 0;
  }
</style>

<script>
function setup() {
  let canvas = createCanvas(windowWidth, windowHeight)
  canvas.style('display', 'block')
  background(123)
}
</script>

重置画布大小

学会了前面几招,接下来可能就会遇到缩放浏览器时画布尺寸不会跟随缩放。

预览图的gif体积比较大,稍等一下~

此时我们可以使用 p5.js 提供的 windowResized 方法监听浏览器缩放,然后通过 resizeCanvas(width, height) 方法修改画布尺寸。

看好啦:

html 复制代码
<style>
  html, body {
    margin: 0;
    padding: 0;
  }
</style>

<script>
let canvas = null

function setup() {
  let canvas = createCanvas(windowWidth, windowHeight)
  canvas.style('display', 'block')
  background(123)
}

// 监听浏览器窗口变化
function windowResized() {
  // 重置画布尺寸
  resizeCanvas(windowWidth, windowHeight)
  background(123)
}
</script>

除了设置画布宽度,有时候可能还要动态设置画布的位置。

设置画布位置的方法是 position(x, y) ,有需要的工友自己试试吧~

删除画布

在下一篇文章我会介绍如何使用 p5.js 创建视频元素,此时需要隐藏 canvas 元素,不然它会在页面占位。

这种情况就需要使用 noCanvas() 方法。

这个方法在需要时直接调用即可,我就不再录屏展示了。

js 复制代码
noCanvas()

推荐阅读

👍《p5.js 光速入门》

👍《p5.js 3D图形-立方体》

👍《p5.js 变换操作》

👍《p5.js map映射》

👍《p5.js 到底怎么设置背景图?》

👍《p5.js 开发点彩画派的绘画工具》

点赞 + 关注 + 收藏 = 学会了

相关推荐
子兮曰8 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰8 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万9 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝9 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋9 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
龙亘川10 小时前
明月照湾区,智启新赛道:从顶流文旅IP盛会看智慧文旅升级路径
人工智能·智慧城市·开源软件·数据可视化
卡布鲁10 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
只睡四小时10 小时前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
龙亘川11 小时前
一网统管AI平台民生业务实践:基于城市数字底座赋能公积金业务服务升级
大数据·安全·智慧城市·开源软件·数据可视化·政务
汉堡大王952711 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端