【春哥博客技术教程分享】在开发微信小程序的过程中,经常会需要各种方便一点的功能,春哥团队技术大东在操作过程中就经常遇到,比如:有时候文本需要实现这样的功能:
1、文本超过n行显示省略号;
2、省略时,显示 展开/收起 按钮;
3、文本不超过n行时,不显示省略号和展开/收起按钮。
实现思路
文本过长显示省略号、展开和收起功能,通过css样式即可实现
判断是否显示展开/收起按钮:
通过嵌套元素,可以实现text既显示省略号,其高度又是全显示时的高度
通过SelectorQuery选择器,获取text及其父元素的高度,判断text高度是否超过其父元素高度,决定是否显示展开/收起按钮即可
代码
wxss
.frame {
width: 100%;
max-height: 206rpx;
text-align: left;
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
white-space: normal !important;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
.nofold {
display: block;
text-overflow: unset;
-webkit-line-clamp: unset;
max-height: unset;
}
frame样式设置最大高度,超过3行后出现省略号。overflow为hidden,使得text的超出父元素部分隐藏掉。nofold样式则将最大高度、出现省略号的行数去除,以展示全文。
wxml
<view id="frame" class='frame {{fold == false ? "nofold":""}}'>
<text id="content">{{detail}}</text>
</view>
wxml中,在view元素中嵌套text元素。样式写在view中,text不加任何样式(重要)。分别写上id,方便js代码获取其尺寸信息。
javascript
var query = this.createSelectorQuery();
query.select('#content').boundingClientRect();
query.select('#frame').boundingClientRect();
query.exec(function(res) {
if (res[0] && res[0].height) {
if (res[0].height > res[1].height) {
self.setData({
fold: true,
});
} else {
self.setData({
fold: null,
});
}
}
})
js代码中,通过选择器获取两者的高度,如果text高度高于view,则说明有省略文本,显示展开/收起按钮。
js的选择器如果是写在onshow/onload方法中,最好加上延迟,以防止出现判断时元素尚未渲染出来的情况。
今天就和大家分享到这里,如果有更多关于小程序开发的问题欢迎到春哥技术源码论坛区留言、探讨。