文本超长省略的几种方式(vue)

news2024/11/18 10:41:02

 第一种,纯css

在给容器设置宽度后,使用css来省略文本超长部分,但是这样就看不到全部的内容

<template>
  <div class="content">
    <div class="text">{{ text }}</div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const text = ref('这是一个内容特别长的div你知道吗不知道算了')

</script>

<style scoped>
.content {
  width: 800px;
  margin: 50px auto;
}

.text {
  width: 200px;
  overflow-x: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  cursor: pointer;
}
</style>

 

第二种 ,使用el-tooltip

普通使用

限制内容的长度,通过长度来控制是否需要使用el-tooltip

但是这样有弊端,如果内容是全英文呢?或者中英结合呢?有特殊符号呢?

没关系,我们一步一步来

<template>
  <div class="content">
    <el-tooltip v-if="text.length > 13" :content="text">
      <div class="text">{{ text }}</div>
    </el-tooltip>
    <div v-else class="text">{{ text }}</div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const text = ref('这是一个内容特别长的div你知道吗不知道算了')

</script>

<style scoped>
.content {
  width: 800px;
  margin: 50px auto;
}

.text {
  width: 200px;
  overflow-x: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  cursor: pointer;
}
</style>

普通使用-进阶版

不用文本的length来判断,而是通过文本所在容器的scrollWidthclientWidth来判断

效果同上

<template>
  <div class="content">
    <el-tooltip v-if="isOverflow" :content="text">
      <div class="text">{{ text }}</div>
    </el-tooltip>
    <div v-else class="text">{{ text }}</div>
  </div>
</template>

<script setup>
import { ref, onMounted, nextTick } from 'vue';

const text = ref('这是一个内容特别长的div你知道吗不知道算了')
const isOverflow = ref(false);

onMounted(() => {
  nextTick(() => {
    const element = document.querySelector(`.content .text`);
    isOverflow.value = element.scrollWidth > element.clientWidth;
  })
})
</script>

<style scoped>
.content {
  width: 800px;
  margin: 50px auto;
}

.text {
  width: 200px;
  overflow-x: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  cursor: pointer;
}
</style>

特殊使用

这里指的是在循环遍历的数据中,如何像普通使用-进阶版一样,把省略的内容呈现出来

<template>
  <div class="content">
    <div v-for="(item, index) in items" :key="index" class="text-box">
      <el-tooltip v-if="isOverflowing[index]" :content="item" placement="top">
        <div class="text-content">{{ item }}</div>
      </el-tooltip>
      <div v-else class="text-content">{{ item }}</div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted, nextTick } from 'vue';

const items = ['这是一个内容特别长的div你知道吗不知道算了', '它不长'];
const isOverflowing = ref([]);

const checkOverflow = () => {
  isOverflowing.value = items.map((_, index) => {
    const element = document.querySelector(`.text-box:nth-child(${index + 1}) .text-content`);
    return element.scrollWidth > element.clientWidth;
  });
};

onMounted(() => {
  nextTick(() => {
    checkOverflow();
  });
});
</script>
<style scoped>
.content {
  width: 800px;
  margin: 100px auto;
}

.text-content {
  width: 200px;
  overflow-x: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  cursor: pointer;
  margin-bottom: 10px;
}
</style>

 

特殊使用-进阶版

上面代码是一层遍历,如果是双层遍历就不能只通过document.querySelector来获取目标容器,需要结合refdata-index动态属性

<template>
  <div class="content">
    <div v-for="(item, index) in userList" :key="index" class="user-item">
      <div class="dept-box">
        <div class="dept-name">
          <div class="blue-circle"></div>

          <el-tooltip v-if="isOverflowing[index]" effect="dark" :content="item.departmentName" placement="top">
            <div class="name">{{ item.departmentName }}</div>
          </el-tooltip>
          <div v-else class="name">{{ item.departmentName }}</div>
        </div>
      </div>
      <div class="user-box">
        <div v-for="(userItem, userIndex) in item.user" :key="userIndex" ref="textRefs" class="user"
          :data-index="`${index}-${userIndex}`">
          <div class="green-circle"></div>
          <el-tooltip v-if="item.isOverflowing && item.isOverflowing[userIndex]" effect="dark"
            :content="userItem.userName" placement="top">
            <div class="username">{{ userItem.userName }}</div>
          </el-tooltip>
          <div v-else class="username">{{ userItem.userName }}</div>
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
import { ref, onMounted, nextTick } from 'vue';

const userList = ref([
  {
    departmentName: '部门1',
    user: [{ userName: '超长用户名测试测试测试测试测试测试测试测试测试测试' }, { userName: '正常用户名' }],
    isOverflowing: []
  },
  {
    departmentName: '这是一个名称特别长的部门你知道吗不知道算了害',
    user: [{ userName: '正常用户名' }, { userName: '超长用户名测试测试测试测试测试测试测试测试测试测试' }],
    isOverflowing: []
  }
]);

