You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中v-html含CSS样式时如何限制显示160字符?

Vue.js 处理带样式文本的字符截取(忽略CSS样式,仅限制实际文本)

解决思路

核心是先从HTML字符串中提取纯文本内容,按长度截取后,再将截取后的文本放回原HTML结构中保留样式,同时添加展开/收起的状态控制。

实现代码

组件脚本部分

export default {
  data() {
    return {
      posts: [], // 你的帖子数据源
      expandedPosts: {} // 记录每个帖子的展开状态,键为帖子ID
    };
  },
  methods: {
    // 处理带HTML的文本截取
    truncateStyledText(htmlContent, maxChars) {
      // 用DOMParser解析HTML(内存中处理,不影响真实DOM)
      const parser = new DOMParser();
      const doc = parser.parseFromString(htmlContent, 'text/html');
      // 提取纯文本内容
      const plainText = doc.body.textContent.trim();

      // 如果文本长度未超过限制,直接返回原HTML
      if (plainText.length <= maxChars) {
        return htmlContent;
      }

      // 截取指定长度的纯文本并添加省略号
      const truncatedText = plainText.substring(0, maxChars) + '...';
      // 将截取后的文本替换回HTML结构
      doc.body.textContent = truncatedText;
      // 返回处理后的带样式HTML
      return doc.body.innerHTML;
    },
    // 切换展开/收起状态
    togglePostExpand(postId) {
      this.expandedPosts = {
        ...this.expandedPosts,
        [postId]: !this.expandedPosts[postId]
      };
    }
  }
};

模板部分

<div class="col-12 col-lg-4" v-for="item in posts" :key="item.id">
  <!-- 根据展开状态显示完整内容或截取后的内容 -->
  <p v-html="expandedPosts[item.id] ? item.body : truncateStyledText(item.body, 160)"></p>
  <!-- 切换按钮 -->
  <button 
    @click="togglePostExpand(item.id)" 
    class="text-decoration-none text-primary border-0 bg-transparent"
  >
    {{ expandedPosts[item.id] ? '收起' : '查看更多' }}
  </button>
</div>

关键说明

  • DOMParser的优势:在内存中解析HTML,不会创建真实DOM元素,避免污染页面,同时能准确提取纯文本。
  • 样式保留:处理后的HTML会保留原有的p、span标签及CSS样式,仅替换文本内容。
  • XSS风险提示:确保item.body的数据源是可信的,避免注入恶意代码(v-html会直接渲染HTML内容)。

内容的提问来源于stack exchange,提问作者Nishant sethi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:45:27