实现文本溢出(四)带展开收起的多行省略

903 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言:

成功没有捷径但成长有路径

css必备场景。专注积累,每天记录一个知识点,老概念新理解,重点记录一下

每天梳理一个场景,知识点查漏补缺,充实满足。

正文

背景

又来了又来了,实现文本溢出的最后一篇文章,也是最有难度的一篇,带展开收起的多行省略。 需求是这样的,文案未满两行时正常显示,超过两行显示展开收起,这种交互主要难点主要有三个

1,显示省略号

2,展开收起的按钮状态切换

3,这个按钮要融入文本,挂在文字后面

展开/收起

image.png

实现

之前实现的几个需求场景都很简单,不管哪种都能实现,第一次做这个需求在网上找了找文档,点赞最高的是这篇CSS实现多行文本“展开收起”,还有这篇代码代码地址,但是收起的交互不太一样,在右下角,跟我们交互挂在文字末尾的要求不一样,各有优缺点

方案

我参考了上面的两种方式,综合以后最终我使用的方案是通过隐藏的形式,

1,省略号的实现,还是通过css多行省略的样式(用到之前的文章介绍过的js获取高度,判断是否需要省略)

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

2,展开,按钮的实现参考上面的文章,文字的行高是关键要确定的,通过float实现文本环绕,然后调整宽高定位到右下角。

3,收起,可以直接放在文章的末尾,因为出现在省略的情况下文字直接折叠的,收起按钮是看不到的,然后控制切换的时候两个按钮的显隐。

css代码

.ellipsis {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
  -webkit-line-clamp: 2;
  cursor: pointer;
}
.content {
  line-height: 20px;
}
.text::before {
  content: '';
  float: right;
  width: 0;
  height: 20px;
}
.btn {
  float: right;
  clear: both;
}
.more-btn {
  margin-left: 4px;
  color: #006dff;
  cursor: pointer;
  &:hover {
    color: #ff8929;
  }
}

js代码

// 需要js判断一下是否需要展开收起
if (height > lineHeight * line) {
  setText0ver(true);
}

<div className={styles.content}>
  <div
    className={`${isCollapse ? styles.ellipsis : ''} ${styles.text}`}
    ref={target}
    style={{
      maxWidth: width,
      display: '-webkit-box',
      lineClamp: line,
      ...style,
    }}
  >
    {isCollapse && (
      <span
        className={`${styles.btn} ${styles.moțeBtn}`}
        onClick={() => {
          setIsCollapse(!isCollapse);
        }}
      >
        展开
      </span>
    )}
    {children}
    {!isCollapse && (
      <span
        className={styles.moreBtn}
        onClick={() => {
          setIsCollapse(!isCollapse);
        }}
      >
        收起
      </span>
    )}
  </div>
</div>