「最近遇到一个貌似很简单,但写起来也不简单的问题。对于多行文字,超出...显示。通过css可以实现,但受限于浏览器兼容问题,有时候还需要依赖JS来实现。通过js实现,就需要考虑到文字大小,中英文、数子、标点符号所对应的字节长度不一致,如果考虑的不全面,对于不同的文字内容,总会有点差距。」

  • 首先,我们需要了解,中文汉字,英文字母,数字以及特殊符号所占的字节长度是不一样的,如果需要计算准确,就不能按照字符串的元素个数去截取,把它们换算成字节数来截取,准确度更高。所以,我们需要一个获取字符串字节长度的方法:

        function bitCompute(content) {var total = 0,len = arguments[0].length || 0for (var i = 0; i < len; i++) {if (content[i].charCodeAt() > 255) {total += 2;} else {total += 1;}}return total}
  • 对于要截取多少内容的字节数,我们需要知悉能放入容器内的字节数与总字节数的比例,展示字节数/总字节数 = offsetWidth / scrollWidth:

         function complate() {var offsetWidth = el.offsetWidth;var scrollWidth = el.scrollWidth;var gap = scrollWidth - offsetWidth;var percent = Math.floor(offsetWidth / scrollWidth * 1e3) / 1e3;return {gap: gap,percent: percent}}
  • 根据计算得出的数据,我们就可以操作字符串了

        function cut(content) {el.innerHTML = content;var info = complate(),percent = info.percent;var total = bitCompute(content).total;var showLen = +(total * percent).toFixed(0) - cfg.placeholder;content = bitCompute(content, showLen).content;return content + cfg.padding;}function bitCompute(content, maxLen) {var total = 0,len = arguments[0].length || 0,outContent = '';for (var i = 0; i < len; i++) {if (content[i].charCodeAt() > 255) {total += 2;} else {total += 1;}if (maxLen && total > maxLen) {break;}outContent += content[i];}return {total: total,content: outContent}}
  • 当然文字展示的多少,也是和字体大小相关的,所以我们也需要把字体大小的因素考虑到,而且作为一个工作方法,本身就不应该页面中的元素有关联,所以我们应该在方法中自己创建元素,放入内容,计算offsetWidth和scrollWidth

      function cutFactory(opt) {var cfg = {padding: opt.padding || "...",classList: opt.classList || [],style: opt.style || {},debug: opt.debug};cfg.placeholder = bitCompute(cfg.padding).total;var el = doc.createElement("span");el.className = cfg.classList.join(" ");var customStyles = [];for (var styleKey in cfg.style) {if (cfg.style.hasOwnProperty(styleKey)) {customStyles.push(styleKey + ":" + cfg.style[styleKey]);}}el.style.cssText = "position:absolute;left:0;top:0;background:transparent;color:transparent;height:100%;white-space:nowrap;overflow:visible;border:0;" + (cfg.debug ? "background:white;color:red;" : "") + customStyles.join(";");var div = doc.createElement("div");div.appendChild(el);div.style.cssText = "width:99%;min-height:50px;line-height:50px;position:absolute;left:3px;top:3px;overflow:hidden;outline:0;background:transparent;" + (cfg.debug ? "outline:1px solid red;background:black;" : "");doc.body.appendChild(div);var css = win.getComputedStyle(el);cfg.fontSize = parseFloat(css.fontSize) || 16;return function (content) {el.innerHTML = content;var out = {flag: false,cut: '',all: content,last: content}if (complate().gap > 0) {out.flag = true,out.last = out.cut = cut(content)}return out}}
  • 最后,再暴露一个方法,方便使用者调用。为了性能考虑,不创建过多dom元素,我们可以缓存一下字体大小和容器宽度相同的截取方法

    function subStringEL(name, fontSize, width) {this.subStringELFns || (this.subStringELFns = {});var key = 'key_' + fontSize + '_' + width;var fn = this.subStringELFns[key];if (!fn) {fn = this.subStringELFns[key] = cutFactory({style: {'font-size': fontSize,'width': width}})}return fn(name);}

这样就完美的解决了多行超出...显示的问题了,兼容性很好,而且也能准确截取,灵活方便。希望能帮助到受该问题困扰的同仁,内容中如有不正确之处,烦请指正,不胜感激!

