CSS 实现文本"不定行数"截断

简介: CSS 实现文本"不定行数"截断

偶然发现,在某乎热榜页有一个很有意思的布局,这里的标题会制约内容的行数,所以文本超出是"不定行"的。详细规则如下:


  1. 整个容器高度是固定的,标题和内容总共 3 行
  2. 标题最多2行,超出省略
  3. 内容由剩余空间决定,如果标题占2行,则内容超出1行省略;如果标题占1行,则内容超出2行省略


是不是很灵(离)活(谱)的交互?可以充分利用页面空间,保证标题和内容都能展示出来,示意如下

image.png

看了下原站的实现,是通过 js 判断标题高度,然后动态添加一个类名实现的。不过呢,经过一番琢磨,这里也是可以纯 CSS 实现的,一起来看看吧


一、标题超出省略


假设有这样一段 HTML

<div class="section">
    <h3 class="title">LGD 在 TI10 放猛犸,RNG 在 S7 放加里奥最后都输了,哪个更让你愤怒失望?</h3>
    <p class="excerpt">猛犸是对面的绝中绝,大家都知道,并且之前扳回两局已经证明了,当lgd选择ban掉猛犸,或者自己抢掉猛犸时,对面完全不是对手。</p>
</div>


标题的规则是超出2行省略,这个简单,直接用-webkit-line-clamp 实现

.title{
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}


超出2行就会自动省略了

image.png


二、内容自适应行数


由于整个高度是固定的,如果让内容部分自适应剩余空间是不是就实现了呢?提到自适应剩余空间,可以马上想到 flex 布局,所以可以这样来实现:

.section{
    display: flex;
    overflow: hidden;
    height: 72px;/*定一个高度*/
    flex-direction: column;
}
.excerpt{
      flex: 1; /*自适应剩余空间*/
      overflow: hidden;
}


这样借助flex: 1;overflow: hidden;就几乎实现了想要的效果,如下

image.png

已经很完美,只是现在超出还没有省略号,接着往下看


三、不定行超出省略


一般情况,-webkit-line-clamp适用于行数确定的情况下,现在行数不定,有时是 1 行,有时是 2 行,如何处理呢?这里就需要一些奇技淫巧了。大家可能还记得这篇文章 CSS 实现多行文本“展开收起”,里面就提到了如何使用浮动来实现文本超出省略的效果,有兴趣的可以参考一下。


1. 右下角环绕效果


首先添加一个伪元素,设置右浮动

.excerpt::before{
    content: '...';
    float: right;
}


image.png

很明显省略号目前是在右上角的,现在需要挪到右下角来,之前的操作是通过一个浮动元素把这个省略号挤下来,但是需要额外的占位元素


这里再介绍一种新的方式,借助 CSS shapes 布局实现!


首先,将省略号高度撑满,并居下对齐,可以用 flex 实现

.excerpt::before{
    content: '...';
    float: right;
      height: 100%;
    display: flex;
    align-items: flex-end;
}


image.png

这样省略号虽然到了右下角,但是上面的部分也被挤走了,没有达到环绕的效果。这时就可以用 shapes 布局了,不了解这个布局的,可以参考一下 张鑫旭 的这篇文章: 写给自己看的CSS shapes布局教程 « 张鑫旭-鑫空间-鑫生活 (zhangxinxu.com)


这里仅仅只需要利用到 shape-outside:inset()就可以了,表示以自身为边界,然后上、右、下、左四个方向分别向内缩进的距离。比如这里需要缩进到靠近省略号位置,所以

.excerpt::before{
    /*其他样式**/
      shape-outside: inset(calc(100% - 1.5em) 0 0);
}


效果如下

image.png

去除背景,可以看到省略号完美的环绕在右下角

image.png


2. 自动隐藏省略号


现在还有一个问题,需要文本较少时隐藏省略号,该如何实现呢?可以试试 “CSS 障眼法”


简单来说,就是用一个足够大的色块盖住省略号,设置绝对定位后,色块是跟随内容文本的,所以在文字较多时,色块也跟随文本挤下去了,实现如下

.excerpt::after{
    content: '';
    position: absolute;
    width: 999vh;
    height: 999vh;
    background: #fff;
}


原理示意如下

image.png

个别极端情况可能会遮挡不住,比如

image.png

没关系,可以随便找个东西补上,比如 box-shadow,往左下角偏移一点就可以了

