当前位置:   article > 正文

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

超长省略

 第一种,纯css

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

  1. <template>
  2. <div class="content">
  3. <div class="text">{{ text }}</div>
  4. </div>
  5. </template>
  6. <script setup>
  7. import { ref } from 'vue';
  8. const text = ref('这是一个内容特别长的div你知道吗不知道算了')
  9. </script>
  10. <style scoped>
  11. .content {
  12. width: 800px;
  13. margin: 50px auto;
  14. }
  15. .text {
  16. width: 200px;
  17. overflow-x: hidden;
  18. white-space: nowrap;
  19. text-overflow: ellipsis;
  20. cursor: pointer;
  21. }
  22. </style>

 

第二种 ,使用el-tooltip

普通使用

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

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

没关系,我们一步一步来

  1. <template>
  2. <div class="content">
  3. <el-tooltip v-if="text.length > 13" :content="text">
  4. <div class="text">{{ text }}</div>
  5. </el-tooltip>
  6. <div v-else class="text">{{ text }}</div>
  7. </div>
  8. </template>
  9. <script setup>
  10. import { ref } from 'vue';
  11. const text = ref('这是一个内容特别长的div你知道吗不知道算了')
  12. </script>
  13. <style scoped>
  14. .content {
  15. width: 800px;
  16. margin: 50px auto;
  17. }
  18. .text {
  19. width: 200px;
  20. overflow-x: hidden;
  21. white-space: nowrap;
  22. text-overflow: ellipsis;
  23. cursor: pointer;
  24. }
  25. </style>

普通使用-进阶版

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

效果同上

  1. <template>
  2. <div class="content">
  3. <el-tooltip v-if="isOverflow" :content="text">
  4. <div class="text">{{ text }}</div>
  5. </el-tooltip>
  6. <div v-else class="text">{{ text }}</div>
  7. </div>
  8. </template>
  9. <script setup>
  10. import { ref, onMounted, nextTick } from 'vue';
  11. const text = ref('这是一个内容特别长的div你知道吗不知道算了')
  12. const isOverflow = ref(false);
  13. onMounted(() => {
  14. nextTick(() => {
  15. const element = document.querySelector(`.content .text`);
  16. isOverflow.value = element.scrollWidth > element.clientWidth;
  17. })
  18. })
  19. </script>
  20. <style scoped>
  21. .content {
  22. width: 800px;
  23. margin: 50px auto;
  24. }
  25. .text {
  26. width: 200px;
  27. overflow-x: hidden;
  28. white-space: nowrap;
  29. text-overflow: ellipsis;
  30. cursor: pointer;
  31. }
  32. </style>

特殊使用

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

  1. <template>
  2. <div class="content">
  3. <div v-for="(item, index) in items" :key="index" class="text-box">
  4. <el-tooltip v-if="isOverflowing[index]" :content="item" placement="top">
  5. <div class="text-content">{{ item }}</div>
  6. </el-tooltip>
  7. <div v-else class="text-content">{{ item }}</div>
  8. </div>
  9. </div>
  10. </template>
  11. <script setup>
  12. import { ref, onMounted, nextTick } from 'vue';
  13. const items = ['这是一个内容特别长的div你知道吗不知道算了', '它不长'];
  14. const isOverflowing = ref([]);
  15. const checkOverflow = () => {
  16. isOverflowing.value = items.map((_, index) => {
  17. const element = document.querySelector(`.text-box:nth-child(${index + 1}) .text-content`);
  18. return element.scrollWidth > element.clientWidth;
  19. });
  20. };
  21. onMounted(() => {
  22. nextTick(() => {
  23. checkOverflow();
  24. });
  25. });
  26. </script>
  27. <style scoped>
  28. .content {
  29. width: 800px;
  30. margin: 100px auto;
  31. }
  32. .text-content {
  33. width: 200px;
  34. overflow-x: hidden;
  35. white-space: nowrap;
  36. text-overflow: ellipsis;
  37. cursor: pointer;
  38. margin-bottom: 10px;
  39. }
  40. </style>

 

