解决html2canvas相关问题(模糊,跨域,偏移,兼容)

本文详细介绍了在使用html2canvas进行网页截图时遇到的常见问题,包括图片不清晰、图片跨域、页面截取偏移等,并提供了相应的解决方法,如调整配置参数、处理CSS样式以及降级html2canvas版本等。
摘要由CSDN通过智能技术生成

一、生成图片不清晰

最终生成的图片不清晰有以下几种情况
1.使用背景图片:如果背景为图片的话,建议不使用background: url(‘图片地址’),而使用img标签来做背景
2.整体图片像素不清:可使用html2canvas中的scaledpi配置来进行放大

html2canvas(dom,{
	scale: 2, //放大
    dpi: 300 // 处理模糊问题
})

二、图片跨域

当使用不同域的图片时生成的图片空白
在这里插入图片描述

解决方法:配置中添加useCORS: true,img标签增加crossOrigin='anonymous',需要图片来源方配合允许跨域方法设置

html2canvas(dom,{
	useCORS: true
})

三、截取图片向下偏移

如下图所示,当页面有滚动条并滚动时,截取的图片上方有一部分空白
在这里插入图片描述

解决方法:1.获取页面滚动条滚动的高度,并在配置中配置scrollY: -scrollTop

const scrollTop = document.documentElement.scrollTop || document.body.scrollTop // 获取滚动轴滚动的长度
html2canvas(dom,{
	useCORS: true,
    scrollY: -scrollTop,
    scrollX: 0,
    scale: 2, //放大
    dpi: 300 // 处理模糊问题
})

2.生成图片是让页面滚动到顶部window.scroll(0, 0)

window.scroll(0, 0) // 首先先顶部
html2canvas(dom,{
	useCORS: true,
    scrollY: 0,
    scrollX: 0,
    scale: 2, //放大
    dpi: 300 // 处理模糊问题
})

四、图片向左偏移

如下图所示,生成的海报图向左偏移
在这里插入图片描述

原因:有可能外层元素使用了transform或者transition等一些不支持的css3新属性,导致生成的海报偏移

github issues

解决方法:
1.生成图片时覆盖外层的这些不支持的属性,等生成完毕后在恢复
2.将要生成图片的dom复制一份追加到最外层,生成图片后在删除

	  window.scroll(0, 0) // 首先先顶部
      const targetDom = this.$refs['goodsDetail'] // 获取要截图的元素
      const copyDom = targetDom.cloneNode(true) // 克隆一个
      copyDom.style.width = targetDom.scrollWidth + 'px'
      copyDom.style.height = targetDom.scrollHeight + 'px'
      document.body.appendChild(copyDom) // 添加
      const rect = copyDom.getBoundingClientRect()
      document.body.appendChild(copyDom) // 添加
      html2canvas(copyDom, {
      	x: rect.left,
        y: rect.top,
        useCORS: true,
        width: copyDom.clientWidth,
        height: copyDom.clientHeight,
        scrollY: 0,
        scrollX: 0,
        scale: 2,
        dpi: 300 // 处理模糊问题
      })
      .then((canvas) => {
        document.body.removeChild(copyDom) // 用完要删除
        this.shareUrl= canvas.toDataURL()
       })

五、IOS手机生成的图片向下偏移,安卓正常

在这里插入图片描述

这个找了好久的问题都没找到,最后才发现是版本的问题

原因:使用了最新的"html2canvas": "^1.0.0-rc.7"版本出现了问题,把版本降到"html2canvas": "^1.0.0-rc.4"解决

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Vue和html2canvas进行截图时,可能会遇到跨域问题。这是由于浏览器的同源策略所导致的安全限制。当你尝试将html2canvas应用于跨域的图片时,浏览器会阻止截图操作。 解决这个问题的一种方法是使用代理服务器。你可以在你的服务器上设置一个代理,将请求发送到目标图片的服务器,并将响应返回给前端。这样,前端的请求就不会涉及跨域问题了。 以下是一个使用代理服务器解决跨域问题的示例代码: 1. 在你的Vue项目中创建一个代理配置文件 `vue.config.js`(如果已经存在,请忽略)。 ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://目标图片的服务器地址', changeOrigin: true, pathRewrite: { '^/api': '' } } } } } ``` 2. 在你的Vue组件中使用代理服务器进行截图。 ```javascript import html2canvas from 'html2canvas'; export default { methods: { async captureScreenshot() { try { const canvas = await html2canvas(document.getElementById('target'), { useCORS: true, proxy: '/api' // 使用代理服务器 }); const image = canvas.toDataURL('image/png'); // 处理截图后的操作 } catch (error) { console.error('截图失败:', error); } } } } ``` 在上面的代码中,我们通过设置 `proxy` 选项为 `/api`,将请求发送到代理服务器。然后,代理服务器会将请求转发到目标图片的服务器,并将响应返回给前端。 需要注意的是,你需要将 `http://目标图片的服务器地址` 替换为实际的目标图片服务器地址。 希望以上解决方案能帮助到你!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值