两种方式实现文本超出指定行数显示展开收起...

需要实现这样一个功能
默认高度下文本超出隐藏,点击展开可查看所有内容,点击收起可折叠
方法一:通过html和css实现
代码部分
cpp 复制代码
html:
 <div className="expand-fold">
        <input id="check-box" type="checkbox" />
        <div className="content">
          {/* htmlFor和input的id一致 */}
          <label className="label" htmlFor="check-box"></label>
          <span>
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Explicabo
            quas architecto perspiciatis voluptas odio magni dolorem doloribus
            recusandae commodi accusamus voluptates, laudantium tempora, est
            soluta blanditiis labore tempore officia ipsam! Lorem ipsum dolor
            sit amet consectetur adipisicing elit. Explicabo quas architecto
            perspiciatis voluptas odio magni dolorem doloribus recusandae
            commodi accusamus voluptates, laudantium tempora, est soluta
            blanditiis labore tempore officia ipsam!
          </span>
        </div>
      </div>

css:
  .expand-fold {
      display: flex;

      #check-box { // 将勾选框隐藏
        display: none;
      }
      #check-box:checked + .content { // 选中勾选框(点击展开)时修改最大高度,合理即可
        max-height: 800px;
      }
      #check-box:checked + .content .label { // 展开时,隐藏省略号,文字改为收起
        &::before {
          // 隐藏省略号
          content: '';
        }
        &::after {
          content: '收起';
        }
      }

      .content { 
        font-size: 16px;
        flex: 1;
        max-height: 46px;
        line-height: 23px;
        overflow: hidden;
        &::before { // 将展开/收起文字对齐最右边
          content: '';
          float: right;
          height: calc(100% - 23px);
        }
      }
      .label { // 展开收起文字部分
        position: relative;
        float: right;
        clear: both;
        font-size: 16px;
        padding: 0 8px;
        color: #26caf8;
        border-radius: 4px;
        cursor: pointer;
        &::before { // 默认展开时添加省略号
          content: '...';
          position: absolute;
          left: -5px;
          color: #333;
          transform: translateX(-100%);
        }
        &::after {
          content: '展开';
        }
      }
    }
方法二:通过AntDesign + react实现组件封装
AntDesign默认只有展开功能,没有收起功能,以下是基于Typography组件实现展开收起
组件UI部分
cpp 复制代码
import { Typography } from 'antd';
import React, { useState } from 'react';
import style from './index.less';

const { Paragraph } = Typography;

export type ExpandTextType = {
  rows?: number;
  symbol?: React.ReactNode;
  foldSlot?: React.ReactNode;
  children?: React.ReactNode;
};

const defaultSymbol = () => (
  <span className="ant-typography">
    展开 <i className="iconfont icon-jiantou-shaixuanzhankai"></i>
  </span>
);

const Example: React.FC<ExpandTextType> = (props) => {
  const { rows = 2, symbol = defaultSymbol(), foldSlot } = props;
  const [ellipsis, setEllipsis] = useState(false);
  const [counter, setCounter] = useState(0);
  const onFold = () => {
    setEllipsis(!ellipsis);
    setCounter(counter + 1);
  };
  const onExpand = () => {
    setEllipsis(!ellipsis);
    setCounter(counter + 0);
  };

// 自定义收起文案
  const renderFold = () => {
    return (
      <a className="ant-typography-fold" onClick={onFold}>
        {foldSlot ? (
          foldSlot
        ) : (
          <span>
            收起
            <i className="iconfont icon-jiantou-shaixuanzhankai icon-fold"></i>
          </span>
        )}
      </a>
    );
  };
  return (
    <div className={style['container']}>
      <Paragraph
        key={counter}
        ellipsis={{
          rows,
          expandable: true,
          symbol,
          onExpand,
        }}
      >
        {props?.children}
        {ellipsis && renderFold()}
      </Paragraph>
    </div>
  );
};

export default Example;
组件css
cpp 复制代码
.container {
  :global {
    .ant-typography {
      margin-bottom: 0;
    }

    .ant-typography-expand,
    .ant-typography-fold {
      color: #089cdb;
      font-size: 13px;
      cursor: pointer;
      height: 17px;
      line-height: 17px;
      margin-left: 4px;

      .iconfont.icon-jiantou-shaixuanzhankai {
        display: inline-block;
        font-size: 10px;
        transform: rotate(90deg);
      }

      .iconfont.icon-jiantou-shaixuanzhankai.icon-fold {
        transform: rotate(-90deg);
        margin-left: 4px;
      }
    }
  }
}
页面使用组件
cpp 复制代码
import ExpandText from '@/components/ExpandText'; 
import style from './index.less';

export type ExampleType = unknown;
const Example: React.FC<ExampleType> = () => {
  return (
    <div className={style.container}>
          <ExpandText>这里放入要展示的文案内容啊...</ExpandText>
    </div>
  );
};

export default Example;
相关推荐
贾伟康16 分钟前
【共创稿事节】一个 UserDataManager 管八类数据:Preferences 持久化的克制用法
java·服务器·前端·harmonyos·arkts·鸿蒙
卓豪终端管理23 分钟前
【无标题】
java·服务器·前端
修炼的dance28 分钟前
一条命令查清 WebM 有没有透明通道,默认解码会骗你
前端
小灰灰搞电子32 分钟前
Rust+Slint 实现动态流光边框源码分享
开发语言·前端·rust·流光边框
niucloud-admin38 分钟前
NIUCLOUD PHP SAAS上门家政使用文档:机构报表
前端·人工智能
枣把儿1 小时前
开源!全套公众号写作、封面、发布自动化工具包!
前端·命令行
陶醉的松鼠1 小时前
前端容易忽略的 debugger 调试技巧
前端
我命由我123451 小时前
6-3.Python 异常处理 - 异常处理进阶(else 块与 finally 块、异常传递、自定义异常)
开发语言·前端·数据库·后端·python·学习·java-ee
龙九山1 小时前
我的 10 个 npm 插件,差点被 AI 判了死刑
前端·开源
deli0071 小时前
键盘按键测试:按下就点亮,keydown 延迟精确到 1 毫秒
前端