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

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、调整大小,背景图依然稳如老狗。
http://www.xdnf.cn/news/1410.html

相关文章:

  • OpenCV 图形API(57)颜色空间转换-----将图像从 RGB 色彩空间转换为 YUV 色彩空间函数RGB2YUV()
  • Ragflow、Dify、FastGPT、COZE核心差异对比与Ragflow的深度文档理解能力​​和​​全流程优化设计
  • python后端程序部署到服务器 Ubuntu并配合 Vue 前端页面运行
  • 【CSS】层叠,优先级与继承(四):层叠,优先级与继承的关系
  • 电液伺服高频应力腐蚀疲劳试验机
  • 长连接、短连接与WebSocket的基本知识
  • Lua 第9部分 闭包
  • uv pip install 的本质是什么?
  • 十大物联网平台-物联网十大品牌
  • Java高级:数据库访问优化
  • 量子混合计算革命:Qiskit 3.0开启云上量子开发新时代
  • 不开启手机调试模式如何开发自动化脚本?
  • 【go】方法与函数区别,函数的内联与逃逸分析
  • Kotlin 边界限制
  • 加油站小程序实战教程14会员充值页面搭建
  • centos stream 10 修改 metric
  • python——模块、包、操作文件
  • 网络原理 - 5(TCP - 2 - 三次握手与四次挥手)
  • 深度解析n8n全自动AI视频生成与发布工作流
  • 多 Agent 系统开发指南:分布式协同、通信机制与性能优化
  • Unity ML-Agents + VScode 环境搭建 Windows
  • Manim让数学动画更有温度
  • windows怎样生成iOS证书-uniapp打包
  • RK3568平台开发系列讲解(调试篇)debugfs文件系统及常见调试节点介绍
  • 基于HPC的气候模拟GPU加速实践全流程解析
  • 【架构】Armstrong公理系统通俗详解:数据库设计的基本法则
  • 【Canvas与标志】红底肉边黑芯铁十字标志
  • socket编程基础
  • MongoDB Ubuntu 安装
  • 大数据利器:Kafka与Spark的深度探索