javascript控制文本显示一行半,超出显示省略号

JS实现文本一行半或两行半显示省略号
前端开发中,用CSS可实现文本一行或两行显示并超出省略,但一行半或两行半显示单纯用CSS无法实现,需用JS。文中封装了JS方法,参数可控制显示行数,还提到实现原理及获取文本大小可能遇到的问题和解决办法。

在前端开发过程中,我们经常会遇到控制文本显示一行或两行,超出显示省略号的需求,这个实现也非常简单,用css简单几行代码就搞定了。但是需求无处不在,现在需要将文本控制为一行半或者两行半,这个貌似单纯用css是无法实现的,所以自己只能用js来实现了。

javascript控制文本显示一行半,超出显示省略号

<script type="text/javascript">
			var dom = document.getElementsByClassName("love");
			jsLine(1.5,dom);
			function jsLine(line,className){
				var textLength=className[0]['childNodes'][0].length;//文本长度
				var fontSize=getComputedStyle(className[0],undefined).getPropertyValue("font-size").substr(0,2);//获取字体大小
				var lineNum=Math.round(className[0].clientWidth/fontSize);//四舍五入,一行有多少字
				if(textLength>(lineNum*line)){
					var newText=className[0].innerText.substr(0,(Math.round(lineNum*line)))+'...';
					className[0].innerText=newText;
				}
			}
</script>

这里已经封装好了方法jsLine(line,className),可以直接拿去用的,其中line参数是控制文本显示的行数,一行半就是1.5,两行半2.5,className是要控制的文本类名,记住要使用类选择器哦。
实现原理:
利用文本宽度/文本大小= 一行有多少字符,然后一行有多少字符*需要控制的行数=需要显示的字符数,需要显示的字符数有了,后面的就简单了,用substr()截取就行了。

这里面会遇到一个问题,如果没有对当前的文本font-size属性做设置的话,dom[0].style.fontSize会获取不到文本大小,有的朋友可能会说不设置那就是浏览器默认字体大小了,但是当前文本可能会继承其父类的font-size属性,也就是说并不是浏览器默认字体大小。那应该怎么解决呢?

var fontSize=getComputedStyle(className[0],undefined).getPropertyValue("font-size")

这行代码能让你获取浏览器渲染之后的字体大小。

在 UniApp 中实现文本超出五行时显示省略号,可以通过 CSS 的 `-webkit-line-clamp` 属性来控制文本显示行数,并结合 `text-overflow: ellipsis` 来实现省略号效果。具体实现方式如下: 在样式中定义如下 CSS 属性,限制文本容器的行数为 5 行,并在超出显示省略号: ```html <template> <view class="text-container"> {{ longText }} </view> </template> <style> .text-container { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 5; /* 限制显示行数为5行 */ overflow: hidden; text-overflow: ellipsis; } </style> ``` 上述样式通过 `-webkit-line-clamp` 控制最大显示行数,结合 `-webkit-box` 和 `vertical` 的排列方式,使文本超出设定行数时自动截断并显示省略号[^3]。 如果需要在文本被截断时添加“更多”按钮以展开全文,可以结合 JavaScript 动态判断文本是否被截断。例如,通过获取 DOM 元素的高度并结合行高进行判断。在 UniApp 中,由于运行环境的限制,不能直接使用浏览器 DOM 操作,但可以通过 `uni.createSelectorQuery()` 获取组件信息并进行逻辑判断: ```html <template> <view ref="textElement" class="text-container" :class="{ expanded: isExpanded }"> {{ longText }} </view> <text v-if="shouldExpand" @click="toggleExpand">{{ isExpanded ? '收起' : '更多' }}</text> </template> <script> export default { data() { return { isExpanded: false, shouldExpand: false, longText: '这是一段很长的文本内容,当内容超过五行时需要显示省略号,并提供“更多”按钮来展开全文。' }; }, mounted() { this.checkTextOverflow(); }, methods: { checkTextOverflow() { uni.createSelectorQuery() .select('.text-container') .boundingClientRect(res => { if (res && res.height > 100) { // 假设每行高度为20px,5行总高度为100px this.shouldExpand = true; } }) .exec(); }, toggleExpand() { this.isExpanded = !this.isExpanded; } } }; </script> ``` 在上述实现中,通过 `uni.createSelectorQuery()` 获取文本容器的高度,若其高度超过设定的行数总高度(如 5 行 × 20px = 100px),则显示“更多”按钮。点击按钮后切换 `isExpanded` 状态,从而控制文本是否展开显示全部内容[^1]。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值