JS如何判断文字被ellipsis了?

如果想要文本超出宽度后用省略号省略,只需要加上以下的 css 就行了。

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

3 行 css 搞定,但是问题来了:

如果我们想要当文本被省略的时候,也就是当文本超出指定的宽度后,鼠标悬浮在文本上面才展示popper,应该怎么实现呢?

CSS帮我们搞定了省略,但是 JS 并不知道文本什么时候被省略了,所以我们得通过JS来计算。

创建一个block元素来包裹inline元素

这种方法从acro design vue中学到的,应该是最简单的办法。要点就是外层一定是block元素,内层是inline元素

<div class="ellipsis box">
  <span class="content">
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Lorem ipsum dolor sit amet consectetur adipisicing
    elit.
  </span>
</div>


<style>
  .ellipsis {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }


  .box {
    border: 1px solid gray;
    padding: 10px;
  }
</style>

通过上面对css和html做的处理,我们可以实现让box元素里面的文字进行ellipisis,同时由于并没有 对span.content进行任何overflow的处理,所以该 span 的offsetWidth还是保持不变。

const checkEllipsis = () => {
  const { pLeft, pRight } = getPadding(box)
  const horizontalPadding = pLeft + pRight
  if (box.clientWidth <= content.offsetWidth+horizontalPadding ) {
    result.textContent = '存在省略号'
  } else {
    result.textContent = '容器宽度足够,没有省略号了'
  }
}

同样,只要满足外层元素是block,内层元素是inline的话,里面的dom元素其实是随便放的

<div class="ellipsis box">
  <span class="content">
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Lorem ipsum dolor sit amet consectetur adipisicing
    elit.
    <span style="font-size: large;">
      hello world
    </span>
    <span style="letter-spacing: 20px;">
      hello world
    </span>
  </span>
</div>

作者:嘉琪coder
链接:https://juejin.cn/post/7262280335978741797

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较常见的需求,可以使用Vue的slot插槽来实现,代码如下: ```vue <template> <div class="text-container" :class="{ 'is-ellipsis': isEllipsis }" v-tooltip="text" ref="container"> <slot></slot> </div> </template> <script> export default { name: 'EllipsisText', props: { width: { type: [Number, String], default: 200 }, lineClamp: { type: [Number, String], default: 1 } }, data() { return { isEllipsis: false, text: '' } }, mounted() { this.setText() this.checkEllipsis() }, methods: { setText() { const container = this.$refs.container this.text = container.innerText.trim() }, checkEllipsis() { const container = this.$refs.container const containerWidth = container.offsetWidth const fontSize = parseFloat(window.getComputedStyle(container)['font-size']) const lineHeight = parseFloat(window.getComputedStyle(container)['line-height']) const maxLineHeight = lineHeight * this.lineClamp if (containerWidth > this.width || container.offsetHeight > maxLineHeight) { this.isEllipsis = true } } } } </script> <style> .text-container { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .is-ellipsis { cursor: default; } .is-ellipsis:hover { white-space: normal; word-wrap: break-word; line-height: normal; box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); z-index: 9999; position: absolute; background-color: #fff; padding: 6px; border-radius: 3px; border: 1px solid #ccc; } </style> ``` 这个组件叫做`EllipsisText`,使用时可以将需要展示的文本放在组件标签的中间,并设置组件的宽度和行数,例如: ```vue <template> <div> <EllipsisText width="200" line-clamp="2"> 这是一段需要截断的文本,如果超过了指定的宽度或行数就会显示省略号。 </EllipsisText> </div> </template> <script> import EllipsisText from '@/components/EllipsisText' export default { components: { EllipsisText } } </script> ``` 在这个组件中,我们通过计算文本的宽度和高度,以及行高来判断是否需要截断文本,并且通过CSS实现了省略号的显示。如果文本需要展示多行,我们使用了CSS的`white-space`属性和`line-height`属性来实现。同时,我们还使用了`el-tooltip`指令来实现鼠标悬浮时的提示框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值