`
mbn
  • 浏览: 23472 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

溢出文本显示省略号,关于text-overflow:ellipsis的那些事(转)

阅读更多
原帖:http://leeiio.me/text-overflow-ellipsis/Default.aspx?__tencentip=172.30.25.149&__tencentid=1&__tencentrawurl=http://leeiio.me/text-overflow-ellipsis/



这个标题其实已经是一个老生常谈的问题了。很多时候,比如网站最基本的文章列表,标题会很长,而显示列表的区域宽度却没有这么宽,这时候最正常的做法就是让超出宽度的部分文字用省略号(…)来表示。通常做法是网站后台程序截取一定的字符然后输出到前台显示或者前台用javascript截取一定的字符,但是通过控制字数来截取的话还是存在一个大问题的,因为中文和英文的字符宽度问题,这个字数不好控制,而且通用性较差。那么有没有更好的方法呢,比如直接用CSS来解决的,当然是有的。

text-overflow是一个比较特殊的属性,W3C早前的文档中(目前的文档中没有包含text-overflow属性,FML!)对其的定义是:

Name: text-overflow-mode
Value: clip | ellipsis | ellipsis-word

clip :  不显示省略标记(…),而是简单的裁切
ellipsis :  当对象内文本溢出时显示省略标记(…),省略标记插入的位置是最后一个字符。
ellipsis-word :  当对象内文本溢出时显示省略标记(…),省略标记插入的位置是最后一个词(word)。

至于为什么一开始我说text-overflow是一个比较特殊的样式呢?因为我们可以用它代替我们通常所用的标题截取函数,而且这样做对搜索引擎更加友好,如:标题文件有50个汉字,而我们的列表可能只有300px的宽度。如果用标题截取函数,则标题不是完整的,如果我们用CSS样式text-overflow:ellipsis,输出的标题是完整的,只是受容器大小的局限不显示出来罢了(表现上是超出部分显示省略标记…)。

text-overflow: ellipsis属性仅是注解,当文本溢出时是否显示省略标记。并不具备其它的样式属性定义。我们想要实现溢出时产生省略号的效果。还必须定义:强制文本在一行内显示(white-space:nowrap)及溢出内容为隐藏(overflow:hidden)。只有这样才能实现溢出文本显示省略号的效果。Via.

那么,如果我们要给p标签定义text-overflow:ellipsis就可以这么写:

p {
      white-space: nowrap;
      width: 100%;                  /* IE6 需要定义宽度 */
      overflow: hidden;             
 
      -o-text-overflow: ellipsis;    /* Opera */
      text-overflow:    ellipsis;    /* IE, Safari (WebKit) */
   }


使用样式前:

我是一段测试文字,请分别用IE,Safari,chrome,opera浏览器查看我哦!
使用样式后:

我是一段加长过的测试文字,请分别用IE,Safari,chrome,opera浏览器查看我哦!哈哈哈,看到省略号了么?
浏览器兼容状况

Browser Lowest Version Support of
Internet Explorer 6.0 text-overflow
Firefox (Gecko) — —
Opera 9.0 -o-text-overflow
Safari (WebKit) 1.3 (312.3) text-overflow

OH,FML!Firefox不支持这个属性!这回,Firefox你也太另类了吧!还有别的办法么,当然有,方法还挺多的。
比如Mozilla developer center推荐的-moz-binding CSS属性。Mozilla developer center给出的理由是text-overflow没有W3C的规范…但是因为Firefox支持XUL,一种XML的用户界面语言。并且Firefox还支持XBL,一种XML绑定语言,这样我们就可以使用Mozilla developer center推荐的-moz-binding CSS属性来绑定XUL里的ellipsis属性了。

1.XUL方式首先,我们创建XUL,它应该被保存为ellipsis.xml:

<?xml version="1.0"?>  
<bindings   
  xmlns="http://www.mozilla.org/xbl"  
  xmlns:xbl="http://www.mozilla.org/xbl"  
  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"  
>  
    <binding id="ellipsis">  
        <content>  
            <xul:window>  
                <xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>  
            </xul:window>  
        </content>  
    </binding>  
</bindings>


然后我们需要把这个xml文件放到一个目录,原来的css需要加一条,变成这样

p {
      white-space: nowrap;
      width: 100%;                  /* IE6 需要定义宽度 */
      overflow: hidden;             
 
      -o-text-overflow: ellipsis;    /* Opera */
      text-overflow:    ellipsis;    /* IE, Safari (WebKit) */
      -moz-binding: url('ellipsis.xml#ellipsis');    /* Firefox */
   }

虽然Firefox通过XUL的方式实现了ellipsis,但是还是需要注意以下这些问题:
1.经过XUL处理过的文本你将不能被选中,按理说-moz-user-select: text; 属性将允许文本被选中,但是我没有试验成功。
2.如果你给父元素绑定了XUL,那么子元素的内容将变得不可见。例如:

It is a longhaha long long long long text!
如果你只是给p节点绑定了XUL,那么在Firefox下你将看不到haha这个内容。
它的源代码实际上是:

<p>It is a long<em> haha</em> long long long long text!</p>
参考资料:

http://www.w3.org/TR/2003/CR-css3-text-20030514/

http://www.quirksmode.org/css/contents.html

https://bugzilla.mozilla.org/show_bug.cgi?id=312156

https://developer.mozilla.org/En/XUL

https://developer.mozilla.org/En/XUL/Description

http://www.rikkertkoppes.com/thoughts/2008/6/

http://www.w3.org/TR/xbl/

http://www.w3.org/TR/css3-text/

2.Javascript方式既然XUL无法完美解决Firefox下文字溢出显示…,那么我们就求助javascript吧,当然,并不是古老的截取一定数目的字符来实现。
这里以jQuery为例,代码如下:

(function($) {
	$.fn.ellipsis = function(enableUpdating){
		var s = document.documentElement.style;
		if (!('textOverflow' in s || 'OTextOverflow' in s)) {
			return this.each(function(){
				var el = $(this);
				if(el.css("overflow") == "hidden"){
					var originalText = el.html();
					var w = el.width();
 
					var t = $(this.cloneNode(true)).hide().css({
                        'position': 'absolute',
                        'width': 'auto',
                        'overflow': 'visible',
                        'max-width': 'inherit'
                    });
					el.after(t);
 
					var text = originalText;
					while(text.length > 0 && t.width() > el.width()){
						text = text.substr(0, text.length - 1);
						t.html(text + "...");
					}
					el.html(t.html());
 
					t.remove();
 
					if(enableUpdating == true){
						var oldW = el.width();
						setInterval(function(){
							if(el.width() != oldW){
								oldW = el.width();
								el.html(originalText);
								el.ellipsis();
							}
						}, 200);
					}
				}
			});
		} else return this;
	};
})(jQuery);

这段js的原理很简单,就是通过不断的比较宽度值,然后逐个缩短字符宽度,当最后宽度合适的时候,停止循环,就实现了文字溢出显示…的效果。
这段js还需要一段css来配合。

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


js里有个判断就是当样式里出现text-overflow或者-o-text-overflow的时候,便不会执行这段js。因为支持这两个属性的浏览器可以自己实现ellipsis效果。

这两种方法都可以实现Firefox下ellipsis的效果,如何取舍使用,具体还得根据你要运用到的项目的具体情况来具体分析,XUL实现的方法的不足之处在以上已经很详尽地列举了,如果你可以避免或者说这些无关你项目的大问题,那么XUL不失一个好方法。

至于其他的一些方法你可能在网上也有看到,比如用:after伪类来实现等,个人不推荐,所以我这里也不细说了,如果你有更好的方法,也希望能与我分享,谢谢观看!

作者:Leeiio
原文链接:溢出文本显示省略号,关于text-overflow:ellipsis的那些事

分享到:
评论

相关推荐

    无js实现text-overflow: ellipsis; 完美支持Firefox

    在前端开发中,文本溢出处理是一个常见的需求,特别是当我们在设计网页时,希望限制某段文字的显示长度,超出部分用省略号(...)表示。`text-overflow: ellipsis;` 是 CSS3 提供的一个样式属性,用于处理溢出的文本...

    使用text-overflow:ellipsis实现文字超出用省略号显示

    当设置为 `ellipsis` 时,溢出的文本将以省略号的形式显示。 结合上述三个属性,基本的CSS样式可以写为: ```css .element { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } ``` 需要...

    使用text-overflow:ellipsis实现溢出文本省略号显示无需js

    今天在做jsp页面展示的时候碰到一个实现溢出文本显示省略号的需求 原本使用js截取字符串然后判断字符串长度实现,不过相对比较繁琐,并且字符串长度不能自适应 听说用css的 text-overflow: ellipsis 也可以实现,...

    FF下文本溢出的text-overflow完美解决方方案

    `text-overflow`属性是CSS中用于处理文本溢出的一种解决方案,它允许我们控制超出元素边界时的文本显示方式。本文将详细介绍在Firefox下如何完美解决文本溢出的问题,并提供相关的解决方案。 首先,我们需要理解`...

    IE8/9 使用text-overflow: ellipsis 做块元素超长内容变省略号的问题

    虽然标准的CSS属性支持需要包括overflow, white-space和text-overflow三个属性的结合使用,但在IE8中实现单行文本溢出显示省略号的功能,还需要遵循一些特定的规则。 在CSS中实现文本溢出隐藏并显示省略号效果的...

    CSS实现单行、多行文本溢出显示省略号的实现方法.docx

    总结来说,CSS实现单行或多行文本溢出显示省略号的方法主要包括使用`white-space: nowrap`, `overflow: hidden`, 和 `text-overflow: ellipsis`组合,以及利用Webkit的`-webkit-line-clamp`属性和CSS渐变背景技术。...

    CSS文本超出2行就隐藏并且显示省略号

    //溢出用省略号显示 white-space:nowrap; //溢出不换行 但是第三条属性,只能显示一行,不能用在这里,那么如果显示多行呢? 超出两行隐藏: css3解决了这个问题,解决方法如下: display:-webkit-box; //将对象作为...

    无hack无js全兼容text-overflow-ellipsis效果

    标题中的"无hack无js全兼容text-overflow-ellipsis效果"指的是在网页设计中实现文本溢出时显示省略号的效果,而且这个方法无需使用JavaScript(js)或任何黑客(hack)技巧,并且能够兼容各种浏览器。`text-overflow: ...

    用css截取字符的几种方法详解(css排版隐藏溢出文本).docx

    `使得在文本末尾显示一个省略号,表示还有未显示的文本。这种方法适用于单行文本,如果有多行文本,`text-overflow: ellipsis;`不会生效。 2. **使用`white-space: nowrap`** 如果你希望文本在同一行内显示,直到...

    CSS控制文本的长度 超过一行显示省略号的实现方法

    text-overflow属性仅是注解,当文本溢出时是否显示省略标记。并不具备其它的样式属性定义。我们想要实现溢出时产生省略号的效果。还必须定义:强制文本在一行内显示(white-space:nowrap)及溢出内容为隐藏

    CSS第五天.xmind

    将超出的文本使用省略号代替text-overflow: ellipsis; 块级格式化上下文(BFC): 1.创建BFC ①html根元素 ②设置浮动 ③设置定位 ④设置display ⑤设置overflow ⑥弹性布局 flex 2.利用BFC解决问题 ①...

    CSS省略号text-overflow超出溢出显示省略号

    标题和描述中提到的“CSS省略号text-overflow超出溢出显示省略号”是指在CSS样式中利用`text-overflow: ellipsis;`来实现当文本内容超出指定容器的宽度时,用省略号表示被截断的文本。 `text-overflow`属性有以下几...

    无hack无js实现省略号效果

    然后,设置`overflow: hidden`以隐藏超出容器边界的文本,`white-space: nowrap`防止文本换行,最后应用`text-overflow: ellipsis`来添加省略号。 例如: ```css .container { width: 200px; /* 设置固定宽度 */ ...

    纯css控制超出部分省略号显示

    本文将详细介绍如何仅使用CSS来实现文本超出部分用省略号(...)显示的效果。 #### CSS实现原理 1. **`display:block;`**:此属性用于设置元素为块级元素。在本例中,将容器设置为块级元素,以便更好地控制其布局...

    HTML超出文本显示省略号...通过text-overflow实现

    HTML中的“超出文本显示省略号”功能正是为此而设计的,它可以通过CSS的`text-overflow`属性来实现。`text-overflow`是一个非常实用的样式规则,它可以控制当元素内的文本溢出其边界时如何处理。在标题和描述中提到...

    CSS控制html文本溢出

    CSS提供了多种方法来实现这一目标,其中一种常用的技术是通过`text-overflow`、`overflow`以及`white-space`等属性的组合来实现文本溢出时的截断与省略号显示效果。 #### 二、关键概念与属性介绍 ##### 1. `text-...

    前端大厂最新面试题-single_multi_line.docx

    在日常开发中,如果一段文本的数量过长,受制于元素宽度的因素,有可能不能完全显示,为提高用户的使用体验,我们需要把溢出的文本显示成省略号。实现单行/多行文本溢出省略样式是前端开发中的一项重要技术。 单行...

    移动端的text-overflow多行文本溢出显示省略号(…)

    在移动端,`text-overflow: ellipsis` 属性常用于单行文本溢出时显示省略号,但其本身并不支持多行文本的处理。本文将探讨如何在不同场景下实现多行文本溢出显示省略号的效果。 首先,对于基于WebKit的浏览器(如...

Global site tag (gtag.js) - Google Analytics