<aside> 📖 目录
</aside>
多行文本超过指定行数,进行文本截断并显示省略号,并通过展开和收起来控制是否显示全部内容,这个功能很常见,实现方式也有很多种,那么我来整理一下我知道的几种实现方式,代码实现是基于 Vue3。
demo: xiaocheng555.github.io/text-ellips…
实现核心就是 -webkit-line-clamp 属性,使用 -webkit-line-clamp 来截断行数,具体 css 代码就是下面这个:
div {
display: -webkit-box;// 弹性伸缩盒子模型
-webkit-box-orient: vertical;// 从顶部向底部垂直布置子元素
overflow: hidden;// 隐藏文本溢出内容
-webkit-line-clamp: 3;// 截断行数
}
1、设置省略样式,动态传入行数来控制文本截断的行数
<div class="text-ellipsis">
<div
ref="contentEl"
class="text-ellipsis-content"
:style="{ '-webkit-line-clamp': isExpand ? 'unset' : rows }">
{{content}}
</div>
</div>
.text-ellipsis-content {
display: -webkit-box;
-webkit-box-orient: vertical;
word-break: break-all;
overflow: hidden;
}
2、js 判断文本是否溢出
容器的文本内容高度超过容器本身的高度, 就可以判断为文本溢出
const { offsetHeight, scrollHeight } = contentEl.value
isEll.value = scrollHeight > offsetHeight
3、显示展开、收起
文本溢出则显示展开、收起按钮
<span v-if="isEll" class="text-ellipsis-action" @click="onActionClick">{{actionText}}</span>
const actionText = computed(() => {
return isExpand.value ? props.collapseText : props.expandText
})
// 展开/收起点击
function onActionClick () {
isExpand.value = !isExpand.value
}