uni-app 使用 mp-html 实现文字超出几行显示省略号时,在ios设备下会出现文字重叠的现象

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app 使用 mp-html 实现文字超出几行显示省略号时,在ios设备下会出现文字重叠的现象
背景是uniapp Vue3语法实现的微信小程序,使用 mp-html 实现文字超出几行显示省略号

现在是通过给._root设置样式实现的 ._root {
    overflow: hidden;
    word-break: break-all;
    -webkit-box-orient: vertical; 
   display: -webkit-box; 
   -webkit-line-clamp: 7;
    text-overflow: ellipsis;
 }
但在ios设备下存在文字重叠的问题
追溯到了这个issue,https://github.com/jin-yufeng/mp-html/issues/308
想问一下,有没有大佬解决过啊,十分感谢


1 回复

uni-app 中使用 mp-html 组件时,处理文字超出指定行数显示省略号的需求,确实可能会遇到一些跨平台兼容性问题,特别是在 iOS 设备上。这通常是由于不同浏览器内核对 CSS 的解析差异造成的。虽然 mp-html 组件在跨端表现上做了不少优化,但面对复杂样式时仍可能出现问题。

为了解决文字重叠的问题,你可以尝试以下几种方法,这里主要提供 CSS 样式和可能的 JavaScript 解决方案。由于 mp-html 的限制,某些高级 CSS 特性可能无法直接使用,但我们可以利用一些基础的 CSS 和 JavaScript 来实现需求。

方法一:使用 -webkit-line-clamp 和相关样式

首先,确保你的 mp-html 容器有一个固定的高度,并使用 -webkit-line-clamp 来限制显示的行数。这是一个在 WebKit 内核中广泛支持的 CSS 属性,但在非 WebKit 内核中可能表现不一致。

<template>
  <view class="container">
    <mp-html :html="yourHtmlContent"></mp-html>
  </view>
</template>

<style>
.container {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3; /* 限制显示的行数 */
  height: /* 根据字体大小计算合适的高度,例如 60px */;
  line-height: /* 字体行高 */;
}
</style>

方法二:JavaScript 动态计算并截断文本

如果 CSS 方法在 iOS 上仍然表现不佳,你可以考虑使用 JavaScript 来动态计算文本长度并截断它,然后手动添加省略号。这种方法虽然更复杂,但可以提供更高的兼容性。

methods: {
  truncateText(text, maxLines, fontSize, lineHeight) {
    const ctx = uni.createCanvasContext('tempCanvas'); // 创建一个临时 canvas
    ctx.setFontSize(fontSize);
    const lineCount = Math.ceil(text.split('\n').reduce((sum, line) => sum + ctx.measureText(line).width, 0) / (uni.getSystemInfoSync().windowWidth * 0.8)); // 假设文本宽度占屏幕宽度的80%
    if (lineCount > maxLines) {
      return text.split('\n').slice(0, maxLines).join('\n') + '...';
    }
    return text;
  }
}

注意:上述 JavaScript 方法中的 uni.createCanvasContextuni.getSystemInfoSync 是基于 uni-app 的 API,用于测量文本长度。你需要在实际使用时创建一个隐藏的 canvas 元素,并在组件加载时调用此方法以计算并设置文本。

由于 mp-html 的特殊性,以上方法可能需要一定的调整才能完美适配。建议在实际项目中测试不同方案的效果,并根据具体情况选择最合适的实现方式。

回到顶部