文本溢出展示省略号的需求经常都会用到,而对于新式的浏览器,这完全不是问题,因为 css3 里面已经有实现 text-overflow:ellipsis,但是最新 w3c 文档中却移除了这个属性,即使这样,也有不少浏览器实现了这个特性。其浏览器支持情况如下:
1 2 |
IE Firefox Opera Safari Chrome 6+ - 11.0+ 3.0+ 1.0+ |
可以看到,只有 firefox 和 opera11 一下的版本不支持这个浏览器,以此也可以放心大胆的用了。但是遇到要求高的产品经理时(╮(╯_╰)╭),就不得不考虑 firefox 等不支持的浏览器了,唯有使用 js 进行字符截断。
比较简单的截断方式就是按字符个数截断,以一个中文宽度等于两个英文宽度为前提,根据给定字符个数进行截取。但是字符在页面显示的时候,其宽度并不是一定的,会根据不同的字体和字体大小的不同而不同,更何况字母 i 和 A 的宽度是不一样的,存在 bug 且不够精确。
这里使用一种方法,通过给需要截取字符的节点附加一个兄弟节点(使用同样的 class 和 style),通过计算各个字符在这个兄弟节点里面所占的宽度来限制字符个数。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
var ellipsis = function(element){ var limitWidth = element.clientWidth; var ellipsisText = '…'; var temp = element.cloneNode(true); temp.id = 'checkTextLengthNode'; temp.className = 'check-text-length-node'; element.parentNode.appendChild(temp); var realWidth = temp.clientWidth; if(realWidth <= limitWidth){ return; } temp.innerHTML = ellipsisText; var elliWidth = temp.clientWidth; var str = element.innerHTML; str = str.replace(/\s+/g, ' '); var s, totalWidth = 0; for(var i = 0, len = str.length; i < len; i++){ s = str.charAt(i); temp.innerHTML = (s === ' ' ? ' ' : s); totalWidth += temp.clientWidth ; if(totalWidth + elliWidth > limitWidth){ str = str.substr(0, i); break; } } element.innerHTML = str + ellipsisText; temp.parentNode.removeChild(temp); } |
处理字符的时候需要注意的两个个地方就是:
- 在页面中连续的空格是会被当成一个空格处理的,因此要把连续的空格合并成一个;
- 直接给 innerHTML 赋值空格' ',其是不会占宽度的,因此要转换成 html 的空格表示。
通过不断添加新字符并监测添加后的宽度,就可以做到自适应不同的字体和字体大小了。具体例子点击这里查看,这个 demo 对 text-overflow 的支持进行了检测,如果支持 ellipsis,就直接使用 css 的,毕竟 js 计算能省一点是一点。检测 css 属性及其支持情况可以查看这篇文章。
夏雨轩 2016 年 3 月 7 日
看的人少,回一下
徐紫萱 2016 年 1 月 23 日
我是来打酱油的
日高司 2016 年 1 月 16 日
[拳头] 要看空姐制服照私藏美图,就来→ http://sebi.club
千飞蕾 2016 年 1 月 11 日
[挑眉]
murphy 2016 年 1 月 7 日
多行文字省略号如何破?-webkit-line-clamp 貌似兼容性不是很好
excel学习网 2014 年 6 月 7 日
具体例子点击这里查看,看到的是宝贝回家。一定 alloyteam 的 TAT.iAzrael 粗心了,希望能补充上例子,否则 100 分只能得到 40 分,多可惜呀,我相信例子一定会上,谢谢。
tcdona 2012 年 10 月 26 日
例子 404 了呢,非常好的方法,学习
Best Mattress 2011 年 11 月 12 日
Great! thanks for the share!
sheran 2011 年 10 月 28 日
good