多行内容超出...显示的终极解决方案相关推荐

  1. html中内容超出显示省略号的方法

    html中内容超出显示省略号的方法 本博客主要介绍 前端开发中文本过多,以省略号显示. 效果如图:                 单行: <!--单行--> <p class=&q ...

  2. Vue文本内容超出显示省略号,超出显示tooltip提示

    项目中固定宽度的容器文本超出显示省略号,超出部分显示tooltip场景很常见,所以自己就着手写了一个过滤器用于判断文本是否超出. 代码中有用到Element-UI的组件,还有会提示在Table组件中和 ...

  3. Vue文本内容超出显示省略号,超出显示tooltip提示2.0

    项目中固定宽度的容器文本超出显示省略号,超出部分显示tooltip场景很常见,所以自己就着手写了一个过滤器用于判断文本是否超出. 我用两种方式满足了需求,这是其中一种,想看另一种可以查看Vue文本内容 ...

  4. 多行文字超出显示省略号

    多行文字超出显示省略号... display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; //设置为超出三行后 ...

  5. html p自动换行超出省略,CSS自动换行、强制不换行、强制断行、超出显示省略号...

    CSS自动换行.强制不换行.强制断行.超出显示省略号 CSS自动换行.强制不换行.强制断行.超出显示省略号 CSS样式设置自动换行.强制不换行.强制断行.超出显示省略号 P标签是默认是自动换行的,因此 ...

  6. CSS自动换行、强制不换行、强制断行、超出显示省略号

    CSS样式设置自动换行.强制不换行.强制断行.超出显示省略号 P标签是默认是自动换行的,因此设置好宽度之后,能够较好的实现效果,如下所示,当设置div宽度为固定值时,p中内容能够自动换行: 但是最近的 ...

  7. Windows下命令行Git无法显示中文问题解决方案

    Windows下命令行Git无法显示中文问题解决方案 参考文章: (1)Windows下命令行Git无法显示中文问题解决方案 (2)https://www.cnblogs.com/burningcar ...

  8. 小程序swiper-item内容过多显示不全的解决方案

    小程序swiper-item内容过多显示不全的解决方案 参考文章: (1)小程序swiper-item内容过多显示不全的解决方案 (2)https://www.cnblogs.com/bin521/p ...

  9. Vue完成数据请求后内容超出显示省略号+显示查看全文按钮

    需求: 如下图,当Vue完成数据请求后,根据文章内容设置显示方式.10行以内的显示全文,不显示[查看全文]按钮:内容超过指定行数时,超出内容隐藏,末尾显示省略号并显示[查看全文]按钮. 实现 思路 在 ...

最新文章

  1. spring中resource设计与实现
  2. python自建包的根目录可以直接import的方法
  3. go gin框架:StaticFS搭建文件服务器(可以加载文件夹及文件)
  4. 韩顺平php教程笔记,PHP笔记,韩顺平php笔记_PHP教程
  5. 工作的习惯,看到好收藏下
  6. Python Map, Filter and Reduce
  7. jmeter-如何进行参数化-循环读取参数
  8. 字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 你能帮帮小Q吗? 输入描述: 输入数据有多组
  9. 多库多表场景下使用 Amazon EMR CDC 实时入湖最佳实践
  10. SunOne中的domian常用命令
  11. EXCEL 边框 去不掉的解决方法
  12. 免费通信时代何时真正到来?
  13. LeetCode_Stack_331. Verify Preorder Serialization of a Binary Tree 验证二叉树的前序序列化(Java)【栈,字符串处理】
  14. 【PMP考前冲刺题-第一小节(2022.7)】
  15. 企业流程管理实践的创新方法——沙盘演练
  16. 手机闹钟软件测试用例,手机软件测试用例+规范
  17. DirectX 修复工具增强版
  18. 斐波那契(Fibonacci,意大利数学家,1170年-1240年)数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……。这个数列从第三项开始,每一项都等于前两项之
  19. javascript 的bind
  20. 创龙AM5728 DSP+ARM开发板TL5728-IDK测试

热门文章

  1. 圆桌派|Polkadot: Web3.0代码革命
  2. 用Turtle画银杏树
  3. U盘和硬盘实际容量与标称容量
  4. CUDA和NVIDIA-Driver安装问题
  5. oracle 删除表空间错误 提示:ORA-02429
  6. 解决android WebView无法唤起其他app
  7. pinpoint配置mysql_pinpoint 安装部署
  8. 我的出版书籍之《系统架构设计:程序员向架构师转型之路》
  9. Webform 常用控件
  10. 无盘服务器费用,无盘系统真的省钱吗?