省略号(一行多行)vue3

news2024/9/28 11:21:43

组件

<template>
  <div ref="tooltipParentRef" class="moreTipText">
    <el-tooltip
      :placement="props.placement"
      effect="dark"
      :enterable="true"
      :show-after="200"
      :offset="10"
      :popper-class="props.textTooltipPopperClass"
      :content="props.content"
      :disabled="disabledTooltip"
    >
      <span
        v-if="!isOpen"
        :class="[
          'tooltip_text',
          textClassName,
          !disabledTooltip ? 'tooltip_ellipsis_text' : '',
          !disabledTooltip ? textEllipsisClassName : ''
        ]"
        :style="{ color: color }"
        style="width: 100%"
        >{{ props.content }}
        <span v-if="props.fistLevel && props.fistLevel.length >= 0" class="fistLevel"
          >({{ props.fistLevel }})</span
        >
        <!-- <span
          v-if="props.fistLevel && props.fistLevel.length >= 0 && !disabledTooltip"
          class="fistLevelpos fistLevel"
          >({{ props.fistLevel }})</span
        > -->
      </span>

      <span
        v-else
        :class="[
          'tooltip_text',
          textClassName,
          !disabledTooltip ? 'tooltip_ellipsis_text' : '',
          !disabledTooltip ? textEllipsisClassName : ''
        ]"
        :style="{ color: color }"
        style="cursor: pointer"
        @click="openLink"
      >
        {{ props.content }}
      </span>
    </el-tooltip>
  </div>
</template>

<script lang="ts" setup>
import { ref, watch } from "vue"
const props = defineProps({
  content: {
    type: String,
    default: ""
  },
  width: {
    type: String,
    default: ""
  },
  line: {
    type: Number,
    default: 1
  },
  textClassName: {
    type: String,
    default: ""
  },
  textEllipsisClassName: {
    type: String,
    default: ""
  },
  textTooltipPopperClass: {
    type: String,
    default: "default_text-tooltip_popper"
  },
  color: {
    type: String,
    default: ""
  },
  isOpen: {
    type: Boolean,
    default: false
  },
  url: {
    type: String,
    default: ""
  },
  fistLevel: {
    type: String,
    default: ""
  },
  placement: {
    type: String,
    default: "top"
  }
})
const disabledTooltip = ref(true)
const tooltipParentRef = ref()
// 判断当前行文本是否移除
const isEllipsisActive = () => {
  // getClientRects详细介绍以及案例:https://blog.csdn.net/HeMister/article/details/137640173
  const DOMRectList = tooltipParentRef.value
    ? tooltipParentRef.value.children[0].getClientRects()
    : []
  // DOMRectList.length > = props.line 说明超出显示的行数
  if (DOMRectList.length == 1) {
    return DOMRectList[0].width <= tooltipParentRef.value.clientWidth
  } else {
    return DOMRectList.length <= props.line
  }
}
watch(
  () => props.content,
  () => {
    updateStatus()
  },
  {
    immediate: true
  }
)
function updateStatus() {
  setTimeout(() => {
    disabledTooltip.value = isEllipsisActive()
  })
}

const openLink = () => {
  window.open(props.url, "_blank")
}

defineExpose({
  updateStatus
})
</script>
<style lang="scss" scoped>
.tooltip_text {
  word-break: break-all;
}
.tooltip_ellipsis_text {
  &::before {
    content: "";
    display: block;
  }
}
.isacitve {
  position: relative !important;
  padding-right: 15px;
}
.fistLevel {
  font-family: PingFangSC-Medium;
  font-weight: 500;
  font-size: 14px;
  color: #303133;
}
.fistLevelpos {
  position: absolute;
  right: -1px;
  top: 0px;
}
.moreTipText {
  overflow: hidden;
  text-overflow: ellipsis;
}
</style>

使用

# 一行

<div class="info-item_box-item" style="margin-bottom: 20px">
                <img :src="detailData.logo" alt="" class="logo" v-if="detailData.logo" />
                <svg-icon icon-class="default_firm" size="46px" style="margin-right: 16px" v-else />
                <div style="width: calc(100% - 118px); display: flex; align-items: center">
                  <newTooltipText
                    :content="detailData[item.code]"
                    :line="1"
                    textTooltipPopperClass="table_tooltip2"
                    v-slot="slotProps"
                  >
                    <span
                      class="line_ellipsis_1 info-item_value firm_title"
                      @mouseover.self="slotProps.mouseoverSelf"
                      >{{ detailData[item.code] }}</span
                    >
                  </newTooltipText>
                </div>



