vue h5 端实现富文本图片预览(基于 Vant UI 的 ImagePreview 组件)

vue h5 端实现富文本图片预览(基于 Vant UI 的 ImagePreview 组件)

之前发了一篇博客讲了如何在小程序实现富文本的图片预览,本篇博客来讲讲如何在 H5 端实现同样的体验与效果

注意:项目里要引入 Vant UI 组件库(需自行引入好在开始看后面的内容)

预览效果

在这里插入图片描述

关键代码

src/utils/util.js

/**
 * 从富文本中给图片链接添加 random 并且返回图片数组
 * @example let [html, imgUrls] = addRandomAndGetPreviewImageUrlsFromRichText(html)
 * @param {string} html 
 */
// function addRandomAndGetPreviewImageUrlsFromRichText (html) {
const addRandomAndGetPreviewImageUrlsFromRichText = html => {
    // 如果没有值的话,直接返回
    if (!html) {
        return html
    }

    let randomIndex = 0
    let imgUrls = []
    // 先匹配到 img 标签,放到 match 里
    html = html.replace(/<img[^>]*>/gim, function(match) {
        randomIndex++
        match = match.replace(/src="[^"]+"/gim, function(match) {
            // 再匹配到 src 标签 '"'
            let src = match.slice(5, -1) + "?random=" + randomIndex // 取到 src 里面的 url
            imgUrls.push(src)
            return 'src="' + src + '"'
        }).replace(/src='[^']+'/gim, function(match) {
            // 再匹配到 src 标签 "'"
            let src = match.slice(5, -1) + "?random=" + randomIndex
            return "src='" + src + "'"
        })

        return match
    })
    return [html, imgUrls]
}

module.exports = {
    addRandomAndGetPreviewImageUrlsFromRichText: addRandomAndGetPreviewImageUrlsFromRichText,
}

使用案例

xxx.vue

<template>
	<div v-html="html" class="h5-html" @click="previewImage($event)"></div>
</template>
<script>
    import util from '@/utils/util'
    import { ImagePreview } from 'vant'


    export default {
        mounted() {
            let htmlStr =
                '<p>这一整块都是富文本</p><img src="https://www.coveycity.com/upload/businessMap/img/movie.png"><p>科技城五渠塘水库以北</p><p><img src="http://www.coveycity.com:1433/upload/businessMap/20210306/df49ddd7c34d471a83c172de553beede.jpg"></p>'
            ;[this.html, this.richImages] = util.addRandomAndGetPreviewImageUrlsFromRichText(htmlStr)
            console.log(this.richImages, 'this.richImages')

        },
        methods: {
            previewImage(e) {
                // console.log(e, 'e')
                if (e.target.tagName == 'IMG') {
                    ImagePreview({
                        images: this.richImages,
                        startPosition: e.target.src.split('random=')[1] - 1,
                        closeOnPopstate: true //页面回退关闭预览
                    })
                }
            }
        }
    }
</script>

<style>
    .h5-html {
         100%;
        background-color: cadetblue;
        padding: 20px 0;
    }
    .h5-html img {
         100%;
    }
</style>

效果就是最前面那张动图。

原文地址:https://www.cnblogs.com/suwanbin/p/15177374.html