1. 如何在vue3中应用html2canvas

npm install --save html2canvas
生成海报:

<template>    <div class="poster-box" ref="posterBox">        <div class="thumb"><img src="@assets/goods.jpg" alt=""></div>        <div class="goods-info">            <div class="title-box">                <div class="title">情侣装男女红色彩色T恤太空散步宇航员默认发红色须要其余色彩请备注</div>                <div class="price">¥99.9</div>            </div>            <div class="code">二维码</div>        </div>    </div>    <div class="btn" @click="initPoster">生成海报</div>    <img v-if="showImg" :src="posterUrl" class="poster" alt=""></template><script>import html2canvas from 'html2canvas'import { ref, unref } from 'vue'export default {    setup() {        const showImg = ref(false)        const posterBox = ref(null)        const posterUrl = ref(null)        const initPoster = () => {            html2canvas(unref(posterBox), {                width: unref(posterBox).getBoundingClientRect().width,                  height: unref(posterBox).getBoundingClientRect().height            }).then(canvas => {                posterUrl.value = canvas.toDataURL('image/jpeg')                showImg.value = true;            });        }        return {            initPoster,            showImg,            posterBox,            posterUrl        }    }}</script><style lang="scss" scoped>.poster-box {    width: 5.5rem;    height: 7.4rem;    background: #fff;    padding: .15rem;    .thumb {        width: 100%;        height: 5.2rem;        img {            width: 100%;            height: 100%;        }    }    .goods-info {        margin-top: .2rem;        display: flex;        justify-content: space-between;        .code {            width: 1.4rem;            height: 1.4rem;            line-height: 1.4rem;            text-align: center;            color: #fff;            background: #ddd;            margin-left: .1rem;        }        .title-box {            width: 0;            flex: 1;        }        .title {            text-align: justify;            font-size: .3rem;            font-weight: bold;            overflow: hidden;            text-overflow: ellipsis;            display: -webkit-box;            -webkit-line-clamp: 2;            -webkit-box-orient: vertical;        }        .price {            color: red;            font-size: .32rem;            font-weight: bold;            margin-top: .2rem;        }    }}.poster {    width: 5.5rem;}</style>

2. 生成的图片白边问题

在某些机型上生成的图片,左边和下边会有白边,如下图:

解决办法:

html2canvas(unref(posterBox), {    // 加上宽高当前,白边隐没,如右图    width: unref(posterBox).getBoundingClientRect().width,      height: unref(posterBox).getBoundingClientRect().height,}).then(canvas => {    const dataURL = canvas.toDataURL('image/png');})

开始获取宽高的时候用的,unref(posterBox).offsetWidth,然而在某些机型下还是有白边,
因为用unref(posterBox).offsetWidth获取到的宽度是整数,例如图片宽度是273.59,获取到的宽度是274,所以左边会呈现白边。而unref(posterBox).getBoundingClientRect().width获取到小数位的宽度,白边就没有了。

3. 生成的海报,文字被遮挡问题


这个问题,在安卓上没问题,然而ios上就会被遮挡,
解决办法:把题目的文字每一个字都放到一个span中,再渲染就失常了
参考:https://github.com/niklasvh/h...
设置letter-spacing: 1px;的办法也试了,然而成果不行。