const isOverflowing = ref([]);
const textRefs = ref([]);

const checkOverflow = () => {
  nextTick(() => {
    //处理部门名超长
    isOverflowing.value = userList.value.map((_, index) => {
      const element = document.querySelector(`.user-item:nth-child(${index + 1}) .dept-box .dept-name .name`);
      return element.scrollWidth > element.clientWidth;
    });

    //处理人员名超长
    userList.value.forEach((item, index) => {
      item.isOverflowing = item.user.map((_, userIndex) => {
        const userElement = textRefs.value.find(ref => ref && ref.dataset && ref.dataset.index === `${index}-${userIndex}`);
        if (userElement) {
          const usernameElement = userElement.querySelector('.username');
          if (usernameElement) {
            return usernameElement.scrollWidth > usernameElement.clientWidth;
          }
        }
        return false;
      });
    });
  });
};

onMounted(() => {
  checkOverflow();
});

</script>
<style scoped lang="less">
.content {
  width: 800px;
  margin: 100px auto;

  .user-item {
    .dept-box {
      height: 46px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-top: 8px;
      cursor: pointer;

      .dept-name {
        font-weight: bold;
        display: flex;
        align-items: center;
        background: #ffffff;
        color: #395CD0;

        .blue-circle {
          width: 6px;
          height: 6px;
          border-radius: 6px;
          margin-right: 16px;
          background: #395CD0;
          margin-left: 17px;
        }

        .name {
          width: 137px;
          overflow-x: hidden;
          white-space: nowrap;
          text-overflow: ellipsis;
        }
      }
    }

    .user-box {
      .user {
        height: 22px;
        display: flex;
        align-items: center;
        margin-top: 16px;
        font-size: 14px;
        color: #333333;
        cursor: pointer;

        .green-circle {
          width: 6px;
          height: 6px;
          border-radius: 6px;
          background: #7AC953;
          margin-right: 12px;
          margin-left: 44px;
        }

        .username {
          width: 7.5vw;
          font-size: 14px;
          color: #333333;
          overflow-x: hidden;
          white-space: nowrap;
          text-overflow: ellipsis;
        }
      }
    }
  }
}
</style>

 

 

总结

以上所有情况皆博主所遇,记录下来方便以后查找

如果有更好的解决方法,欢迎指导

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

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

相关文章

ubuntu 安装说明

最近准备学习Linux&#xff0c;所以下载了最新的ubuntu server版本24.04&#xff0c;将安装步骤记录下来供参考。 1.安装 挂载光驱和iso文件&#xff0c;启动虚拟机。启动后&#xff0c;你会看到 GRUB 菜单上有两个选项&#xff1a; Try or Install Ubuntu Server 和 Test mem…

防水M7/8“航空法兰插座端子

防水M7/8"航空法兰插座广泛应用于传感器与执行器、电机马达、包装与传送系统、户外LED模块、轨道交通、船舶雷达与导航&#xff0c;以及现场总线DeviceNet与NMEA 2000开放型网络系统等应用领域。M7/8"插座作为一种常见的电气连接器件&#xff0c;在传感器领域中扮演着…

快手矩阵系统源码:技术优势解析

在短视频和直播行业迅猛发展的今天&#xff0c;快手凭借其强大的矩阵系统源码&#xff0c;为用户提供了多端管理、多账号管理、素材管理、视频批量上传、AI视频制作和定时发布等一系列高效功能。本文将深入探讨快手矩阵系统源码的多项优势&#xff0c;以及这些功能如何助力内容…

如何改善提示词,让 GPT-4 更高效准确地把视频内容整体转换成文章?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人&#xff0c;我一直有一个愿望&#xff1a;完成视频制作…

气象观测站:观测和记录各种气象要素

在广袤无垠的蓝天下&#xff0c;气象观测站如同一个个静默的守护者&#xff0c;默默记录着风云变幻&#xff0c;守护着大地的安宁。 一、气象观测站&#xff1a;守护天空的“千里眼” 气象观测站&#xff0c;顾名思义&#xff0c;就是专门用于观测和记录各种气象要素的站点。它…

UVa1265/LA4848 Tour Belt

UVa1265/LA4848 Tour Belt 题目链接题意分析AC 代码 题目链接 本题是2010年icpc亚洲区域赛大田赛区的F题 题意 给出一个有n个结点m条边的加权无向图G&#xff08;2≤n≤5000&#xff0c;1≤m≤n(n-1)/2&#xff09;&#xff0c;满足如下条件的结点集B&#xff08;2≤|B|≤n&am…

2025深圳国际消费电子展览会

2025深圳国际消费电子展览会 时间&#xff1a;2025年06月25-27日 地点&#xff1a;深圳国际会展中心(新馆) 详询主办方陆先生 I38&#xff08;前三位&#xff09; I82I&#xff08;中间四位&#xff09; 9I72&#xff08;后面四位&#xff09; 展会介绍&#xff1a; 20…

SAP-SD同一物料下单价格确不同

