You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML Canvas中可变字体字重上限为999?如何突破该限制?

问题

自制可变字体的wght轴取值范围为0-6600,通过HTML+CSS操作DOM元素时可完整覆盖所有字重值;但在HTML Canvas中实现相同动画时,字重超过1000后会重置为0。尝试过P5.js,但找到的示例均操作DOM元素而非Canvas。

以下是代码片段:

@font-face {
   font-family: 'TestFont';
   src: url('/assets/TestFont_v2.ttf') format('truetype-variations');
   font-weight: 0 6600;
}
<canvas id="canvas-text" width="1000" height="500"> </canvas>
var c = document.getElementById('canvas-text');
var ctx = c.getContext('2d');
function drawCanvas() {

    ctx.fillStyle = 'black';
    ctx.fillRect(0, 0, c.width, c.height);

    ctx.fillStyle = 'white';
    ctx.font = (scroll_percentage * 6600) + ' '  + '20px TestFont';
    const string_ = 'Lorem ipsum';
    ctx.fillText(string_, 20, 20);

}

let scroll_percentage = 0
function updateScrollProgress() {
    // 获取滚动进度百分比
    var winScroll = document.body.scrollTop || document.documentElement.scrollTop;
    var height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
    scroll_percentage = winScroll / height;

    // 更新画布内容
    drawCanvas() 
}
解决方案

Canvas的ctx.font属性解析字重时,仍遵循传统CSS font-weight的范围限制(100-900为常规有效值),超过1000的数值会被判定为无效,导致字体回退到默认字重(此处为0)。要正确控制可变字体的wght轴,需使用Canvas 2D API的fontVariationSettings属性直接指定轴值,而非通过font属性设置字重。

修改后的核心代码如下:

function drawCanvas() {
    ctx.fillStyle = 'black';
    ctx.fillRect(0, 0, c.width, c.height);

    ctx.fillStyle = 'white';
    // 仅设置字体大小和字体族,不指定字重
    ctx.font = '20px TestFont';
    // 直接通过fontVariationSettings设置wght轴的具体数值
    ctx.fontVariationSettings = `"wght" ${scroll_percentage * 6600}`;
    const string_ = 'Lorem ipsum';
    ctx.fillText(string_, 20, 20);
}
说明
  • fontVariationSettings支持直接指定可变字体的各轴参数,格式为"轴名" 数值,多轴设置用逗号分隔
  • 此方法不受传统font-weight数值范围限制,可完全覆盖自定义的0-6600区间
  • 需确保字体文件正确包含wght轴,且取值范围与定义一致

内容的提问来源于stack exchange,提问作者wsgg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:25:18