Vue 文本超过三行展示省略号,并加上展开和收起的功能

场景:在vue项目中文本超过三行展示省略号,并加上展开和收起的功能

在处理多行文本时,经常会遇到各种各样的需求,比如至多展示三行,多余的部分不展示并以省略号结尾;又比如在这个基础上加上一个展开和收起的功能。同时UI的展示上还要求和文本本身的位置相对应。

具体实现思路如下:

  1、判断当前内容是否超过三行。此处可以给每行设置一个行高line-height,渲染完后超过三倍的行高即认为是内容超过了三行。

  2、展示/收起状态的切换可以通过data中的参数来绑定

  3、在底部使用position:absolute来绝对定位展开该在的位置。

  4、根据业务需求来设定好展开和收起按钮需要呆的地方。

其中需要注意的点有

  1、展开收起按钮的高度和行高要和原来文本的行高一致,不然会导致样式不统一。

  2、获取文本的高度时要注意使用this.$nextTick()来保证DOM渲染完成后再获取高度

  3、在不同场景下省略号可能不能够完全遮住最后几个字,可以通过调节空格,字体排布方式等办法来调整,或者不要把展开和文本放在同一行,另起一行并且在末尾打开省略文本的样式

下面是我在日常迭代中写的一个比较简单的三行展示省略号并带有展开收起功能的小例子。欢迎大佬们指正~

先上具体实现代码:

<template>
    <div class="content-wrap">
        <div :class="['content', expande ? 'expande' : 'close']" ref="content">
            思路:1、判断当前内容是否超过三行。此处可以给每行设置一个行高line-height,渲染完后超过三倍的行高即认为是内容超过了三行。2、展示/收起状态的切换可以通过data中的参数来绑定。3、在底部使用position:absolute来绝对定位展开该在的位置。4、根据业务需求来设定好展开和收起按钮需要呆的地方。
        </div>
        <div
            class="expande-button-wrap"
            v-if="needShowExpande"
        >
            <div class="expande-button" @click="expandeClick" v-if="!expande">
                <span style="color: black">...</span> 展开
            </div>
            <div class="expande-button" @click="expandeClick" v-else>收起</div>
        </div>
    </div>
</template>
<script>
export default {
    name: 'App',
    data() {
        return {
            expande: true,
            needShowExpande: false,
        }
    },
    methods: {
        expandeClick() {
            console.log('expandeClick')
            this.expande = !this.expande
        },
    },
    mounted() {
        this.$nextTick(() => {
            let lineHeight = 22
            if (this.$refs.content.offsetHeight > lineHeight * 3) {
                this.expande = false
                this.needShowExpande = true
            } else {
                this.expande = true
            }
        })
    },
}
</script>
.expande {
  height: auto;
}
.close {
  height: 65px;
  overflow: hidden;
}

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
您可以使用 Vue 的计算属性和 CSS 样式来实现这个功能。 1. 首先,您需要将文本内容存储在一个 Vue data 属性中: ```js data() { return { text: '这是一段超过三行文本内容,需要显示展开按钮' } } ``` 2. 接下来,您可以编写一个计算属性来确定文本是否超过三行: ```js computed: { isTextOverflow() { const element = document.createElement('div') element.innerText = this.text element.style.position = 'absolute' element.style.visibility = 'hidden' element.style.height = 'auto' element.style.width = '300px' // 假设文本宽度为 300px document.body.appendChild(element) const isOverflow = element.offsetHeight > 3 * parseFloat(window.getComputedStyle(element).lineHeight) document.body.removeChild(element) return isOverflow } } ``` 此计算属性将创建一个 div 元素,将文本内容插入其中,然后将其添加到页面中以获取其高度。然后,它将检查文本是否超过三行,通过计算元素的高度和高来实现。最后,它将从页面中删除元素,并返回一个布尔值,指示文本是否超过三行。 3. 最后,您可以使用 v-if 指令根据计算属性的返回值来显示或隐藏展开按钮: ```html <div> <p :class="{ 'text-overflow': isTextOverflow }">{{ text }}</p> <button v-if="isTextOverflow">展开</button> </div> ``` 在此示例中,我们为文本段落添加了一个名为 "text-overflow" 的 CSS 类,以便在文本超过三行时将其截断。我们还使用 v-if 指令来确定是否应显示展开按钮。 最后,您可以使用 CSS 样式来设置文本段落的截断和展开按钮的样式: ```css .text-overflow { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; } button { background-color: #007bff; color: #fff; border: none; padding: 5px 10px; border-radius: 5px; cursor: pointer; } ``` 这将通过使用 -webkit-box 属性将文本段落截断为三行,并使用省略号来表示文本的截断。展开按钮将具有蓝色背景和白色文本,并具有一些基本的边框半径和内边距。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值