当前位置: 首页 > news >正文

Fabric.js 设置画布背景

Fabric.js 设置画布背景

直接设置 Canvas 标签CSS静态样式

通过直接设置 Canvas 属性能够得到画布的背景,但是这种情况下有一个缺点,那就是不能动态变化。

<template><canvas ref="canvasRef" class="my-canvas"></canvas>
</template><style>
.my-canvas {width: 500px;height: 300px;background-image: url('@/assets/bg.jpg');background-size: cover;background-position: center;
}
</style>

利用 Vue 动态设置 Canvas 样式属性

这个也能够直接达成目标,但是当我开启画画以后我们绘画的东西全部都会消失。

<canvas :style="{backgroundImage:url(${imageUrl})}" ref="canvasRef"></canvas>

为什么设置静态 CSS 不会消失,问题原因:

Vue 会在渲染时 将背景图以行内样式的形式添加到 canvas 元素上。这本身没问题,但和你后续的 canvas API 绘图行为 可能发生 时机冲突或覆盖,因为:

  • Canvas 是一个“位图”绘图容器,任何通过 canvas API 绘制的内容是独立的“像素绘图”。
  • background-image 是通过 CSS 设置的,是渲染层叠系统的内容,不是真正绘制到 canvas 的“图层”上。
  • 当你使用 :style 设置背景图时,它可能在你 canvas 绘图之后重新渲染,从而影响视觉结果。

直接在 Canvas 外层套一个标签就解决了

改为使用一个容器 div 来放 canvas,并给容器设置背景图

这样你绘画再怎么搞,背景都不会受影响!

<template><divclass="canvas-wrapper":style="{ backgroundImage: `url(${imageUrl})` }"><canvas ref="canvasRef" width="500" height="300"></canvas></div><button @click="changeBackground">切换背景</button>
</template><script setup>
import { ref, onMounted } from 'vue'const canvasRef = ref(null)
const imageUrl = ref('/wallhaven-4gxj23.jpg') // 初始背景图onMounted(() => {const ctx = canvasRef.value.getContext('2d')// 模拟画个方块ctx.fillStyle = 'rgba(255, 0, 0, 0.5)'ctx.fillRect(50, 50, 100, 100)
})function changeBackground() {imageUrl.value = '/wallhaven-nz3k58.jpg'
}
</script><style>
.canvas-wrapper {width: 500px;height: 300px;background-size: cover;background-position: center;border: 1px solid #ccc;position: relative;
}canvas {position: absolute;top: 0;left: 0;
}
</style>

为什么可以?

  • 背景图不再属于 canvas,而是它的容器。
  • canvas 只负责绘图行为,不再影响背景。
  • 就算你清空 canvas、调整大小,背景图依然稳如老狗。

相关文章:

  • AI在Java语言的发展方向与涉及领域——一场深度的求职面试
  • Spring AI - Redis缓存对话
  • 基于Flask与Ngrok实现Pycharm本地项目公网访问:从零部署
  • 开源模型应用落地-语音合成-Spark-TTS-零样本克隆与多语言生成的突破
  • 浏览器相关知识点
  • 【AI 加持下的 Python 编程实战 2_09】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(上)
  • Joint communication and state sensing under logarithmic loss
  • iOS18 MSSBrowse闪退
  • Unity 创建、读取、改写Excel表格数据
  • 理解计算机系统_网络编程(1)
  • 自建开源远程协助服务RustDesk —— 筑梦之路
  • Axure中继器表格:实现复杂交互设计的利器
  • 【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
  • 【工具变量】各市ZF数字治理指标数据集(2001-2024年)
  • 大语言模型(LLM)的Prompt Engineering:从入门到精通
  • 同z科技面经
  • 2024从Maven-MySQL-Nginx部署
  • 【解决】layui layer的提示框,弹出框一闪而过的问题
  • 众趣科技X世界读书日丨数字孪生技术赋能图书馆空间智慧化运营
  • RPC通信原理实战
  • 新东方:2025财年前三季度净利增29%,第四财季海外业务将承压
  • 上海小朋友喜欢读什么书?来看这份“少年儿童阅读报告”
  • “很多中国企业竞争力独一无二”,这场对接会上他频频为协同供应链点赞
  • 我国已顺利实施20次航天员出舱活动,达到国际先进水平
  • 欧盟就中欧有关世贸争端案件提起上诉仲裁,商务部回应
  • 浦江观察|3.6亿元消费券,为上海餐饮业带来了什么?