dom-to-image分享多张异步图片遇到的坑

news2025/2/6 18:58:22

dom-to-image库 存在的问题

github-issue地址
问题:当超过一张图片时,ios/safari首次会出现某张图片空白,再次生成canvas才正常。
之前有一张图片时通过执行2次domtoimage.toJpeg(魔法),当超过1张图片时,图片第一次仍然会空白
原因:ios下svg第一次svg生成的很慢。dom-to-image库是先将html转化成svg格式,然后再绘制到canvas上。需要等待所有dom(尤其是所有图片)渲染完成后,再去执行html转化换。

Apparently each browser renders images with svg sources differently.
In Safari the embedded images inside the svg appear to load very
slowly the first time the browser encounters them, and sometimes they
never load (unless you append the element visibly to the DOM)

看issue都说完美方案,是替换成html2canvas,但是这个坑也特别多。

方案1: dom-to-image等待所有图片都加载完成,再执行绘制

// 需要监听加载的图片总数量
const totalLoadImgCount = useRef(0)
// 加载完成的图片数量
const loadSuccessImgCount = useRef(0)  
/**
* 监听图片加载
* tips:
* dom-to-image是将dom转化成svg,然后转化成canvas。
* 只有所有图片需要加载完成后才能绘制成功,不然会可能出现第一次渲染图片空白的情况
*/
const onLoadImage = () => {
  loadSuccessImgCount.current++

  if (loadSuccessImgCount.current === totalLoadImgCount.current) {
    createImgUrl()
  }
}

useEffect(() => {
  options?.extends?.imgUrl && totalLoadImgCount.current++
  options?.extends?.initImageUrl && totalLoadImgCount.current++
}, [options])


return<>
   <img
    className="w-full"
    src={toXSmallImage(options?.extends?.imgUrl as string)}
    alt=""
    onLoad={() => {
     onLoadImage()
    }}
   />
  <img
    className="relative w-full"
    id="initImageUrl"
    src={toXSmallImage(options?.extends?.initImageUrl as string)}
    alt=""
    onLoad={() => {
      onLoadImage()
    }}
  />
</>)

看了issue其他解决方法,发现都不成功。找到方案后并回复了issue
在这里插入图片描述

其他尝试,但失败
useEffect预加载所有图片,本来期望利用图片缓存的方式。其时间会早于真实dom中所有图片onload时间,转化时,图片可能还没完全加载成功。

方案2: html2canvas库,解决多张图片问题(不采用,样式问题太多)

原理:直接将将图片绘制到canvas当中,因而就存在上面的问题。
遇到的问题:

  1. 图片不展示
    添加属性:{ useCORS: true }
  2. 部分css3属性不支持。
    https://www.jianshu.com/p/e74dab30ea2c比如:省略号,可以变成手动…的方式
    https://github.com/niklasvh/html2canvas/issues/1594
  3. 文字行高不对,
    原因:主要原因是image出生block,会出现一个空白区域,将文字顶出去了
    解决:
    方式1: 利用style标签,设置全局body->img设置inline-block
    const style = document.createElement('style')
    document.head.appendChild(style)
    style.sheet?.insertRule(
      'body > div:last-child img { display: inline-block; }'
    )
    const canvas = await html2canvas(
      document.getElementById('share-dom') as HTMLElement,
      { useCORS: true }
    )
    style.remove()
    const imgUrl = canvas.toDataURL('image/jpeg', 1.0)

方式2,但会影响到所有的img
issues

