Vue3文本省略(Ellipsis)

news2024/11/18 3:39:21

APIs

参数说明类型默认值必传
maxWidth文本最大宽度number | string‘100%’false
line最大行数numberundefinedfalse
trigger展开的触发方式‘click’undefinedfalse
tooltip是否启用文本提示框booleantruefalse
tooltipMaxWidth提示框内容最大宽度,单位px,默认不设置时,提示文本内容自动与展示文本宽度保持一致numberundefinedfalse
tooltipFontSize提示文本字体大小,单位px,优先级高于 overlayStylenumber14false
tooltipColor提示文本字体颜色,优先级高于 overlayStylestring‘#FFF’false
tooltipBackgroundColor提示框背景颜色,优先级高于 overlayStylestring‘rgba(0, 0, 0, .85)’false
tooltipOverlayStyle提示框内容区域样式CSSProperties{padding: ‘8px 12px’, textAlign: ‘justify’}false

Events

事件名称说明参数
expand点击文本展开收起时的回调(expand: boolean) => void

效果如下图:在线预览

在这里插入图片描述

创建文本省略组件Ellipsis.vue

其中引入使用了 Vue3文本提示(Tooltip)

<script setup lang="ts">
import Tooltip from '../tooltip'
import { ref, computed, watchEffect, nextTick } from 'vue'
import type { CSSProperties } from 'vue'
interface Props {
  maxWidth?: number|string // 文本最大宽度
  line?: number // 最大行数
  trigger?: 'click' // 展开的触发方式
  tooltip?: boolean // 是否启用文本提示框
  // 以下均为 tooltip 组件属性
  tooltipMaxWidth?: number // 提示框内容最大宽度,单位px,默认不设置时,提示文本内容自动与展示文本宽度保持一致
  tooltipFontSize?: number // 提示文本字体大小,单位px,优先级高于 overlayStyle
  tooltipColor?: string // 提示文本字体颜色,优先级高于 overlayStyle
  tooltipBackgroundColor?: string // 提示框背景颜色,优先级高于 overlayStyle
  tooltipOverlayStyle?: CSSProperties // 提示框内容区域样式
}
const props = withDefaults(defineProps<Props>(), {
  maxWidth: '100%',
  line: undefined,
  trigger: undefined,
  tooltip: true,
  tooltipMaxWidth: undefined,
  tooltipFontSize: 14,
  tooltipColor: '#FFF',
  tooltipBackgroundColor: 'rgba(0, 0, 0, .85)',
  tooltipOverlayStyle: () => ({padding: '8px 12px', textAlign: 'justify'})
})
const textMaxWidth = computed(() => {
  if (typeof props.maxWidth === 'number') {
    return props.maxWidth + 'px'
  }
  return props.maxWidth
})
const showTooltip = ref()
const ellipsis = ref()
const defaultTooltipMaxWidth = ref()
watchEffect(() => {
  showTooltip.value = props.tooltip
})
watchEffect(() => {
  if (props.tooltip) {
    if (props.tooltipMaxWidth) {
      defaultTooltipMaxWidth.value = props.tooltipMaxWidth
    } else {
      defaultTooltipMaxWidth.value = ellipsis.value.offsetWidth + 24
    }
  }
}, {flush: 'post'})
const emit = defineEmits(['expand'])
function onExpand () {
  if (ellipsis.value.style['-webkit-line-clamp']) {
    if (props.tooltip) {
      showTooltip.value = false
      nextTick(() => {
        ellipsis.value.style['-webkit-line-clamp'] = ''
      })
    } else {
      ellipsis.value.style['-webkit-line-clamp'] = ''
    }
    emit('expand', true)
  } else {
    if (props.tooltip) {
      showTooltip.value = true
    }
    ellipsis.value.style['-webkit-line-clamp'] = props.line
    emit('expand', false)
  }
}
</script>
<template>
  <Tooltip
    v-if="showTooltip"
    :max-width="defaultTooltipMaxWidth"
    :fontSize="tooltipFontSize"
    :color="tooltipColor"
    :backgroundColor="tooltipBackgroundColor"
    :overlayStyle="tooltipOverlayStyle">
    <template #title>
      <slot name="tooltip">
        <slot></slot>
      </slot>
    </template>
    <div
      ref="ellipsis"
      class="m-ellipsis"
      :class="[line ? 'ellipsis-line' : 'not-ellipsis-line', {'cursor-pointer': trigger === 'click'}]"
      :style="`-webkit-line-clamp: ${line}; max-width: ${textMaxWidth};`"
      @click="trigger === 'click' ? onExpand() : () => false"
      v-bind="$attrs">
      <slot></slot>
    </div>
  </Tooltip>
  <div
    v-else
    ref="ellipsis"
    class="m-ellipsis"
    :class="[line ? 'ellipsis-line' : 'not-ellipsis-line', {'cursor-pointer': trigger === 'click'}]"
    :style="`-webkit-line-clamp: ${line}; max-width: ${textMaxWidth};`"
    @click="trigger === 'click' ? onExpand() : () => false"
    v-bind="$attrs">
    <slot></slot>
  </div>
