火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

html2canvas 截不到远程图片:CORS 处理

发布于 9小时前
2

页面截图后远程图片位置是空白,控制台报跨域相关错误。原因是画布读取跨源像素时被浏览器拦下,与图片能否正常显示无关。

屏幕上显示的代码
截图涉及画布对像素的读取权限

三个条件

  1. 开启 useCORS,让库为图片请求加上跨域属性。
  2. 图片服务端返回跨域允许头,允许当前来源。
  3. 图片元素本身带上 crossorigin 属性,否则缓存里存的是不带 CORS 的副本。
html2canvas(node, {
  useCORS: true,
  allowTaint: false,
  backgroundColor: null
}).then(canvas => { /* 导出 */ });

allowTaint 的取舍

开启后允许把跨域图片画进画布,代价是画布被标记为污染,导出接口会直接报错。需要导出图片时不要开启。

缓存带来的坑

同一张图先以普通方式加载过一次,再以跨域方式加载时,浏览器可能复用不带 CORS 头的缓存副本。给地址追加查询参数可以强制重新请求。

同源代理

无法控制图片服务端时,把图片地址换成同源代理接口,由服务端转发并补上响应头,前端不再直接跨源。

检查顺序

  • 确认 useCORS 已开启。
  • 在响应头里确认存在跨域允许头。
  • 确认图片标签带有 crossorigin 属性。
  • 确认没有在开启 allowTaint 后又调用导出接口。

常见问题(FAQ)

开了 useCORS 仍然空白?
还需要图片服务端返回跨域允许头,两端缺一不可。
allowTaint 和 useCORS 能同时开吗?
能,但开启 allowTaint 会污染画布,无法再导出图片。
图片在页面显示正常却截不到?
显示与画布读取是两套规则,画布要求显式的跨域许可。
缓存导致跨域失效怎么办?
给图片地址追加查询参数,强制走一次带 CORS 头的请求。
图片服务端不受控怎么处理?
用同源代理接口转发,由服务端补齐响应头。
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026