Skip to content

v-ellipsis

使用 CSS 实现多行文本省略。在指定行数后截断文本。

起始版本: 1.3.0

用法

基本

vue
<template>
  <!-- 单行省略 -->
  <p v-ellipsis>这是一段很长的文本,将被省略号截断...</p>

  <!-- 多行省略 -->
  <p v-ellipsis="3">
    这是一段很长的文本,将在3行后被截断并显示省略号。
    文本会在这里继续,当超过指定行数时会被截断。
  </p>
</template>

带选项

vue
<template>
  <p v-ellipsis="{ lines: 2, expandable: true }">
    点击展开这段将在2行后被截断的长文本。
    expandable 选项允许用户点击查看完整内容。
  </p>
</template>

API

类型

typescript
interface EllipsisOptions {
  lines?: number // 默认: 1
  expandable?: boolean // 默认: false
  ellipsis?: string // 默认: '...'
}

选项

选项类型默认值描述
linesnumber1截断前的行数
expandablebooleanfalse允许点击展开/收起
ellipsisstring'...'自定义省略号字符串

Composable 用法

你也可以使用 useEllipsis composable 实现相同功能:

vue
<script setup>
import { ref } from 'vue'
import { useEllipsis } from 'directix'

const longText = ref('这是一段需要被截断的长文本')

const { truncated, isTruncated } = useEllipsis({
  text: longText,
  maxWidth: 200,
  lines: 1
})
</script>

<template>
  <span :title="isTruncated ? longText : ''">
    {{ truncated }}
  </span>
</template>

API

typescript
interface UseEllipsisOptions {
  /** 要截断的文本 */
  text: string | Ref<string>
  /** 截断前显示的行数 @default 1 */
  lines?: number | Ref<number>
  /** 自定义省略号字符串 @default '...' */
  ellipsis?: string | Ref<string>
  /** 最大宽度(像素,0 表示无限制) @default 0 */
  maxWidth?: number | Ref<number>
}

interface UseEllipsisReturn {
  /** 截断后的文本 */
  truncated: Ref<string>
  /** 文本是否被截断 */
  isTruncated: Ref<boolean>
  /** 原始文本 */
  original: Ref<string>
  /** 计算指定宽度的截断 */
  calculateForWidth: (width: number) => string
  /** 检查文本在指定宽度下是否会被截断 */
  wouldTruncate: (width: number) => boolean
}

示例

卡片描述

vue
<template>
  <div class="card">
    <h3>{{ title }}</h3>
    <p v-ellipsis="2" class="description">{{ description }}</p>
  </div>
</template>

<style scoped>
.description {
  line-height: 1.5;
}
</style>

可展开内容

vue
<template>
  <p v-ellipsis="{ lines: 3, expandable: true }">
    长文本可展开内容...
  </p>
</template>

基于 MIT 许可发布