前端如何实现从html源码字符串中读取任意张图片进行样式适配

体娱   2024-11-07 21:06   陕西  

大家可能看到这种标题, 大概可能是写正则去匹配所有的img标签, 然后加上样式进行替换, 这样不就好了

可是呢, 每个图片的宽高基本都不是固定的, 有的高度特别大, 宽度又特别小呢?

我们都让其高度变成固定的, 比如100像素?

这个时候, 又该反问了, 如果高度很小, 宽度很大呢? 设置高度为100像素, 宽度比例拉伸又超出了盒子?

这个时候, 和后端同事一起看了看, 根据盒子宽度为700像素为基准, 让100除以高度再乘以原有宽度, 如果大于700像素, 就以宽度固定, 高度自适应, 反之高度都是固定100像素( 页面原因很多, 小像素方便查看 )

上面说了这么多, 都是之前的一些思考

大家可以看一下数据

 let htmlStr ='<p>欢迎阅读她的码农公众号文章<br>        <img src="https://lzr5.site/0eebec41-c3ab-4ea8-8466-6f5266b3c29e.jpg">        </p>        <br>        <img src="https://lzr5.site/9d7579fc-c984-4675-bf3b-074cc7627a0a.jpg">';

我们一步一步来实现一下

首先, 需要我们将文本字符串转化成可以获取的dom元素

这个时候, 我们需要用到 DOMParser 了

DOMParser可以将储存在字符串中的XML或者HTML源代码解析为一个DOM

我们需要实例化DOMParser后, 调用它的实例方法, 就可以拿到一个Document或XMLDocument或者其他文档类型, 为什么会有这么多类别, 那是因为返回的数据是基于mimeType参数的

大家对于这一块想要了解一下, 可以参考对应MDN讲解

https://developer.mozilla.org/zh-CN/docs/Web/API/DOMParser

接下来, 需要获取所有的img标签, 我们调用打印一下

可以获取一个伪数组, 我们需要异步读取每一个元素的宽高

我们先来封装一下读取img的宽高

封装完成之后, 我们将获取到的数组进行遍历

我们看一下打印结果

这时候, 每一个图片的宽高, 我们是可以拿到了, 下面就是判断适配样式了

条件写好了, 怎么添加属性呢?

我们可以使用setAttribute方法, 该方法用于设置指定元素的某个属性值, 所以我们可以直接给style属性加一些样式值

写到这里, 我们算是完成了一大半

剩下的就是如何将执行后的数据拿到再转换成html字符串, 我们先全部执行完成

这里可以使用Promise.all方法

Promise.all(promises).then(() => {});

执行完成之后, 我们琢磨一下如何再转换成字符串

查看MDN后, 看到了一个 XMLSerializer 接口, 该接口可以构建一个包含dom树的XML字符串

先来实例化一下

const serializer = new XMLSerializer();

随后, 需要调用它的实例方法 serializeToString 获取到最终的数据

const htmlTxt = serializer.serializeToString(dom.body, "text/html");

最后使用v-html进行回显即可

我们可以看到渲染的宽高变化了

今天我们就讲解到这里

下期见

她的码农
酷爱前端开发,酷爱写作,向全栈工程师奋进!
 最新文章