</template>
<style lang="less" scoped>
.m-ellipsis {
  font-size: 14px;
  line-height: 1.5714285714285714;
  overflow: hidden;
  cursor: text;
}
.ellipsis-line {
  display: -webkit-inline-box;
  -webkit-box-orient: vertical;
}
.not-ellipsis-line {
  display: inline-block;
  vertical-align: bottom;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.cursor-pointer {
  cursor: pointer;
}
</style>

在要使用的页面引入

<template>
  <div>
    <h1>Ellipsis 文本省略</h1>
    <h2 class="mt30 mb10">基本使用</h2>
    <Ellipsis :maxWidth="240">
      住在我心里孤独的 孤独的海怪 痛苦之王 开始厌倦 深海的光 停滞的海浪
    </Ellipsis>
    <h2 class="mt30 mb10">多行省略</h2>
    <Ellipsis :line="2">
      电灯熄灭 物换星移 泥牛入海<br>黑暗好像 一颗巨石 按在胸口<br>独脚大盗
      百万富翁 摸爬滚打<br>黑暗好像 一颗巨石 按在胸口
    </Ellipsis>
    <h2 class="mt30 mb10">展开方式</h2>
    <Ellipsis trigger="click" :line="2">
      电灯熄灭 物换星移 泥牛入海<br>黑暗好像 一颗巨石 按在胸口<br>独脚大盗
      百万富翁 摸爬滚打<br>黑暗好像 一颗巨石 按在胸口
    </Ellipsis>
    <h2 class="mt30 mb10">定制 Tooltip 内容</h2>
    <Ellipsis :max-width="240">
      住在我心里孤独的 孤独的海怪 痛苦之王 开始厌倦 深海的光 停滞的海浪
      <template #tooltip>
        <div style="text-align: center">
          《秦皇岛》<br>住在我心里孤独的<br>孤独的海怪 痛苦之王<br>开始厌倦
          深海的光 停滞的海浪
        </div>
      </template>
    </Ellipsis>
  </div>
</template>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构--单链表OJ题

上文回顾---单链表 这章将来做一些链表的相关题目。 目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中的倒数第k个结点 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.相交链表 9.环形链表 ​编辑 10.环形链表II ​编辑 ​编辑 1.移除链表元素 思…

Camera之元数据(meta data)和原始数据(raw data)区别(三十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

JavaScript原生将图片转成base64

1.写个html文件 <!-- 产品照片 --> <div class"mb-3"> <label for"cover" class"form-label">产品图片</label><inputtype"file"class"form-control"id"coverfile"/> </div>…

这些你不容错过的音频转换器免费推荐给你

音频格式转换技术是一种能够将不同格式的音频文件互相转换的技术。你可能会想&#xff0c;为什么要进行音频格式转换呢&#xff1f;原因可是多种多样的&#xff01;有时候你可能收到了一个音频文件&#xff0c;但却无法在你的设备上播放&#xff0c;这时候就需要将其转换为兼容…

shiro快速入门

文章目录 权限管理什么是权限管理&#xff1f;什么是身份认证&#xff1f;什么是授权&#xff1f; 什么是shiro&#xff1f;shiro的核心架构shiro中的三个核心组件 shiro中的认证shiro中的授权shiro使用默认Ehcache实现缓存shiro使用redis作为缓存实现 权限管理 什么是权限管理…

从0到1学会手写操作系统,我只用了2个小时!!!

继《自己动手做一台计算机》 《嵌入式入门-模电基础》两大教程之后 黑马嵌入式教程再出力作 重磅发布第三弹 《自己动手写嵌入式操作系统》 问&#xff1a;嵌入式开发不是只学单片机就行&#xff1f;为什么要学操作系统&#xff1f; 答&#xff1a;年轻人&#xff0c;别把路…

LeetCode每日一题Day4——26. 删除有序数组中的重复项

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件&#xff0c;替换某个值 直接上代码&#xff0c;替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…

采购分析:节省采购成本的 6 种方法

为了成功启动采购计划、稳定现金流并节省开支&#xff0c;企业需要了解从采购到付款的 P2P 周期的方方面面。 有远见的采购领导者将采购分析作为综合战略的一部分。因其有助于以简化和自动化的方式解决问题&#xff0c;从而更好地管理项目并节省大量成本。 什么是采购分析&am…

docker删除容器(步骤详解)

要在Docker中删除容器&#xff0c;需要使用命令docker rm。 下面是详细步骤&#xff1a; 1. 首先&#xff0c;使用docker ps命令查看当前正在运行的容器。这个命令会列出所有正在运行的容器的ID、名称、状态等信息。 如果没有正在运行的容器可以通过docker ps -a 查看当前所…

Java中的内存划分,一个数组的内存图

Java中的内存划分 Java的内存需要分成5个部分&#xff1a; 栈&#xff08;Stack&#xff09; 存放的都是 方法 中的 局部变量 。方法的运行一定要在栈当中运行。 局部变量&#xff1a;方法的参数&#xff0c;或者是方法{}内部的变量 作用域&#xff1a;一旦超出作用域&#xff…

Stable Diffusion教程(7) - PS安装AI绘画插件教程

配套教程视频&#xff1a;https://v.douyin.com/Uyux9F6/ 1. 前置条件 安装了stable diffusion 还没安装的从知识库安装 阿超的AI绘画知识库 语雀 安装了ps2023 还没安装的从网盘下载Win版 PS 2023【必须win10、11】.rar官方版下载丨最新版下载丨绿色版下载丨APP下载-12…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Uiautomation实现CSDN同步同页面文章至社区(2023.08.03更新)

目录 运行代码前须知&#xff1a; 前言 技能Get1 代码主体部分 写在最后 运行代码前须知&#xff1a; 1.本次更新的代码是实现C站内容管理整页文章&#xff08;20篇文章&#xff09;同步到所有社区&#xff0c;因此需要自己先Ctrl滚轮实现25%放缩&#xff0c;使得页面能将…

迭代器模式——遍历聚合对象中的元素

1、简介 1.1、概述 在软件开发时&#xff0c;经常需要使用聚合对象来存储一系列数据。聚合对象拥有两个职责&#xff1a;一是存储数据&#xff1b;二是遍历数据。从依赖性来看&#xff0c;前者是聚合对象的基本职责&#xff1b;而后者既是可变化的&#xff0c;又是可分离的。…

【MySQL】仓储模块,核对出入库流水

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

在敏捷项目中如何做好资源规划?

敏捷项目管理是一种交付项目的迭代方法&#xff0c;主要用于软件开发项目。该方法由多个迭代或增量步骤组成&#xff0c;以实现最终目标。在敏捷的环境下工作&#xff0c;难免遇到以下这些情况&#xff1a; ● 人员和团队通常必须将时间分配到不同的项目上。 ● 敏捷和非敏捷工…

【Linux】创建与删除用户

新增用户&#xff1a; adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户&#xff1a; userdel -r 用户名【删除用户】

字段填充策略 FieldFill

实体类中有如下属性&#xff0c;通过上面的自动填充属性&#xff0c;我们可以实现在进行插入&#xff08;insert&#xff09;操作时对添加了注解TableField(fill FieldFill.INSERT)的字段进行自动填充&#xff08;解释&#xff1a;后面会写配置自动填充的配置类&#xff0c;该…

举个栗子~Quick BI 技巧(2):创建柱线组合图

上一期举个栗子为数据粉们分享了如何简单几步创建趋势折线图&#xff0c;有一些数据粉发来疑问&#xff1a;如何利用 Quick BI 制作柱线图呢&#xff1f; 线柱图是一种非常重要且常用的组合图表&#xff0c;可以将两组数据在同一个表中直观的表达。今天的栗子&#xff0c;我们…