资讯专栏INFORMATION COLUMN

CSS - 纯css实现多行文本溢出省略(兼容所有浏览器)

李义 / 3474人阅读

摘要:前言多行文本超出高度限制出现省略号移动端多为内核的有扩展属性但并不是规范中的属性端往往要借助去实现这一效果,但麻烦且不是很靠谱,今天就用纯来实现一个完全兼容的多行省略。

前言

多行文本超出高度限制出现省略号 , 移动端多为webkit内核的 , 有扩展属性-webkit-line-clamp , 但并不是CSS规范中的属性 , PC端往往要借助js去实现这一效果,但麻烦且不是很靠谱,今天就用纯CSS来实现一个完全兼容的多行省略。

正文 一、webkit内核的实现

-webkit-line-clamp设置块元素包含的文本行数;
display: -webkit-box设置块元素的布局为伸缩布局;
-webkit-box-orient设置伸缩项的布局方向;
text-overflow: ellipsis;则表示超出盒子的部分使用省略号表示。

二、非webkit内核实现

</>复制代码

  1. 不过本文将要介绍的方法是采用CSS规范中的属性,并结合特殊的实现技巧完成的。这意味着在实现CSS2.1规范的浏览器中都是可以兼容的,不将仅仅是纯粹的移动端领域,在传统的PC浏览器(你们懂得我指的是哪些浏览器)中仍是可行的。好吧,让我们一起见识下。

