标题字数超出范围截断处理方案比较

美好且让人蛋疼的一天开始了…… 生活中处处充满了意外;迈着欢快的步伐突然踩到了狗shit、洗衣服时发现自己不知何时放进口袋的毛爷爷、在女神面前欢快的聊天的时候没憋住放了一个屁等等。有些意外让人惊喜,有些意外也让人“惊喜”。

例如早上起床发现窗口的喜鹊叫个不停,不错呦~喜鹊叫代表会有好事发生啊,洗脸的时候还一直在心里琢磨会不会中“五百万”之类的什么。洗完脸了女朋友打了个电话过来,告诉你她怀孕了……怀……孕了……。正在惊慌失措当中或者无比惊喜当中,突然想起来自己和女朋友在不同的城市已经1年没见过面了……


生无可恋

好吧,这个“绿帽子”的颜色那是相当的鲜艳啊。言归正传吧,在你经历切图写代码之后,一个纯HTML+CSS的页面就出现在了眼前,然后再经过各种版本的浏览器的调试和各种尺寸视口的显示效果调试,开始和后端或者数据库对接。累死累活忙了几天,终于完成了。开始导入数据库测试数据,顺便给自己冲上一杯咖啡,香醇的咖啡缓慢入口的那种丝滑感觉,加上涌上心头一种大功告成之后的喜悦。心中感慨这尼玛就是生活啊~

喝完咖啡低头看了一眼显示器,准备欣赏下自己劳动成果,顺便品味自己的“完美”作品给自己带来的那种装逼感觉,看完之后结果却是一口没咽下去的咖啡全部都喷在了显示器上……

糟糕的css代码

所有被调用的标题都成了这个“德行”……

吐血

心中感觉一百万只“草泥马”奔腾而去~我估计这种情况很多前端工作人员都遇见过,甚至我认识的几个大神中也有人会犯这样的“2B”错误。到此为止,遇见这种情况的人会分成二大“帮派”,第一种是直接把问题丢给后端的兄弟们,让他们来处理。第二种是自己处理,从自己从事的工作角度把问题解决。两种方式都有自己的道理,而且道理逻辑还能自洽,丝毫反驳不了。这里面不讨论两种方式的是非,只摆事实论高下。

第一种方式直接丢后端处理,因为前端的工作只是负责把美工和客户协商之后的显示效果落实到页面上。只要浏览器显示效果和客户认可的美工图中的效果一致,前端的工作基本算是完成。具体每个区域的文字调用情况是由后端兄弟来完成。例如从数据调用多少个字在页面显示。后端的玩意太高上,我不懂~我只能从我了解的知识结构来说明,例如使用的是DEDECMS作为后台程序的话,那么只要输入↓↓↓

/*dedecms控制标题字数*/
[field:title function=’ ( strlen(”@me”)>30 ? cn_substr(”@me”,30).”…” : “@me” ) ‘ /]
 
<!--在列出标题时多了一个判断的过程,先判断标题是否大于30字节,-->
<!--如果大于则只输出30字节的长度,并加上省略号-->
<!--如果小于30字节就直接输出。-->

如果你用的是帝国CMS,那么可以通过下面的代码来解决标题的字数输出↓↓↓

/*帝国CMS控制标题字数*/
<!--?=DoTitleFont($bqr[titlefont],esub($bqr[title],20))?-->
 
<!--输出20字节的标题多余的截断不显示。-->

如果你用的是PHPCMS,那么可以通过下面的代码来解决标题的字数输出↓↓↓

/*phpCMS控制标题字数*/
{strcut($r['title'], 30, ...)}
 
<!--只显示30个字符,如果超出30字符截断并加上省略号。-->

如果你用的是wordpress这种高级货,那么可以通过原生函数在functions.php文件中添加下列函数代码来解决标题的字数输出↓↓↓

/*wordpress控制标题字数*/
function customTitle($limit) {
    $title = get_the_title($post->ID);
    if(strlen($title) > $limit) {
        $title = substr($title, 0, $limit) . '...';
    }
 
    echo $title;
}
 
<!--在需要输出标题的地方写下列函数-->
<!--?php customTitle(30); ?-->
 
<!--如果标题字数小于30个字符,就显示完整标题;-->
<!--如果字数大于30个字符,就截取30个字符,末尾添加自定的符号“...”-->

可以看出都是用函数来截断标题长度,只保留需要的长度。函数这玩意是后端玩的玩具,全是PHP之类的完全看不懂,我们会的那点JS还是关于DOM方面的。从术业有专攻的角度来看,交给后端的兄弟们来解决,完全是个好理由。可是这玩意有个很大缺点。看图说话:

这个网站是用dedecms制作的,为了保持美观应用了函数来截断标题,截断之后源码中显示的字也和页面一致,这些字等于消失了;虽然通过[field:fulltitle/]来使<a>标签的title保持了整的标题字数,但是<a>包裹的字数不完整会对SEO效果很不好。

如果你只是单纯的想把工作退给后端人员,那么你就可以愉快跑去开一局dota来放松下;如果你有点想法想要一些额外的收益,那么你需要付出额外的思考和工作。泰山不让其土故能成其尊……积累是点点滴滴间进行的,质变的结果却像洪水涌来一样震撼。

