cans.fillStyle = 'rgba(200, 200, 200, 0.40)'
时间: 2024-01-08 22:04:58 浏览: 113
你提供的代码 `cans.fillStyle = 'rgba(200, 200, 200, 0.40)'` 是用于设置 Canvas 画布上绘制图形的填充颜色。具体而言,它将填充颜色设置为一个半透明的灰色。
解释一下代码的含义:
- `cans` 是一个 Canvas 画布的上下文对象,可以通过 `getContext` 方法获取。例如:`const cans = document.getElementById('myCanvas').getContext('2d');`
- `fillStyle` 是 Canvas 上下文对象的属性,用于设置填充颜色。
- `'rgba(200, 200, 200, 0.40)'` 是一个颜色值的字符串表示,其中:
- `200, 200, 200` 表示 RGB 颜色的红、绿、蓝分量,这里是灰色。
- `0.40` 表示颜色的不透明度,范围为 0(完全透明)到 1(完全不透明)。
因此,你的代码将 Canvas 画布上绘制图形的填充颜色设置为一个半透明的灰色。你可以根据需要修改颜色值来实现不同的效果。
相关问题
// 全局水印 let setWatermark = str => { let id = '1.23452384164.123412415' if (document.getElementById(id) !== null) { document.body.removeChild(document.getElementById(id)) } let can = document.createElement('canvas') can.width = 200 can.height = 200 let cans = can.getContext('2d') cans.rotate((-15 * Math.PI) / 150) cans.font = '14px Vedana' cans.fillStyle = 'rgba(200, 200, 200, 0.40)' cans.textAlign = 'left' cans.textBaseline = 'middle' cans.fillText(str, can.width / 8, can.height / 2) let div = document.createElement('div') div.id = id div.style.pointerEvents = 'none' div.style.top = '0px' div.style.left = '0px' div.style.position = 'fixed' div.style.zIndex = '100000' div.style.width = document.documentElement.clientWidth + 'px' div.style.height = document.documentElement.clientHeight + 'px' div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat' document.body.appendChild(div) return id } const set = str => { let id = setWatermark(str) setInterval(() => { if (document.getElementById(id) === null) { id = setWatermark(str) } }, 500) window.onresize = () => { setWatermark(str) } } const outWatermark = id => { if (document.getElementById(id) !== null) { const div = document.getElementById(id) div.style.display = 'none' } } const out = () => { outWatermark('1.23452384164.123412415') } const reset = str => { out() set(str) } export default { set, out, reset, } 帮我优化代码
以下是对代码的简要优化:
1. 去除重复代码
将 `setWatermark` 函数和 `outWatermark` 函数中的重复代码提取出来,作为一个单独的函数。
2. 使用箭头函数
将所有函数都改为箭头函数,以简化代码。
3. 使用 const 和 let
将所有变量声明方式都改为 `const` 或 `let`,以便更好地控制变量的作用域。
4. 简化代码逻辑
将 `set` 函数中的定时器逻辑改为判断页面是否有水印,如果没有则添加水印。
优化后的代码如下:
```
const setWatermark = str => {
const id = '1.23452384164.123412415'
const watermarkDiv = document.getElementById(id)
if (watermarkDiv !== null) {
document.body.removeChild(watermarkDiv)
}
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
canvas.width = 200
canvas.height = 200
context.rotate((-15 * Math.PI) / 150)
context.font = '14px Vedana'
context.fillStyle = 'rgba(200, 200, 200, 0.40)'
context.textAlign = 'left'
context.textBaseline = 'middle'
context.fillText(str, canvas.width / 8, canvas.height / 2)
const div = document.createElement('div')
div.id = id
div.style.pointerEvents = 'none'
div.style.top = '0px'
div.style.left = '0px'
div.style.position = 'fixed'
div.style.zIndex = '100000'
div.style.width = document.documentElement.clientWidth + 'px'
div.style.height = document.documentElement.clientHeight + 'px'
div.style.background = 'url(' + canvas.toDataURL('image/png') + ') left top repeat'
document.body.appendChild(div)
return id
}
const outWatermark = id => {
const watermarkDiv = document.getElementById(id)
if (watermarkDiv !== null) {
watermarkDiv.style.display = 'none'
}
}
const set = str => {
setWatermark(str)
window.onresize = () => {
setWatermark(str)
}
}
const out = () => {
outWatermark('1.23452384164.123412415')
}
const reset = str => {
out()
set(str)
}
export default {
set,
out,
reset,
}
```
let can = document.createElement('canvas') can.width = 300 can.height = 350 var str1 = window.xyjVue.$waterStr; let cans = can.getContext('2d') cans.rotate(-25 * Math.PI / 180) const fontSize = 16; const opacity = 0.4; document.fonts.ready.then(() => { // 设置字体 const font = new FontFace('CustomFont', 'url(http://hnxyjwork.kmdns.net:15002/wenYi/DIN-Light.woff)'); font.load().then(() => { cans.fillStyle = `rgba(216, 216, 216, ${opacity})`; // 设置文本颜色和透明度 cans.font = `16px CustomFont`;// 设置字体大小和名称 cans.fillText(str1, 0, 300) cans.fillText(str1, 0, 130) let div = document.createElement('div') div.id = id div.style.pointerEvents = 'none' div.style.top = '0' div.style.left = '0' div.style.right = '0' div.style.bottom = '0' div.style.opacity = '1' div.style.position = 'absolute' div.style.zIndex = 7 div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat fixed' let img = new Image(); img.src = can.toDataURL('image/png'); img.onload = function () { div.style.background = `url(${img.src}) left top repeat fixed`; if (parentName) { document.querySelector(parentName).appendChild(div); } else { document.body.appendChild(div); } }; }); });字体文件虽然引入了 但是页面并不生效
这个问题可能是由于字体文件加载时还未完成,就已经开始绘制文字导致的。你可以尝试在字体文件加载完成后再进行绘制,或者在绘制之前先判断字体文件是否已经加载完成。
你可以修改代码如下:
```
let can = document.createElement('canvas');
can.width = 300;
can.height = 350;
var str1 = window.xyjVue.$waterStr;
let cans = can.getContext('2d');
cans.rotate(-25 * Math.PI / 180);
const fontSize = 16;
const opacity = 0.4;
// 设置字体
const font = new FontFace('CustomFont', 'url(http://hnxyjwork.kmdns.net:15002/wenYi/DIN-Light.woff)');
font.load().then(() => {
document.fonts.add(font); // 添加字体
cans.fillStyle = `rgba(216, 216, 216, ${opacity})`; // 设置文本颜色和透明度
cans.font = `${fontSize}px CustomFont`; // 设置字体大小和名称
cans.fillText(str1, 0, 300);
cans.fillText(str1, 0, 130);
let div = document.createElement('div');
div.id = id;
div.style.pointerEvents = 'none';
div.style.top = '0';
div.style.left = '0';
div.style.right = '0';
div.style.bottom = '0';
div.style.opacity = '1';
div.style.position = 'absolute';
div.style.zIndex = 7;
div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat fixed';
let img = new Image();
img.src = can.toDataURL('image/png');
img.onload = function () {
div.style.background = `url(${img.src}) left top repeat fixed`;
if (parentName) {
document.querySelector(parentName).appendChild(div);
} else {
document.body.appendChild(div);
}
};
});
```
这样就可以在字体加载完成后再进行绘制,确保绘制出的文字使用的是正确的字体。