.line_ellipsis_1 {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.table_tooltip2 {
  max-width: 400px;
  white-space: pre-wrap;
}

1、父元素设置宽度

2、 :line="1"

3、单行省略号

.line_ellipsis_1 {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

# 多行

 <div style="width: calc(100% - 118px)">
                    <newTooltipText
                      :content="detailData[item.code]"
                      :line="2"
                      textTooltipPopperClass="table_tooltip2"
                      v-slot="slotProps"
                    >
                      <span
                        class="line_ellipsis_2 info-item_value"
                        @mouseover.self="slotProps.mouseoverSelf"
                        >{{ detailData[item.code] }}</span
                      >
                    </newTooltipText>
                  </div>


.line_ellipsis_2 {
  line-height: 24px;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
.table_tooltip2 {
  max-width: 400px;
  white-space: pre-wrap;
}

1、父元素设置宽度

2、 :line="2"

3、单行省略号

.line_ellipsis_2 {

line-height: 24px;

overflow: hidden;

text-overflow: ellipsis;

display: -webkit-box; //单行没有

-webkit-line-clamp: 2;; //单行没有

-webkit-box-orient: vertical;; //单行没有

}

# 原理

一行看的是宽度:文字超过宽度,就会出省略号 

多行 看的是高度: 设置的2行,如果文字超过3行,他会发现超出高度,就会出省略号 

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

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

相关文章

声纹API验证快速检索技术实现

一、实现思路&#xff0c;假如我们有4个人员&#xff0c;要从中快速找到4号的发音&#xff0c;那么我们就可以使用声纹API验证技术。 二、首先我们要创建特征库&#xff0c;然后分别添加到特征库里&#xff0c;随后找另一个人发音不同的音频去快速定位寻找。 三、比如我们要找到…

什么是集成测试?它和系统测试的区别是什么?

01 什么是集成测试&#xff1f; 集成测试是软件测试的一种方法&#xff0c;用于测试不同的软件模块之间的交互和协作是否正常。集成测试的主要目的是确保不同的软件模块能够无缝协作&#xff0c;形成一个完整的软件系统&#xff0c;并且能够满足系统的需求和规格。 在集成测试…

yml Unused property

问题描述 以前用的好好的项目,今天突然打开就发现idea不识别spring配置信息显示未引用,如果config代码中引入的配置却可以高亮显示,然后输入spring相关的配置,文件是没有提示的。经过研究发现是spring相关的插件被关闭了。效果如下 解决方法 启用三个插件spring Boot,Sp…

openEuler:ssh 管理和安全

ssh 简介 ssh 为 secure shell&#xff0c;是一种网络安全协议&#xff0c;通过加密和认证的方式实现远程安全登录&#xff0c;文件传输等服务。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 但是在近期&#xff0c;OpenSSH 爆出首个远程执行漏洞 CVE-2024-6387 …

R18 XR :NR L2 enhancement

这篇主要看下为支持XR,L2都有哪些增强。主要分3个部分:(1)additionalBS-TableAllowed和Delay Status Report(DSR) (2)UE assistance info for UL traffic information (3) PDU set discard。正文开始: 为了增强 XR 上行资源的调度,引入了以下改进: (1)一个额外的buffer s…

c++类(中)续

c类&#xff08;中&#xff09;续 一、日期类&#xff08;1&#xff09;什么是日期类&#xff1f;&#xff08;2&#xff09;日期类的初始化与销毁&#xff08;3&#xff09;我们需要完成的操作(1)初始化与输出日期&#xff08;2&#xff09;日期加等于天数&#xff08;3&#…

Linux实现进度条小程序——缓冲区

&#x1f4dd;Linux实现进度条小程序 &#x1f4dd; 行缓冲区&#x1f4dd; fflush函数&#x1f4dd; 示例&#x1f4dd; 进度条如何编译运行proc.hproc.cmain.c 好雨知时节 当春乃发生 随风潜入夜 润物细无声 回车换行其实是两个概念&#xff0c;一是回车&#xff0c;一是换行…

JAVA毕业设计167—基于Java+Springboot+vue3+小程序的物业管理系统小程序(源代码+数据库+万字论文+文献综述)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3小程序的物业管理系统小程序(源代码数据库万字论文文献综述)167 一、系统介绍 本项目前后端分离带小程序(可以改为ssm版本)&#xff0c;分为用户、管理员两…

微服务--认识微服务

微服务架构的演变 1. 单体架构&#xff08;Monolithic&#xff09; 阶段描述&#xff1a;在单体应用时代&#xff0c;整个应用程序被设计为一个项目&#xff0c;并在一个进程内运行。这种架构方式开发简单&#xff0c;便于集中管理&#xff0c;但随着应用的复杂化&#xff0c…

[000-01-008].第01节:Nacos开发应用

我的后端学习大纲 SpringCloud学习大纲 2.Nacos功能&#xff1a; Nacos可以作为服务的注册中心&#xff0c;也可以作为服务配置中心&#xff1a; 服务发现与服务健康检查:Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务&#xff0c;Nacos还提供服务的实时健康检查&…

无人机遥控器工作原理!!!

一、基本组成 无人机遥控器通常由发射端&#xff08;遥控器本体&#xff09;和接收端&#xff08;安装在无人机上的接收模块&#xff09;两部分组成。发射端包含控制杆、按钮、显示屏等物理控件&#xff0c;用于输入控制指令&#xff1b;接收端则负责接收来自发射端的无线电信…

机器人外呼的具体操作步骤是怎样的?

今天小编给大家整理一下几点关于使用AI机器人拨打电销电话的具体步骤可以归纳为以下几个关键环节&#xff1a; ​ ### 一、选择合适的AI机器人服务 1. **平台选择**&#xff1a; - 选择一个提供AI机器人拨打电话服务的平台&#xff0c;这可以是云端的AI电话机器人服务&#…

关于docker-maven-plugin在arm架构的机器上制作镜像报错

背景 客户环境提供的容器集群全是arm架构&#xff0c;因此打包时要在arm架构的电脑上来制作镜像&#xff0c;本人使用mac m3芯片macbook&#xff0c;但是执行mvn clean package -D maven.test.skiptrue docker:build 命令时报错&#xff0c;报错信息如下&#xff1a; Caused …

数据分析及应用:如何分析基于绝对中位差的异常值检测问题?

目录 0 场景描述 1 数据准备 2 问题分析 abs(rn - (cnt+1)/2) < 1 3 小结 0 场景描述 数据集中可能存在异常的值。值存在异常有多种原因: (1)可能是数据收集方式有问题,比如记录值的仪表存在误差;(2)可能是数据输入错误导致的;(3)还可能是因为数据生成时环境…

基于web 在线影院系统网站设计与实现

3.1 系统基本情况描述 在线影院系统需要实现的功能包括用户的管理&#xff0c;以及视频信息的管理和使用等。具体来讲&#xff0c;它包含用户管理中常见的注册、登录操作&#xff0c;视频信息的显示、播放、搜索操作&#xff0c;视频管理中的添加、删除、修改等。同时为了方便…

【VScode环境配置】在VScode中配置php环境(wamp版)

1.前置准备 1.wamp&#xff08;集成环境&#xff09; 2.Visual Studio Code 2.系统变量配置 1.打开php所在路径&#xff1a; 一般在你所安装的wamp的bin目录文件夹下。wamp可以自定义安装路径&#xff0c;每个人的位置不一样&#xff0c;这里是拿作者的路径作为演示。 C:…

Golang | Leetcode Golang题解之第382题链表随机节点

题目&#xff1a; 题解&#xff1a; type Solution struct {head *ListNode }func Constructor(head *ListNode) Solution {return Solution{head} }func (s *Solution) GetRandom() (ans int) {for node, i : s.head, 1; node ! nil; node node.Next {if rand.Intn(i) 0 { …

mysql与es数据同步

同步方案 1. 同步双写 同步双写是一种数据同步策略&#xff0c;它指的是在主数据库&#xff08;如MySQL&#xff09;上进行数据修改操作时&#xff0c;同时将这些修改同步写入到ES中。这种策略旨在确保两个数据库之间的数据一致性&#xff0c;并优化系统的读写性能。 目标 …

es映射配置(_mapping)

文章目录 1、创建映射字段2、查看映射关系 1、创建映射字段 PUT /索引库名/_mapping {"properties": {"字段名": {"type": "类型","index": true&#xff0c;"store": true&#xff0c;"analyzer": &q…

python-矩阵交换行

[题目描述] 给定一个 55 的矩阵(数学上&#xff0c;一个 rc 的矩阵是一个由 r 行 c 列元素排列成的矩形阵列)&#xff0c;将第 n 行和第 m 行交换&#xff0c;输出交换后的结果。输入&#xff1a; 输入共 6 行&#xff0c;前 5 行为矩阵的每一行元素&#xff0c;元素与元素之间…