@layer base {
  img {
    @apply inline-block;
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb笔记(一)

Java网络编程 在JavaSE阶段&#xff0c;我们学习了I/O流&#xff0c;既然I/O流如此强大&#xff0c;那么能否跨越不同的主机进行I/O操作呢&#xff1f;这就要提到Java的网络编程了。 **注意&#xff1a;**本章会涉及到计算机网络相关内容&#xff08;只会讲解大致内容&#x…

PyTorch 深度学习 || 专题八:PyTorch 全连接网络分类

PyTorch 全连接网络分类 文章目录 PyTorch 全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as plt from sklear…

Java企业级信息系统开发学习笔记(4.2)Spring Boot项目单元测试、热部署与原理分析

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/pG623】 文章目录 一、Spring Boot单元测试概述1.1 对项目HelloWorld01进行单元测试1. 添加测试依赖启动器和单元测试2. 创建测试类与测试方法 1.2 对项目HelloWorld02进行单元测试1. 添加单元测试…

C++冷知识:构造函数初始化时,为什么使用 : 而不是使用作用域内初始化对象?

:是什么&#xff1f; 这样的行为被称之为初始化列表。具体展示如下&#xff1a; 直接初始化对象。 以一个线程池类为例&#xff1a; class ThreadPool { public:// 构造函数&#xff0c;创建指定数量的线程ThreadPool(size_t num_threads) : stop(false){....}// 析构函数&…

【计算摄影学】总目录

1.数码相机 《数码相机中的图像传感器和信号处理》和《光与赢的魔幻乐园有趣的透镜》 1.1 数码相机概览 1.2 数码相机中光学系统 2.图像传感器 《数码相机中的图像传感器和信号处理》和《智能cmos图像传感器与应用》 2.1 图像传感器基础知识 2.2 CCD图像传感器 2.3 CMOS图像…

RankNet方法在移动终端的应用

RankNet方法在移动终端的应用 RankNet代码示例pythonJava 移动终端的应用 RankNet RankNet 是一种排序学习方法&#xff0c;由 Microsoft Research 提出&#xff0c;用于解决排序问题。它基于神经网络&#xff0c;并使用一对比较的方式来训练和优化模型。 在 RankNet 中&…

你的企业还没搭建这个帮助中心网页,那你太落后了!

作为现代企业&#xff0c;拥有一个完善的帮助中心网页已经成为了不可或缺的一部分。帮助中心网页不仅可以提供给用户有关产品或服务的详细信息&#xff0c;还可以解答用户的疑问和提供技术支持&#xff0c;使用户在使用产品或服务时遇到问题可以很快地得到解决。因此&#xff0…

内网隧道代理技术(四)之NETSH端口转发

NETSH端口转发 NETSH介绍 netsh是windows系统自带命令行程序&#xff0c;攻击者无需上传第三方工具即可利用netsh程序可进行端口转发操作&#xff0c;可将内网中其他服务器的端口转发至本地访问运行这个工具需要管理员的权限 本地端口转发 实验场景 现在我们有这么一个环境…

AntDB存储技术——水平动态扩展技术

数据库集群安装完成后&#xff0c;其数据存储容量是预先规划并确定的。随着时间的推移以及业务量的增加&#xff0c;数据库集群中的可用存储空间不断减少&#xff0c;面临数据存储容量扩充的需求。 通过增加数据节点&#xff0c;扩充集群数据容量&#xff0c;必然需要对已有数…

云服务器是什么? 云服务器有哪些选择?

欢迎前往我的个人博客云服务器查看更多关于云服务器和建站等相关文章。 随着互联网技术的发展和云计算技术的应用&#xff0c;越来越多的企业倾向于使用云服务器来满足其不断增长的计算需求。云服务器是一种基于云计算技术的虚拟服务器&#xff0c;它能够为企业提供高性能、可…

创业很长时间以后

创业过很长时间以后…综合能力是有滴 创业和打工后的思维习惯 为了效率&#xff0c;一般情况是这样滴 趣讲大白话&#xff1a;区别还是有滴 【趣讲信息科技195期】 **************************** 创业还是很难滴 每年成立很多新公司 有很多公司关门 公司平均生存时间&#xff1…

AntDB 企业增强特性介绍——AntDB在线数据扩容关键技术

数据库集群安装完成后&#xff0c;其数据存储容量是预先规划并确定的。随着时间的推移以及业务量的增加&#xff0c;数据库集群中的可用存储空间不断减少&#xff0c;面临数据存储容量扩充的需求。 传统的在线扩容的流程大致如下。 &#xff08;1&#xff09;在集群中加入新的 …

Golang | Web开发之Gin路由访问日志自定义输出实践

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xf…

2022届本科毕业生10大高薪专业:大数据专业进入top3

对于普通人来讲&#xff0c;报考一个高薪的职业还是重中之重。那么什么专业高薪呢&#xff0c;很多人觉得是程序员&#xff0c;但这是职业而不是大学专业&#xff0c;专业千千万&#xff0c;选什么好呢&#xff0c;接下来看一看。 最近国家统计局发布了2022年城镇单位就业人员…

MMU翻译的时候以哪种level去执行是什么意思

【问题】 以哪个el去执行是什么意思&#xff1f;执行这条指令就会切到切换指令里指定的el吗&#xff1f; 【回答】 在一个core中&#xff0c;至少有一下Translation regime&#xff0c;AT S12E2R, <Xt> 就是使用EL2 Translation regime完成地址翻译。 Secure EL1&…

Cadence Allegro PCB设计88问解析(二十八) 之 Allegro中dimension environment命令使用(添加及删除尺寸标注)

一个学习信号完整性仿真的layout工程师 最近看到关于Anti Etch的设置&#xff0c;因为本人之前在layout设计是使用过这个命令。后来去到别的公司就不用了&#xff0c;从网上看到说这个命令是用来负片设计的。在这里在说下正片和负片的概念&#xff1a; 正片&#xff1a;是指在a…

机器学习|监督学习|无监督学习|8:20~9:20

目录 一、监督学习(Supervised learning) ​​​​​​​2.1分类(classification) 2.2回归(regression) 泛化能力 Generalization Ability 欠拟合 过拟合 不收敛 2.3 K近邻算法 k近邻分类​ k近邻回归 KNN变种 二、无监督学习(Unsupervised learning) 2.1 聚类(c…

[迁移学习]域自适应代码解析

一、概述 代码来自&#xff1a;https://github.com/jindongwang/transferlearning&#xff0c;可以前往github下载代码&#xff0c;本文涉及的代码的位置为&#xff1a;Code->DeepDA。理论基础可以参见&#xff1a;[迁移学习]域自适应 整体网络结构如下&#xff1a;可以视为…

Win7下静态变量析构导致进程卡死无法退出问题解决

项目中在用户机器Win7系统上好几次出现进程卡死&#xff0c;无法退出&#xff0c;在用户机器上抓取了dump&#xff0c;发现是在DllMain函数中执行了静态变量的析构&#xff0c;这个静态变量析构的时候会使用std::condition_variable 类型的成员变量通知其他线程退出。同时本地在…

PDF怎样转换成长图?这个方法,超级简单!

在当今社会&#xff0c;PDF文档广泛应用于各个领域。然而&#xff0c;在某些情况下&#xff0c;我们可能需要将多个PDF页面合并成一个单独的长图&#xff0c;以便更方便地浏览、共享或嵌入到其他文件中。为了满足这一需求&#xff0c;记灵在线工具应运而生&#xff0c;它为我们…