第二阵营就是自己动手解决,直接在前端把这个问题给解决掉,不给后端的兄弟们增加工作量,既然自己来搞定,就要付出一些精力了,我们先来观察我们这个可怜的列表的样子。

/*倒霉的列表*/
#demo{
    width: 250px;
    list-style-type: none;
}
li{
    border-bottom: 1px dotted #666;
    margin: 5px;
    padding: 2px 3px 7px ;
 
}
li:first-child{
    border-bottom:none;
    text-align: center;
    background-color: #b8b8b8;
    font:bold 18px/1.5 "";
}
倒霉的列表

为了美观的效果,我们的目的是让这些“可恶的”标题都在一行显示,而且不“淘气”的跑出来。那么先排除了word-warpword-break这俩货,因为它们是和折行效果相关联的,折行之后就变成了多行,这和我们的要求“一行”不符,并且这俩货对中文没啥效果,必须pass掉。关于这俩货的用法和区别可以出门右拐查看文章《容易混淆的word-wrap和word-break》

完美主义者加强迫症的要求是“一行显示”和“不溢出”。突然脑子一亮,脑海中蹦出两个CSS的声明white-space:nowrapoverflow: hidden;。来看下两个的作用:

white-space:nowrap;声明的效果是文本不会换行,文本会在在同一行上继续,直到遇到<br>标签为止。

overflow: hidden;声明的效果是内容会被修剪,并且其余内容是不可见的。

我们先来加上white-space:nowrap;看看效果:

/*加了white-space:nowrap的列表*/
#demo{
    width: 250px;
    list-style-type: none;
}
li{
    border-bottom: 1px dotted #666;
    margin: 5px;
    padding: 2px 3px 7px ;
    white-space:nowrap;  /*我在这里*/
 
}
li:first-child{
    border-bottom:none;
    text-align: center;
    background-color: #b8b8b8;
    font:bold 18px/1.5 "";
}

嗯,全部乖乖的跑到了一行,试试看overflow: hidden;能不能控制住文字们,不让它们跑出我们的列表范围。

/*加了white-space:nowrap的列表*/
#demo{
    width: 250px;
    list-style-type: none;
}
li{
    border-bottom: 1px dotted #666;
    margin: 5px;
    padding: 2px 3px 7px ;
    white-space:nowrap;  /*我在这里*/
    overflow: hidden;    /*Hi~我在这里*/
}
li:first-child{
    border-bottom:none;
    text-align: center;
    background-color: #b8b8b8;
    font:bold 18px/1.5 "";
}

HOHO~这群淘气的小家伙们终于被控制住了,不过看边边上的字会被遮住一部分,看上去有点奇怪。怎么办?而且人家后面都有省略号来表示文字未完结只是省略不显示了。挠挠头,跺跺脚,翻翻资料。突然发现text-overflow: ellipsis;这货就在旁边看着我们在得意的笑,就是它了~!

text-overflow: ellipsis;显示省略符号来代表被修剪的文本。

/*加了white-space:nowrap的列表*/
#demo{
    width: 250px;
    list-style-type: none;
}
li{
    border-bottom: 1px dotted #666;
    margin: 5px;
    padding: 2px 3px 7px ;
    white-space:nowrap;  /*我在这里*/
    overflow: hidden;    /*我在这里*/
    text-overflow: ellipsis; /*我在这里*/
}
li:first-child{
    border-bottom:none;
    text-align: center;
    background-color: #b8b8b8;
    font:bold 18px/1.5 "";
}
image.png

Perfect~!来看看源码中是不是也被截断了:

CSS控制截断不会导致源码中文字丢失

GOOD~~!太好了,显示效果是截断并且附带了省略号,源码中还是完整的标题字数。这样搜索引擎的spider也能获取到完整的信息。对SEO那是相当的友好!

需要注意的是单独使用text-overflow: ellipsis;不会有作用,必须通过white-space:nowrap;让文字在一行内显示;同时设置overflow: hidden;让超出部分被裁剪掉,这样设置text-overflow: ellipsis;才会有作用。也就是说要同时设置它们三个才会有作用,因为篇幅出现了大段的代码和demo,容易让人看的眼花头晕,这个我就不再举例说明了。可以自己试验下。

PS:所有主流浏览器都支持这仨货。

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

推荐阅读更多精彩内容

  • 原创文章,转载请注明出处。 背景 在项目需求开发时,由于文本内容长度的不确定性,经常会碰到文本内容超出的问题,通常...
    Yieiy阅读 10,461评论 5 10
  • 文章来源:前端开发者丨 www.rokub.com 最近在做响应式系统设计的时候遇到需要对标题进行多行文字截取的...
    麋鹿_720a阅读 742评论 0 0
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,751评论 1 92
  • 1.CSS3 边框 border-radius CSS属性用来设置边框圆角。当使用一个半径时确定一个圆形;当使用两...
    garble阅读 643评论 0 0
  • 1.块级元素和行内元素 块级(block-level)元素;行内(内联、inline-level)元素。 块元素的...
    饥人谷_小侯阅读 2,002评论 1 4