特殊使用-进阶版

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

  1. <template>
  2. <div class="content">
  3. <div v-for="(item, index) in userList" :key="index" class="user-item">
  4. <div class="dept-box">
  5. <div class="dept-name">
  6. <div class="blue-circle"></div>
  7. <el-tooltip v-if="isOverflowing[index]" effect="dark" :content="item.departmentName" placement="top">
  8. <div class="name">{{ item.departmentName }}</div>
  9. </el-tooltip>
  10. <div v-else class="name">{{ item.departmentName }}</div>
  11. </div>
  12. </div>
  13. <div class="user-box">
  14. <div v-for="(userItem, userIndex) in item.user" :key="userIndex" ref="textRefs" class="user"
  15. :data-index="`${index}-${userIndex}`">
  16. <div class="green-circle"></div>
  17. <el-tooltip v-if="item.isOverflowing && item.isOverflowing[userIndex]" effect="dark"
  18. :content="userItem.userName" placement="top">
  19. <div class="username">{{ userItem.userName }}</div>
  20. </el-tooltip>
  21. <div v-else class="username">{{ userItem.userName }}</div>
  22. </div>
  23. </div>
  24. </div>
  25. </div>
  26. </template>
  27. <script setup>
  28. import { ref, onMounted, nextTick } from 'vue';
  29. const userList = ref([
  30. {
  31. departmentName: '部门1',
  32. user: [{ userName: '超长用户名测试测试测试测试测试测试测试测试测试测试' }, { userName: '正常用户名' }],
  33. isOverflowing: []
  34. },
  35. {
  36. departmentName: '这是一个名称特别长的部门你知道吗不知道算了害',
  37. user: [{ userName: '正常用户名' }, { userName: '超长用户名测试测试测试测试测试测试测试测试测试测试' }],
  38. isOverflowing: []
  39. }
  40. ]);
  41. const isOverflowing = ref([]);
  42. const textRefs = ref([]);
  43. const checkOverflow = () => {
  44. nextTick(() => {
  45. //处理部门名超长
  46. isOverflowing.value = userList.value.map((_, index) => {
  47. const element = document.querySelector(`.user-item:nth-child(${index + 1}) .dept-box .dept-name .name`);
  48. return element.scrollWidth > element.clientWidth;
  49. });
  50. //处理人员名超长
  51. userList.value.forEach((item, index) => {
  52. item.isOverflowing = item.user.map((_, userIndex) => {
  53. const userElement = textRefs.value.find(ref => ref && ref.dataset && ref.dataset.index === `${index}-${userIndex}`);
  54. if (userElement) {
  55. const usernameElement = userElement.querySelector('.username');
  56. if (usernameElement) {
  57. return usernameElement.scrollWidth > usernameElement.clientWidth;
  58. }
  59. }
  60. return false;
  61. });
  62. });
  63. });
  64. };
  65. onMounted(() => {
  66. checkOverflow();
  67. });
  68. </script>
  69. <style scoped lang="less">
  70. .content {
  71. width: 800px;
  72. margin: 100px auto;
  73. .user-item {
  74. .dept-box {
  75. height: 46px;
  76. display: flex;
  77. justify-content: space-between;
  78. align-items: center;
  79. margin-top: 8px;
  80. cursor: pointer;
  81. .dept-name {
  82. font-weight: bold;
  83. display: flex;
  84. align-items: center;
  85. background: #ffffff;
  86. color: #395CD0;
  87. .blue-circle {
  88. width: 6px;
  89. height: 6px;
  90. border-radius: 6px;
  91. margin-right: 16px;
  92. background: #395CD0;
  93. margin-left: 17px;
  94. }
  95. .name {
  96. width: 137px;
  97. overflow-x: hidden;
  98. white-space: nowrap;
  99. text-overflow: ellipsis;
  100. }
  101. }
  102. }
  103. .user-box {
  104. .user {
  105. height: 22px;
  106. display: flex;
  107. align-items: center;
  108. margin-top: 16px;
  109. font-size: 14px;
  110. color: #333333;
  111. cursor: pointer;
  112. .green-circle {
  113. width: 6px;
  114. height: 6px;
  115. border-radius: 6px;
  116. background: #7AC953;
  117. margin-right: 12px;
  118. margin-left: 44px;
  119. }
  120. .username {
  121. width: 7.5vw;
  122. font-size: 14px;
  123. color: #333333;
  124. overflow-x: hidden;
  125. white-space: nowrap;
  126. text-overflow: ellipsis;
  127. }
  128. }
  129. }
  130. }
  131. }
  132. </style>

 

 

总结

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/799686
推荐阅读
相关标签
  

闽ICP备14008679号