css 的规律摸索之路(三)文本省略问题

前言

在css的使用中,我们经常性的需要对溢出文本进行处理,在实际的项目中,由于文字内容的长度不确定性和页面布局的固定性,难免会出现文字内容超过div(或其他标签,下同)区域的情况,此时比较好的做法就是当文字超过限定的div宽度后自动以省略号(…)显示,这样,按照习惯,人们都会知道这儿有文字被省略了。

在css中有个属性叫做text-overflow:ellipsis;配合其他一些属性可以实现IE,chrome,safria浏览器下文字溢出点点点省略号显示,在加上opera浏览器的私有属性-o-text-overflow:ellipsis;就目前而言,可以基本实现Firefox浏览器以外的所有主流浏览器的文字溢出点点点省略号显示。

浏览器支持:
浏览器 版本 支持 属性
Internet Explorer 6.0+ text-overflow ellipsis|clip
Firefox (Gecko) 7.0+ text-overflow ellipsis|clip
Opera (Presto) 9.* - 10.* -o-text-overflow ellipsis |clip
11.0+ text-overflow ellipsis | clip
Safari | Chrome | WebKit 1.3|1.0| 312.3 text-overflow ellipsis |clip

通过浏览器支持表我们可以看出,Firefox对 text-overflow 严重落后于其它浏览器,IE从数年前的6.0版本就支持了这个属性,而Firefox在IE6推出之后的漫长岁月里,Firefox经过了4次大版本号升级都没有提供支持,直到Firefox 7.

到目前为止,Firefox之外的浏览器都支持 text-overflow css 了,所以开发者只需要针对Firefox 3.x - 6.x做特别处理。

除Firefox外的单行文本溢出解决:

对于单行文本溢出我们使用一句话,放在你需要解决溢出问题的元素上:

overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow:ellipsis;

这句话可以解决大部分的浏览器单行文本溢出。

针对Firefox老版本,做省略号效果

针对Firefox,做省略号效果,目前主要有3种方案,分别是:

  • css binding xml
  • JavaScript截取(此处不做说明,因为能用css为何要用js)
  • 省略号遮盖。

css binding xml

这是老外提供的一种方法,使用Firefox的私有属性调用一个XML文件:ellipsis.xml,可以使Firefox火狐浏览器下文字溢出后以省略号的形式显示。

ellipsis.xml的内容如下:

<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:description crop="end" xbl:inherits="value=xbl:text">
                 <children/>
            </xul:description>
        </content>
    </binding>
</bindings>

ellipsis.xml另存为到本地你的css文件存放的地方,然后就是调用:

-moz-binding:url(‘ellipsis.xml#ellipsis’);

跟css样式写法一致,再结合上面的css样式,就可以实现所有主流浏览器下的单行文字溢出用省略号表示了。css表示如下:

overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow:ellipsis;
-moz-binding:url('ellipsis.xml#ellipsis');

注意:此XML文件貌似不支持向上路径的访问,也不支持绝对路径的访问。也就是说此XML文件需要放在调用文件(css文件,或HTML文件)的同目录下或下一级目录下,不能向上访问。所以为了麻烦直接存到调用文件的统一级目录就行了

省略号遮盖

这种方式有点老的掉牙,因为自2013年以后所有浏览器都已经支持 text-overflow:ellipsis; 方法

所以这里只是附上代码大家看看得了

<h3>省略号遮盖法</h3>
<div class="text_overflow_margin" >
    <div class="margin_con" >这是一段比较长的文字,用来测试是否文字溢出时会用省略号显示。</div>
    <div class="margin_ellipsis" >…</div>
</div>
<style>
    .text_overflow_margin{
        width: 24em; height: 20px; overflow:hidden; zoom:1; background: #333;
    }
    .text_overflow_margin .margin_con{
        height: 20px; margin-right: 1em; background: #f00;
    }
    .text_overflow_margin .margin_ellipsis{
        width: 1em; height: 20px; float:right; margin-top: -20px;
    }
</style>

多行文本溢出省略号

不兼容的WebKit内核新版属性

有时候我们需要在多行文本后面添加一个省略号,怎么样添加呢?

display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;

说明:

  1. -webkit-line-clamp用来限制在一个块元素显示的文本的行数。 为了实现该效果,它需要组合其他的WebKit属性。
  2. display: -webkit-box; 必须结合的属性 ,将对象作为弹性伸缩盒子模型显示 。
  3. -webkit-box-orient 必须结合的属性 ,设置或检索伸缩盒对象的子元素的排列方式 。

适用范围:因使用了WebKit的CSS扩展属性,该方法适用于WebKit浏览器及移动端;所以其兼容性不太好

<p class="article_synopsis">
  我们时常对城市中的建筑过目即忘,甚至你不会觉得城市与城市之间有什么不同。因为这些钢筋混泥土建筑的空间里,没有与我们内心与之呼应的东西。这些东西是一个民族几千年里凝练下来的一种审美,流淌在我们的血液里。
</p>
<style>
.article_synopsis {
    display: -webkit-box; text-overflow: ellipsis; text-indent: 2em;
    overflow : hidden; -webkit-line-clamp: 5; -webkit-box-orient: vertical;
    height: 90px; width: 170px; font-size: 12px;
 }
</style>

兼容的写法

我们为了兼容考虑可以使用伪类来达到相同的效果

p {
  position: relative;
  line-height: 20px;
  max-height: 40px;
  overflow: hidden;
}
p::after {
  content: "...";
  position: absolute;
  bottom: 0;
  right: 0;
}

完整代码实现:

<p class="synopsis">
  我们时常对城市中的建筑过目即忘,甚至你不会觉得城市与城市之间有什么不同。因为这些钢筋混泥土建筑的空间里,没有与我们内心与之呼应的东西。这些东西是一个民族几千年里凝练下来的一种审美,流淌在我们的血液里。
</p>
<style>
.synopsis{
    position: relative; line-height: 20px; overflow: hidden;
    height: 80px; width: 170px; font-size: 12px;
}
.synopsis::after{
    content: "..."; position: absolute; bottom: 0; right: 0;
    line-height: 20px; background: #fff; width: 14px;
}
</style>

说明:

  1. 设置 line-height 属性,防止超出的文字露出部分。
  2. p::after 添加定位、颜色、行高及宽度可避免文字只显示一半。
  3. 由于ie6-7不显示 content 内容,所以要添加标签兼容ie6-7(如:<span>…<span/>);兼容ie8需要将::after替换成:after。

适用范围:该方法适用范围广,但文字未超出行的情况下也会出现省略号,可结合js优化该方法。

关于JavaScript 方案可以去看看Clamp.jsjQuery插件-jQuery.dotdotdot

小结:

至此我们常用的css溢出变为省略号的方法基本结束了

提示:后面还有精彩敬请期待,请大家关注我的CSDN博文:侬姝沁儿,或者我的简书专题:web前端。如有意见可以进行评论,每一条评论我都会认真对待。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容