一共7个步骤,最简单的就是截断文本,最难的部分则是让一个元素出在其父块的溢出时的右下方,并且当父元素未溢出时该元素消失不可见。(代码可直接粘贴看效果

1、基本结构布局

最简单的开始:当父包含框比较小时,将子元素布局到父包含框的右下角;
HTML

</>复制代码

  1. 1.prop
  2. 2.main 这里是主题内容,多行省略
  3. 3.end

CSS

</>复制代码

  1. .wrap {
  2. width: 400px;
  3. height: 50px;
  4. margin: 20px 20px 50px 300px;
  5. border: 5px solid #AAA;
  6. line-height: 25px;
  7. }
  8. .prop {
  9. float: left;
  10. width: 50px;
  11. height: 50px;
  12. background: #FAF;
  13. }
  14. .main {
  15. float: right;
  16. width: 350px;
  17. background: #AFF;
  18. word-break: break-all;
  19. }
  20. .end {
  21. position: relative;
  22. float: right;
  23. width: 50px;
  24. background: #FFA;
  25. }

效果如下面几张图(注意黄色end的位置), 其实这个实现完全利用了元素浮动的基本规则。

2、定位模拟"..."

我们通过创建一个子元素来替代将要显示的省略号,当本文溢出的情形下该元素显示在正确的位置上。在接下来的实现中,我们创建一个realend元素,利用上一步骤中end元素浮动后的位置来实现realEnd元素的定位。
HTML

</>复制代码

  1. 1.prop
  2. 2.main 这里是要多行文本溢出省略的,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点
  3. 3.end
  4. realEnd

CSS

</>复制代码

  1. // 新增下面样式即可
  2. .realEnd {
  3. position: absolute;
  4. width: 100%;
  5. height: 25px;
  6. top: -25px; /*等于高度的负值,就是文字的行高*/
  7. left: 350px;
  8. background: #FAA;
  9. font-size: 13px;
  10. }

效果如图下图

若父元素并没有溢出,那么realend元素会出现在其右侧(设置wrap overflow:hidden即可,下面会解决)

3、优化定位

第二步中我们针对end元素设置了相对定位,对realEnd元素设置了绝对定位。但是我们可以采用更简单的代码来实现,即只使用相对定位。熟悉定位模型的同学应该知道,相对定位的元素仍然占据文本流,同时针对元素设置偏移。这样, 就可以去掉end元素了,仅针对realEnd元素设置相对定位。
HTML

</>复制代码

  1. 1.prop
  2. 2.main 这里是要多行文本溢出省略的,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点
  3. realEnd

CSS

</>复制代码

  1. // 删除end样式,realEnd样式更改如下
  2. .realEnd {
  3. float: right;
  4. position: relative;
  5. width: 50px;
  6. height: 25px;
  7. top: -25px; /*等于高度的负值,就是文字的行高*/
  8. left: 350px;
  9. background: #FAA;
  10. font-size: 13px;
  11. }

效果如图(黄色的end已经没了

4、削窄prop元素

目前,最左侧的prop元素的作用在于让realend元素在文本溢出时处在其正下方,在前几节的示例代码中为了直观的演示,设置prop元素的宽度为50px,那么现在为了更好的模拟实际的效果,我们缩小prop元素的宽度。

CSS

</>复制代码

  1. // 更改部分样式如下
  2. .prop {
  3. float: left;
  4. width: 5px;/*缩小宽度为5px,其余属性不变*/
  5. height: 50px;
  6. background: #FAF;
  7. }
  8. .main {
  9. float: right;
  10. width: 400px;
  11. margin-left: -5px;/*让main元素左移5px,这样main元素在宽度上就完全占满了父元素;*/
  12. background: #AFF;
  13. word-break: break-all;
  14. }
  15. .realEnd {
  16. float: right;
  17. position: relative;
  18. width: 50px;
  19. height: 25px;
  20. top: -25px; /*等于高度的负值,就是文字的行高*/
  21. left: 400px;
  22. /*而设置margin-left: -50px、padding-right: 5px则是为了让realend元素的盒模型的最终宽度计算为5px。*/
  23. margin-left: -50px;
  24. padding-right: 5px;
  25. background: #FAA;
  26. font-size: 13px;
  27. }

</>复制代码

  1. 由于CSS规范规定padding的值不可以为负数,因此只有设置margind-left为负值,且等于其宽度。这样做的最终目的就是保证realend元素处在prop元素的下方,保证在文本溢出的情况下定位准确性:

效果图如下

5、流式布局 + 伪元素

目前,realend元素的相关属性仍采用px度量,为了更好的扩展性,可以改用%替代。

同时,prop元素和realend元素可以采用伪元素来实现,减少额外标签的使用。

CSS

</>复制代码

  1. .mutil-line-ellipsis {
  2. width: 400px;
  3. height: 50px;
  4. margin: 20px 20px 50px 300px;
  5. border: 5px solid #AAA;
  6. line-height: 25px;
  7. /*overflow: hidden;*/
  8. }
  9. /*相当于之前的prop*/
  10. .mutil-line-ellipsis:before {
  11. content: "";
  12. float: left;
  13. width: 5px;/*缩小宽度为5px,其余属性不变*/
  14. height: 50px;
  15. background: #FAF;
  16. }
  17. /*相当于之前的main*/
  18. .mutil-line-ellipsis > :first-child {
  19. float: right;
  20. width: 100%;
  21. margin-left: -5px;/*让main元素左移5px,这样main元素在宽度上就完全占满了父元素;*/
  22. background: #AFF;
  23. word-break: break-all;
  24. }
  25. /*相当于之前的realEnd*/
  26. .mutil-line-ellipsis:after {
  27. content: "realEnd";
  28. float: right;
  29. position: relative;
  30. width: 50px;
  31. height: 25px;
  32. top: -25px; /*等于高度的负值,就是文字的行高*/
  33. left: 100%;
  34. /*而设置margin-left: -50px、padding-right: 5px则是为了让realend元素的盒模型的最终宽度计算为5px。*/
  35. margin-left: -50px;
  36. padding-right: 5px;
  37. background: #FAA;
  38. font-size: 13px;
  39. }

HTML

</>复制代码

  1. 2.main 这里是要多行文本溢出省略的,内容多一点,内容多一点,内容多一点,内容多一点
  2. 内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点

效果和上一步一样

6、隐藏

之前的实现中在文本未溢出的情况下,realEnd元素会出现在父元素的右侧,正如

设置
CSS

</>复制代码

  1. .mutil-line-ellipsis {
  2. overflow: hidden;
  3. }
7、美化

现在我们离完结就差一步了,即去掉各元素的背景色,并且用“...”替换文本。最后为了优化体验,采用渐变来隐藏“...”覆盖的文本,(省略了一些兼容性的属性)。
CSS

</>复制代码

  1. .mutil-line-ellipsis {
  2. width: 400px;
  3. height: 50px;
  4. line-height: 25px;
  5. margin: 20px 20px 50px 300px;
  6. border: 5px solid #AAA;
  7. line-height: 25px;
  8. overflow: hidden;
  9. }
  10. /*相当于之前的prop*/
  11. .mutil-line-ellipsis:before {
  12. content: "";
  13. float: left;
  14. width: 5px;/*缩小宽度为5px,其余属性不变*/
  15. height: 50px;
  16. }
  17. /*相当于之前的main*/
  18. .mutil-line-ellipsis > :first-child {
  19. float: right;
  20. width: 100%;
  21. margin-left: -5px;/*让main元素左移5px,这样main元素在宽度上就完全占满了父元素;*/
  22. word-break: break-all;
  23. }
  24. /*相当于之前的realEnd*/
  25. .mutil-line-ellipsis:after {
  26. content: "...";
  27. box-sizing: content-box;
  28. float: right;
  29. position: relative;
  30. width: 50px;
  31. height: 25px;
  32. top: -25px; /*等于高度的负值,就是文字的行高*/
  33. left: 100%;
  34. /*而设置margin-left: -50px、padding-right: 5px则是为了让realend元素的盒模型的最终宽度计算为5px。*/
  35. margin-left: -50px;
  36. padding-right: 5px;
  37. font-size: 13px;
  38. text-align: right;
  39. background: linear-gradient(to right, rgba(255, 255, 255, 0), #ffffff 40px);
  40. }

效果(自己可调整省略样式)

总结之兼容性

从上文的实现细节来看,我们利用的技巧完全是CSS规范中的浮动+定位+盒模型宽度计算,唯一存在兼容性问题的在于无关痛痒的渐变实现,因此可以在大多数浏览器下进行尝试。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/111839.html

相关文章

  • 【前端芝士树】CSS实现多行文本溢出显示省略

    摘要:前端芝士树纯实现多行文本溢出显示省略号使用来控制行数由于用来限制在一个块元素显示的文本的行数这是一个不规范的属性,它没有出现在规范草案中,为了实现该效果,它需要组合其他外来的属性。 【前端芝士树】纯CSS实现多行文本溢出显示省略号 使用-webkit-line-clamp来控制行数 由于-webkit-line-clamp 用来限制在一个块元素显示的文本的行数,这是一个不规范的属性(u...

    CNZPH 评论0 收藏0
  • css实现单行、多行文本超出显示省略

    摘要:前言项目中我们经常遇到这种需求,需要对单行多行文本超出显示为省略号。单行文本省略文本溢出显示省略号文本不会换行语法默认值适用于所有元素当对象内文本溢出时不显示省略标记,而是将溢出的部分裁切掉。 前言:项目中我们经常遇到这种需求,需要对单行、多行文本超出显示为省略号。这篇文章主要总结了小编解决此问题的方法,有不足之处欢迎大家指正。 单行文本省略 showImg(https://segme...

    wing324 评论0 收藏0
  • css实现单行、多行文本超出显示省略

    摘要:前言项目中我们经常遇到这种需求,需要对单行多行文本超出显示为省略号。单行文本省略文本溢出显示省略号文本不会换行语法默认值适用于所有元素当对象内文本溢出时不显示省略标记,而是将溢出的部分裁切掉。 前言:项目中我们经常遇到这种需求,需要对单行、多行文本超出显示为省略号。这篇文章主要总结了小编解决此问题的方法,有不足之处欢迎大家指正。 单行文本省略 showImg(https://segme...

    paulquei 评论0 收藏0
  • css实现单行、多行文本超出显示省略

    摘要:前言项目中我们经常遇到这种需求,需要对单行多行文本超出显示为省略号。单行文本省略文本溢出显示省略号文本不会换行语法默认值适用于所有元素当对象内文本溢出时不显示省略标记,而是将溢出的部分裁切掉。 前言:项目中我们经常遇到这种需求,需要对单行、多行文本超出显示为省略号。这篇文章主要总结了小编解决此问题的方法,有不足之处欢迎大家指正。 单行文本省略 showImg(https://segme...

    maxmin 评论0 收藏0

发表评论

0条评论

李义

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<