业务说明&#xff1a; 业务部门反馈&#xff0c;同一物料下销售订单时&#xff0c;价格确不同。 那么这个价格是怎么取到的呢&#xff1f; 逻辑说明&#xff1a; 1、首先查看销售订单 可以看到相同物料价格是不同的&#xff0c;条件类型都是ZPR5&#xff0c;但是客户是不同…

【新能源时代!看大模型(LLMs)如何助力汽车自动驾驶!】

文末有福利&#xff01; 引言 本文主要介绍大模型(LLMs)如何助力汽车自动驾驶&#xff0c;简单来说&#xff0c;作者首先带大家了解大模型的工作模式&#xff0c;然后介绍了自动驾驶大模型的3大应用场景&#xff0c;最后指出自动驾驶大模型将会是未来的发展趋势&#xff0c;只…

View->裁剪框View的绘制,手势处理

XML文件 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android…

CFS三层内网渗透——第二层内网打点并拿下第三层内网(三)

目录 八哥cms的后台历史漏洞 配置socks代理 ​以我的kali为例,手动添加 socks配置好了&#xff0c;直接sqlmap跑 ​登录进后台 蚁剑配置socks代理 ​ 测试连接 ​编辑 成功上线 上传正向后门 生成正向后门 上传后门 ​内网信息收集 ​进入目标二内网机器&#xf…

【linux进程】进程地址空间(什么是进程地址空间?为什么要有进程地址空间?)

目录 一、前言 二、 程序的地址空间是真实的 --- 物理空间吗&#xff1f; 三、进程地址空间 &#x1f525; 操作系统是如何建立起进程与物理内存之间的联系的呢&#xff1f; &#x1f525;什么是进程地址空间&#xff1f; &#x1f525;为什么不能直接去访问物理内存&a…

Protobuf(三):理论学习,简单总结

1. Protocol Buffers概述 Protocol Buffers&#xff08;简称protobuf&#xff09;&#xff0c;是谷歌用于序列化结构化数据的一种语言独立、平台独立且可扩展的机制&#xff0c;类似XML&#xff0c;但比XML更小、更快、更简单protobuf的工作流程如图所示 1.1 protobuf的优点…

Python酷库之旅-第三方库Pandas(003)

目录 一、用法精讲 4、pandas.read_csv函数 4-1、语法 4-2、参数 4-3、功能 4-4、返回值 4-5、说明 4-6、用法 4-6-1、创建csv文件 4-6-2、代码示例 4-6-3、结果输出 二、推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、Python魔法之旅 …

工业废水中镍超标怎么办?含镍废水处理方法有哪些?

镍是一种存在于自然界中的过渡金属。镍在土壤和岩石中的存量丰富&#xff0c;大部分镍已被氧化&#xff0c;或与其他元素结合成化合物。   含镍废水主要来源于电镀、合金制造、金属表面处理、电子等行业。这些行业在生产过程中&#xff0c;通常会使用含有镍离子的化学试剂&a…

kali改回官方源后更新失败

官方源&#xff1a; deb http://http.kali.org/kali kali-rolling main non-free contrib deb-src http://http.kali.org/kali kali-rolling main non-free contrib在文件 /etc/cat/sources.list中将官方源修改为&#xff1a; deb http://http.kali.org/kali kali-rolling ma…

等保测评需要什么SSL证书

在进行信息安全等级保护&#xff08;简称“等保”&#xff09;测评时&#xff0c;选择合适的HTTPS证书对于确保网站的安全性和合规性至关重要。以下是在等保测评中选择HTTPS证书时应考虑的因素&#xff1a; 国产证书&#xff1a; 等保测评倾向于使用国产品牌的SSL证书&#x…

科普文:一文搞懂jvm实战(二)Cleaner回收jvm资源

概叙 在JDK9中新增了Cleaner类&#xff0c;该类的作用是用于替代finalize方法&#xff0c;更有效地释放资源并避免内存泄漏。 在JEP260提案中&#xff0c;封装了大部分Sun包内部的API之余&#xff0c;还引入了一些新的API&#xff0c;其中就包含着Cleaner这个工具类。Cleaner承…

JAVA程序打包时报错,但是运行时正常。

报错&#xff1a;Could not transfer artifact com.alibaba:fastjson:pom:1.2.83 from/to clojars... 背景&#xff1a;需要将fastjson从1.2.70升级到1.2.83&#xff1b;并且编译环境是局域网不可以连接互联网&#xff1b;每个项目组都是独立的私有仓库。 操作&#xff1a;在本…

品牌推广的深层逻辑:自我提升与市场认同的和谐共生

品牌推广的深层逻辑&#xff1a;自我提升与市场认同的和谐共生 著名飞行员查尔斯林德伯格(Charles Lindbergh) 曾写道:“改善生活方式比传播生活方式更重要。如果我们自己的生活方式使别人感到满意&#xff0c;那么它将自动蔓延。如果不是这样&#xff0c;那么任何武力都不可能…