文字超出时tooltip才显示

对于字数过长,我们可能使用超出省略,移上去tooltip显示全部文本这种视觉交互,例如以下效果
在这里插入图片描述
实现代码如下

<template>
  <div>
    <div v-for="(item, index) in list" :key="index">
      <el-tooltip class="item" effect="dark" :content="item" placement="right-start">
        <div class="text">{{item}}</div>
      </el-tooltip>
    </div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      list: [
        'JS遍历(循环)——JS对象遍历(循环)&JS数组遍历(循环)',
        'Taro微信小程序发布新版本时自动提示用户重启更新版本',
        'js数据结构与算法',
        '栈的封装和应用(十进制转化为二进制)'
      ]
    }
  }
}
</script>

<style scoped>
.text{
  width: 300px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow:ellipsis;
}
</style>

但这样也就导致了及时文字放得下也会有tooltip出现,也在body下面多创建了很多tooltip元素,浪费了性能;下面是优化的方法:

该方法是借鉴element源码(在使用el-table的时候在文档看到有个api支持这种),所以就去翻了一下element-ui的源码
在这里插入图片描述
在这里插入图片描述
抽取里面判断文字所占像素宽度是否超出dom元素像素宽度的逻辑,写了一个工具类函数

// el dom元素
function textRange (el) {
  const textContent = el
  const targetW = textContent.getBoundingClientRect().width
  const range = document.createRange()
  range.setStart(textContent, 0)
  range.setEnd(textContent, textContent.childNodes.length)
  const rangeWidth = range.getBoundingClientRect().width
  return rangeWidth > targetW
}

对以上交互进行改进

<template>
  <div>
    <div v-for="(item, index) in list" :key="index">
      <div @mouseenter="(e) => isShowToltip(e, index)" @mouseout="hideTip(index)" v-if="!item.isShow" class="text">{{item.text}}</div>
      <el-tooltip v-if="item.isShow" class="item" effect="dark" :content="item.text" placement="right-start">
        <div class="text">{{item.text}}</div>
      </el-tooltip>
    </div>
  </div>
</template>

<script>
import {textRange} from '../utils'
export default {
  name: 'HelloWorld',
  data () {
    return {
      list: [
        {text: 'JS遍历(循环)——JS对象遍历(循环)&JS数组遍历(循环)', isShow: false},
        {text: 'Taro微信小程序发布新版本时自动提示用户重启更新版本', isShow: false},
        {text: 'js数据结构与算法', isShow: false},
        {text: '栈的封装和应用(十进制转化为二进制)', isShow: false}
      ]
    }
  },
  methods: {
    isShowToltip (e, index) {
      const bool = textRange(e.target)
      this.list[index].isShow = bool
    },
    hideTip (index) {
      this.list[index].isShow = false
    }
  }
}
</script>

<style scoped>
.text{
  width: 300px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow:ellipsis;
}
</style>

在这里插入图片描述
在这里插入图片描述

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
可以使用 `el-tooltip` 组件来实现文字超出两行显示,并在鼠标悬停使用 Tooltip 显示完整内容的效果。具体实现步骤如下: 1. 在需要显示的文本外面包裹一个容器元素,并设置容器的宽度和高度,以及 `overflow: hidden` 属性来隐藏超出部分。 2. 使用 `el-tooltip` 组件来包裹超出部分的文本,并设置 `content` 属性为完整内容。 3. 在 `el-tooltip` 组件内部使用 `span` 标签来显示省略号。 4. 在 `el-tooltip` 组件上使用 `effect` 属性来设置 Tooltip 显示的效果,例如 `light` 表示浅色、`dark` 表示深色。 5. 在 `el-tooltip` 组件上使用 `placement` 属性来设置 Tooltip 显示的位置,例如 `top` 表示上方、`bottom` 表示下方。 示例代码如下: ```html <template> <div class="example"> <el-tooltip :content="fullText" effect="light" placement="top"> <span>{{ displayText }}</span> </el-tooltip> </div> </template> <script> export default { data() { return { text: '这是一段超出两行的文字,用省略号显示', }; }, computed: { displayText() { return this.text.slice(0, 15) + '...'; }, fullText() { return this.text; }, }, }; </script> <style> .example { width: 200px; height: 40px; overflow: hidden; border: 1px solid #ccc; padding: 5px; } </style> ``` 在上面的示例代码中,`<el-tooltip>` 组件的 `content` 属性绑定了完整的文本内容,`<span>` 标签内部显示了省略号,`<div>` 容器设置了宽度和高度,并使用了 `overflow: hidden` 属性来隐藏超出部分。在 `computed` 中,`displayText` 计算属性返回了用省略号显示的部分内容,`fullText` 计算属性返回了完整的文本内容。在 `el-tooltip` 组件上,使用了 `effect` 属性来设置 Tooltip 显示的效果,使用了 `placement` 属性来设置 Tooltip 显示的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带风的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值