当前位置: 首页 > news >正文

实现当文本内容过长时,中间显示省略号...,两端正常展示

目前在工作上有一个需求,就是当文本内容过长时,中间显示省略号…,两端正常展示。我这里是使用组件化的方式来实现,我百度看,别人用css都可以实现。可以参考一下别人,我在最后面贴上别人的链接。
1.在vue2页面的移动端中使用;
2.在uni-app开发的微信小程序中使用;

1.用在vue页面:

代码:

<template>
    <div ref="truncatedText" class="text">
      {{ truncatedText }}
    </div>
  </template>
  
  <script>
  export default {
    props: {
      text: String,
    },
    data() {
      return {
        actualWidth: 0
      };
    },
    computed: {
      truncatedText() {
        if (!this.actualWidth) {
          return this.text;
        }
        // 这里是我后面发现有点Bug加的,本意就是当文字的长度小于我们的宽度的时候,就全部展示文字
  		let textWidth2 = this.getTextWidth(testText);
  		if(textWidth2  < his.actualWidth ) return this.text
  		// 这里结束
        const ellipsis = '...';
        let start = 0;
        let end = this.text.length;
        let middle = Math.floor((start + end) / 2);
  
        while (start < middle) {
          const testText = this.text.slice(0, middle) + ellipsis + this.text.slice(-middle);
          const testWidth = this.getTextWidth(testText);
  
          if (testWidth > this.actualWidth) {
            end = middle;
          } else {
            start = middle;
          }
  
          middle = Math.floor((start + end) / 2);
  
          if (middle === start || middle === end) {
            break;
          }
        }
  
        return this.text.slice(0, middle) + ellipsis + this.text.slice(-middle);
      }
    },
    mounted() {
      this.$nextTick(() => {
        this.actualWidth = this.$refs.truncatedText.offsetWidth;
      });
    },
    methods: {
      getTextWidth(text) {
        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');
        context.font = getComputedStyle(this.$refs.truncatedText).font;
        return context.measureText(text).width;
      }
    }
  };
  </script>
  
  <style scoped>
  .text {
    white-space: nowrap;
    overflow: hidden;
  }
  </style>

使用

<truncatedText :text="longText" />

2.用在uni-app上(我这里是用uni-app开发微信小程序)

代码:

<template>
    <div ref="truncatedText" class="text">
      {{ truncatedText }}
    </div>
  </template>
  
  <script>
  export default {
    props: {
      text: String,
    },
    data() {
      return {
        actualWidth: 0
      };
    },
    computed: {
      truncatedText() {
        if (!this.actualWidth) {
          return this.text;
        }
				const fullWidth = this.getTextWidth(this.text);
				if(fullWidth <= this.actualWidth) return this.text
        const ellipsis = '......';
        let start = 0;
        let end = this.text.length;
        let middle = Math.floor((start + end) / 2);
					
				if(this.actualWidth < end) {
					return this.text
				}
        while (start < middle) {
          const testText = this.text.slice(0, middle) + ellipsis + this.text.slice(-middle);
          const testWidth = this.getTextWidth(testText);
  
          if (testWidth > this.actualWidth) {
            end = middle;
          } else {
            start = middle;
          }
  
          middle = Math.floor((start + end) / 2);
  
          if (middle === start || middle === end) {
            break;
          }
        }
  
        return this.text.slice(0, middle) + ellipsis + this.text.slice(-middle);
      }
    },
			
		mounted() {
			this.getActualWidth();
		},
    methods: {
      getActualWidth() {
            const query = uni.createSelectorQuery().in(this);
            query.select('.text').boundingClientRect(rect => {
              this.actualWidth = rect.width;
            }).exec();
          },
          getTextWidth(text) {
            const context = uni.createCanvasContext('measureCanvas', this);
            context.setFontSize(14);
            return context.measureText(text).width;
          }
    }
  };
  </script>
  
  <style scoped>
  .text {
    white-space: nowrap;
    overflow: hidden;
		text-align: justify;
  }
  </style>

使用:有点小区别
在样式上有点改动



<template>
  <view class="index">
		<uni-card title="基础卡片" sub-title="副标题" extra="额外信息" thumbnail="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png">
			<text>这是一个带头像和双标题的基础卡片,此示例展示了一个完整的卡片。</text>
		</uni-card>
		    <view>
		      <MiddleEllipsis :text="longText" />
		    </view>
		<view class="box">
			<view style="text-align: justify;">
				<truncatedText :text="longText" />
			</view>
			<view class="box-two">测试数据</view>
		</view>
	</view>
</template>

<script>
import MiddleEllipsis from '../../components/MiddleEllipsis/MiddleEllipsis.vue';
import truncatedText from '../../components/truncatedText/truncatedText.vue'

export default {
  components: { MiddleEllipsis,truncatedText },
  data() {
    return {
      longText: '这是一个需要中间省略的长文本示例,当容器宽度不足时显示省略号当容器宽度不足时显示省略号'
    };
  }
};
</script>
<style scoped>
	
.box {
  display: flex;
  align-items: center;
  padding: 10px;
}

.box > view:first-child {
  flex: 1;
  min-width: 0; /* 关键:允许文本容器压缩 */
}

.box-two {
  flex-shrink: 0; 
  max-width: 100px;
	margin-left: 5px;
}
</style>

别人使用js或css实现的,用了好几种方法,可以参考一下:
稀土掘金的资源
https://juejin.cn/post/7329967013923962895?searchId=20250412072930F6FA31D13CD50B9A187D#heading-2

点击蓝色的超链接也可以

相关文章:

  • K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战
  • GitHub 趋势日报 (2025年04月12日)
  • 【C++】继承:万字总结
  • 《2025四大AI终极对决:如何用ChatGPT、DeepSeek、通义千问和文心一言提升项目管理效率?》
  • STM32 HAL库SPI读写W25Q128(软件模拟+硬件spi)
  • Python基础总结(四)之元组
  • 计算机视觉6——相机基础
  • (自用)毕业论文格式
  • 文件操作和 IO - 一些具体的使用栗子
  • 动手学深度学习:手语视频在VGG模型中的测试
  • 测试 笔记
  • 【计网】网络交换技术之报文交换(复习自用,了解,重要3)
  • 0x06.Redis 中常见的数据类型有哪些?
  • FutureTask 源码解析
  • 深入剖析 Axios 的 POST 请求:何时使用 qs 处理数据
  • 0基础 | 硬件滤波 C、RC、LC、π型
  • 基于Springboot+Mysql的闲一品(含LW+PPT+源码+系统演示视频+安装说明)
  • [16届蓝桥杯 2025 c++省 B] 水质检测
  • Axure疑难杂症:详解横向菜单左右拖动效果及阈值说明
  • 在Fortran程序中嵌入Lua解释器
  • “85后”贵阳市政府驻重庆办事处主任吴育材拟任新职
  • 鸿海下调全年营收展望:AI服务器业务强劲,预计今年营收增超50%
  • 知名猎头公司创始人兼首席执行官庄华因突发疾病逝世,享年62岁
  • 腾讯一季度营收增长13%,马化腾:战略性的AI投入将带来长期回报
  • 中科飞测将投资超10亿元,在上海张江成立第二总部
  • 西安市未央区委书记刘国荣已任西咸新区党工委书记