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

Next.js 12部署Vercel时CSS内联SVG转Base64致遮罩异常

解决Next.js 12部署Vercel后CSS内联SVG Mask转Base64导致Safari失效问题

问题原因

Vercel部署Next.js应用时会自动优化静态资源,其中包括把CSS模块里的内联SVG转换为Base64编码。这种转换会导致原本为兼容Safari设置的width="100%"和height="100%"属性失效,破坏遮罩显示效果;而本地构建不会触发该优化,因此本地运行正常。

可行解决办法

1. 改用SVG viewBox属性替代width/height(推荐)

直接修改内联SVG写法,移除width="100%"和height="100%",添加viewBox属性定义SVG原始尺寸。viewBox能让SVG自适应容器大小,不受Base64转换影响,完美兼容Safari。

示例:

/* 原问题写法 */
mask: url("data:image/svg+xml,%3Csvg width='100%' height='100%' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 10...'/%3E%3C/svg%3E");

/* 修改后写法 */
mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 48 48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 10...'/%3E%3C/svg%3E");

注:viewBox的四个值对应min-x, min-y, width, height,请根据你的SVG实际尺寸调整。

2. 将SVG单独存放为静态文件引用

把SVG内容保存到项目public目录下的单独文件,在CSS中直接引用文件路径,避免内联带来的Base64转换问题。

步骤:

  • 在public目录创建masks文件夹,将SVG保存为public/masks/custom-mask.svg
  • 在CSS模块中引用:
mask: url("/masks/custom-mask.svg");

Vercel会将该SVG作为静态资源部署,不会转换为Base64,原有的width/height属性可正常生效。

3. 禁用Vercel或Next.js的SVG优化

通过配置阻止SVG被转换为Base64:

方法A:修改vercel.json
在项目根目录创建或修改vercel.json,添加以下配置:

{
  "build": {
    "env": {
      "NEXT_DISABLE_SVG_OPTIMIZATION": "1"
    }
  }
}

方法B:修改next.config.js的webpack配置
自定义webpack规则,让SVG以资源文件形式输出,而非内联Base64:

module.exports = {
  webpack: (config) => {
    // 遍历所有规则,找到处理SVG的规则并修改类型
    config.module.rules.forEach(rule => {
      if (rule.test?.test('.svg')) {
        rule.type = 'asset/resource';
      }
    });
    return config;
  },
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:40:22