返回指定行数文本

场景

  • 在展示长文本内容时,通常会要求默认只展示两行或三行内容,文末用'...'表示
  • 点击查看全文时,才展示全部内容
缩略显示
全文显示

方案策略

  • 获取文本全文
  • 获取DOM容器的宽度
  • 获取DOM容器字体大小
  • (容器宽度 * 展示行数) / 字体大小 = 可展示的字符数
  • 注意:需要对数字等ascii码字符特殊处理

方案代码

/**
 * el: 文本所在的DOM元素
 * text: 文本内容
 * line: 指定返回行数
 * return { lineClamp: 是否进行了剪切, text: 返回的文本 }
 */ 
function lineClamp(el, text, line) {
        if (!el || !text) return { lineClamp: false, text: '' }
        const elCss = window.getComputedStyle(el)
        const elWidth = parseFloat(elCss.getPropertyValue('width'))
                        - parseFloat(elCss.getPropertyValue('padding-left'))
                        - parseFloat(elCss.getPropertyValue('padding-right'))
        const elFontSize = parseFloat(elCss.getPropertyValue('font-size'))
        const wordsLimit = Math.floor((elWidth * line) / elFontSize)

        let breakpoint = -1
        let words = 0
        for (let num = 0, len = text.split('').length; num < len; num += 1) {
          words += text[num].charCodeAt() > 255 ? 1 : 0.5
          breakpoint += text[num].charCodeAt() > 255 ? 1 : 0.9
          if (Math.ceil(words) >= wordsLimit) {
            break
          }
        }

        if (text && text.length >= wordsLimit) {
          return { lineClamp: true, text: `${text.substring(0, breakpoint - 2)}...` }
        }
        return { lineClamp: false, text }
      }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,813评论 1 92
  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,331评论 1 41
  • 简介网络浏览器很可能是使用最广的软件。在这篇入门文章中,我将会介绍它们的幕后工作原理。我们会了解到,从您在地址栏输...
    wengjq阅读 2,079评论 2 15
  • 1,找到自己出生于第几个月亮第几周第几天,对应那一周的句子是什么,对应激活哪个等离子,对应哪个脉轮;出生于哪个Vi...
    RonaLoo阅读 436评论 0 2
  • 你是清晨的薄暮, 是透过破败青瓦的第一缕阳光。 你是唇齿间淡淡的青草味道, 然后你走了。 此去经年。 你是夜晚的“...
    葛蔹SO7阅读 286评论 3 3