18910140161

CSS自动显示“全文”链接

顺晟科技

2022-09-15 12:11:08

123

最近有同事问我这样一个交互,当文本较多时(超出5行),出现“全文”链接,说明有更多的内容,点了之后跳转新页面,效果图如下

image-20210619183222438

那么,有没有办法在不使用 js 的情况下实现呢?我一看就来了兴致,看着好像和之前这篇文章 CSS 实现多行文本“展开收起” (juejin.cn) 有点类似?不过这次的布局要简单的多,交互琢磨了半天发现也是可以完美实现的,并且是完全不一样的思路,一起来看看吧

一、布局

关于布局这块就没什么好研究的了,正常写就行,也不需要什么浮动,实现如下

<div>
  <p>CSS的 margin-bottom 属性用于设置元素的底部外边距,允许设置负数值。一个正数值将让它相对于正常流与邻近块更远,而负数值将使得更近。</p>
  <a>全文</a>
</div>

然后加点样式,-webkit-line-clamp 实现多行截断

.wrap {
  background: #fff;
  border-radius: 8px;
  padding: 15px;
  box-shadow: 20px 20px 60px #bebebe,
    -20px -20px 60px #ffffff;
}

.text{
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: justify;
  display: -webkit-box;
  -webkit-line-clamp: 3; /*多行超出省略*/
  -webkit-box-orient: vertical;
  line-height: 1.5;
}

可以得到这样的效果

WeChatcb5c261942c01cf6b86aff084ea3902d

很显然,下面的链接也是一直存在的。那么,CSS 如何区分这两种情况呢?

二、不完美实现

起初,我很快想到了一种实现方式,如下

在文本的末尾使用一个元素遮盖住下面的链接,这里可以用伪元素::after实现。

.text::after{
  content: '';
  position: absolute;
  display: block;
  width: 100%;
  height: 50px; /*只要能盖住链接就行*/
  background: red;
}

效果如下

WeChatf3ea94b878055a68706d38979366e110

注意上面的实现,由于在设置绝对定位时,并没有设置 top 值,所以 ::after 仍然紧跟在文本的后面。因此在文本超出的情况下,::after已经位于可视范围外了,所以不会遮盖下面的链接,实际上是这个样子

image-20210620223022954

最后把遮盖的颜色换成相同的底色就可以了

.text::after{
  background: inherit; /*继承父级的背景*/
}

Kapture 2021-06-21 at 19.04.33

完整代码可访问 auto expand cover (codepen.io)

那为什么说这是不完美的呢?

细心的小伙伴可能已经发现了,就是当不显示链接的时候,下面仍然占据着空间。当我把这个实现给到同事时,果然是这样

image-20210619195050563

三、完美的实现

虽然功能上没什么问题,但视觉上肯定难以接受。仔细比较两种情况的差异,不难发现,两种情况的高度是不一样的(

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航