.excerpt::after{
    content: '';
    position: absolute;
    width: 999vh;
    height: 999vh;
    background: #fff;
      box-shadow: -2em 2em #fff; /*左下的阴影*/
}


image.png

设置和底色相同的颜色后,最终的效果如下

image.png

这样就实现了文章开头某乎的交互效果,完整代码可访问 auto-clamp (codepen.io)点击预览

image.png


四、总结和说明


以上实现了一个不定行数的文本截断效果,融合了许多 CSS 小技巧,除了 shapes 布局以外(当然也可以采用其他方式实现),没有太多陌生的属性,下面简单总结一下:


  1. 多行省略直接使用 -webkit-line-clamp,现代浏览器都支持
  2. flex 布局可以很方便的处理剩余空间
  3. float + shapes 布局也可以实现右下角环绕效果
  4. box-shadow 在障眼法中很常见
  5. 适当积累一些 CSS 奇技淫巧,有时候会帮上大忙


在我看来,布局的事情当然最好由 CSS 解决,实现更灵活,渲染更迅速,没有框架限制,无需等待 dom 加载,无需 JS 计算尺寸,无需遍历节点,好处太多了。如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发

相关文章
|
2月前
|
前端开发
前端基础(五)_CSS文本文字属性、背景颜色属性
本文详细介绍了CSS中关于文本和背景颜色的样式属性。包括字体大小、字体族、字体加粗、字体样式、文本行高、`font`属性、文本颜色、文本对齐方式、文本装饰线、首行缩进等文本属性,以及背景颜色、背景图片、背景重复、背景位置等背景属性。文章通过示例代码展示了这些属性的具体应用和效果。
28 3
前端基础(五)_CSS文本文字属性、背景颜色属性
|
2月前
|
前端开发
【前端web入门第三天】02 CSS字体和文本
本文详细介绍了CSS中字体和文本的相关属性。字体部分涵盖字体大小、粗细、样式、行高、字体族及`font`复合属性,通过具体示例展示了如何设置和使用这些属性。文本部分则讲解了文本缩进、对齐方式、修饰线及文字颜色等属性,并提供了实用的代码示例。此外,还简要介绍了调试工具中的一些细节,如错误属性标识和属性生效状态的控制。
64 28
|
3月前
|
前端开发
使用CSS样式化占位文本
使用CSS样式化占位文本
19 0
|
4月前
|
前端开发 JavaScript
文本,wangEditor5展示HTML无样式,wangEditor5如何看源码,Ctrl + U看CSS文件,代码高亮,Prism.js可以实现,解决方法,参考网页源代码的写法
文本,wangEditor5展示HTML无样式,wangEditor5如何看源码,Ctrl + U看CSS文件,代码高亮,Prism.js可以实现,解决方法,参考网页源代码的写法
|
3月前
|
前端开发 容器
CSS实现多行文本的展开收起
CSS实现多行文本的展开收起
38 0
|
4月前
|
前端开发 容器
CSS【详解】对齐 (含文本垂直对齐,文本水平对齐、单行文本垂直居中、多行文本垂直居中、6 种方案块级元素水平垂直居中 、7 种方案图片水平垂直居中、文本自适应对齐、图标和文本对齐,图片和文本对齐等)
CSS【详解】对齐 (含文本垂直对齐,文本水平对齐、单行文本垂直居中、多行文本垂直居中、6 种方案块级元素水平垂直居中 、7 种方案图片水平垂直居中、文本自适应对齐、图标和文本对齐,图片和文本对齐等)
65 0
|
4月前
|
前端开发
css 实现打字特效(仅支持单行文本)
css 实现打字特效(仅支持单行文本)
36 0
|
3月前
|
前端开发
2s 利用 HTML+css动画实现企业官网效果
2s 利用 HTML+css动画实现企业官网效果
HTML+CSS 实现通用的企业官网页面(记得收藏)
HTML+CSS 实现通用的企业官网页面(记得收藏)
|
1月前
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML和CSS之旅
【9月更文挑战第32天】在这个数字化的时代,拥有一个个人博客不仅是展示自我的平台,也是技术交流的桥梁。本文将引导初学者理解并实现一个简单的个人博客网站的搭建,涵盖HTML的基础结构、CSS样式的美化技巧以及如何将两者结合来制作一个完整的网页。通过这篇文章,你将学会如何从零开始构建自己的网络空间,并在互联网世界留下你的足迹。