前端实现文本溢出展开和收起功能

 更新时间:2025年04月15日 11:16:21   作者:小周同学_丶  
在现代网页设计中,文本是网页中最重要的内容之一,然而,当文本超出其容器的大小时,会发生文本溢出的问题,文本溢出不仅会影响网页的视觉效果,还会影响网页的可读性和可用性,所以本文给大家介绍了前端实现文本溢出展开和收起功能的方法,需要的朋友可以参考下

判断文本溢出

众所周知,单行文本溢出打点仅需要:

.ellipsis {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

而单行文本判断是否溢出的关键就是element.scrollWidth > element.clientWidth

需要注意的是,当使用以上方式判断的时候,不要给元素加上overflow: hidden的样式,不然获取的clientWidth一直都是等于scrollWidth。

示例

先看下元素结构:

<div class="wrapper">
  <div class="text">
    Lorem ipsum dolor sit amet consectetur adipisicing elit. nulla facere
    obcaecati consequatur quisquam adipisci veritatis! Deserunt nostrum
    doloribus minima voluptatum labore.
    <span class="more">展开</span>
    <span class="collapse">收起</span>
  </div>
</div>

文本在.text的元素中,里面有展开收起两个按钮

再写点样式:

.wrapper {
  width: fit-content;
  height: fit-content;
  border-radius: 8px;
  border: 1px solid #00bfbf;
  padding: 8px;
}
 
.text {
  width: 300px;
  font-size: 14px;
  line-height: 20px;
}

于是就得到如下图所示的展示效果:

初始化将展开/收起按钮隐藏 

/* 展开/收起按钮初始隐藏 */
.text .more {
  display: none;
}
.text .collapse {
  display: none;
}

要使用scrollWidth去判断文本是否溢出,关键需要给.text添加white-space: nowrap;

当需要给.text元素添加单行文本溢出的3行代码,不要直接添加到.text类名下(直接写overflow: hidden就不能使用scrollWidth判断文本溢出了)

另加一个类名,比如:.ellipsis,然后使用js判断文本是否溢出,再给该元素添加该类名。

.text.ellipsis {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

让.more按钮仅在.ellipsis下展示,再给.more按钮写点样式,css代码如下:

/* 溢出 */
.text.ellipsis {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  position: relative;
}
/* 文字溢出 - 展开按钮 */
.text.ellipsis .more {
  display: block;
}
 
.more {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  display: block;
  color: #00bfbf;
  background-color: #fff;
  font-size: 14px;
  line-height: 20px;
  width: fit-content;
  cursor: pointer;
}
 
.more::after {
  content: "";
  display: block;
  position: absolute;
  height: 20px;
  width: 60px;
  right: 28px;
  top: 0;
  background: linear-gradient(
    to right,
    rgba(255, 255, 255, 0),
    rgba(255, 255, 255, 0.6),
    rgba(255, 255, 255, 1)
  );
}

就得到以下效果:

js判断文本溢出如下:

const isTextOverflowX = (elem) => {
  return text.clientWidth < text.scrollWidth;
};
 
const text = document.getElementsByClassName("text")[0];
 
const isTextOverflow = isTextOverflowX(text);
 
if (isTextOverflow) {
  text.classList.add("ellipsis");
}

判断文本溢出后,才会给文字添加overflow: hidden,为了避免页面文字闪烁,给初始文本元素添加opacity: 0,在判断完毕后,设置opacity: 1

修改一下css,js代码

.text {
  ...
  white-space: nowrap;
  opacity: 0;
}
 
/* 未溢出 */
.text.normal {
  white-space: unset; // 让文字正常换行
  opacity: 1;
}
/* 溢出 */
.text.ellipsis {
  ...
  opacity: 1;
}
if (isTextOverflow) {
  text.classList.add("ellipsis");
} else {
  text.classList.add("normal");
}

分别给展开收起按钮添加点击事件,事件仅需要添加、删除类名即可

const more = document.getElementsByClassName("more")[0];
more.addEventListener("click", () => {
  text.classList.remove("ellipsis");
  text.classList.add("expand");
});
 
const collapse = document.getElementsByClassName("collapse")[0];
collapse.addEventListener("click", () => {
  text.classList.remove("expand");
  text.classList.add("ellipsis");
});

这里又加了个新类名.expand为了控制文本展开后的按钮显示隐藏

/* 文本展开 */
.text.expand {
  white-space: unset;
  opacity: 1;
}
/* 文本展开 - 收起按钮 */
.text.expand .collapse {
  display: inline-block;
}

最终效果如下:

完整代码

HTML: 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>文字溢出隐藏</title>
    <link rel="stylesheet" href="./index.css" rel="external nofollow"  />
    <script src="./index.js" defer></script>
  </head>
  <body>
    <div class="wrapper">
      <div class="text">
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum animi
        cum consequuntur beatae, culpa impedit excepturi fuga, nulla facere
        obcaecati consequatur quisquam adipisci veritatis! Deserunt nostrum
        doloribus minima voluptatum labore.
        <span class="more">展开</span>
        <span class="collapse">收起</span>
      </div>
    </div>
  </body>
</html>

CSS: 

.wrapper {
  width: fit-content;
  height: fit-content;
  border-radius: 8px;
  border: 1px solid #00bfbf;
  padding: 8px;
  margin: 30px auto;
}
 
.text {
  width: 300px;
  font-size: 14px;
  line-height: 20px;
  white-space: nowrap;
  opacity: 0;
}
/* 展开/收起按钮初始隐藏 */
.text .more {
  display: none;
}
.text .collapse {
  display: none;
}
 
/* 未溢出 */
.text.normal {
  white-space: unset;
  opacity: 1;
}
/* 溢出 */
.text.ellipsis {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  position: relative;
  opacity: 1;
}
/* 文字溢出 - 展开按钮 */
.text.ellipsis .more {
  display: block;
}
 
/* 文本展开 */
.text.expand {
  white-space: unset;
  opacity: 1;
}
/* 文本展开 - 收起按钮 */
.text.expand .collapse {
  display: inline-block;
}
 
.more {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  display: block;
  color: #00bfbf;
  background-color: #fff;
  font-size: 14px;
  line-height: 20px;
  width: fit-content;
  cursor: pointer;
}
 
.more::after {
  content: "";
  display: block;
  position: absolute;
  height: 20px;
  width: 60px;
  right: 28px;
  top: 0;
  background: linear-gradient(
    to right,
    rgba(255, 255, 255, 0),
    rgba(255, 255, 255, 0.6),
    rgba(255, 255, 255, 1)
  );
}
 
.collapse {
  color: #00bfbf;
  cursor: pointer;
}

JS: 

const isTextOverflowX = (elem) => {
  return text.clientWidth < text.scrollWidth;
};
 
const text = document.getElementsByClassName("text")[0];
 
const isTextOverflow = isTextOverflowX(text);
 
if (isTextOverflow) {
  text.classList.add("ellipsis");
} else {
  text.classList.add("normal");
}
 
const more = document.getElementsByClassName("more")[0];
more.addEventListener("click", () => {
  text.classList.remove("ellipsis");
  text.classList.add("expand");
});
 
const collapse = document.getElementsByClassName("collapse")[0];
collapse.addEventListener("click", () => {
  text.classList.remove("expand");
  text.classList.add("ellipsis");
});
 

拓展

多行文本溢出

多行文本展开收起的思路一样的

需要修改下文本溢出判断函数,使用clientHeightscrollHeight判断:

const isTextOverflowY = (elem) => {
  return text.clientHeight < text.scrollHeight;
};

.ellipsis溢出css修改为多行文本溢出打点即可

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

以上就是前端实现文本溢出展开和收起功能的详细内容,更多关于前端文本溢出展开收起的资料请关注脚本之家其它相关文章!

相关文章

  • 利用JavaScript模拟京东按键输入功能

    利用JavaScript模拟京东按键输入功能

    这篇文章主要给大家介绍了关于如何利用JavaScript模拟京东按键输入功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Django 中的templates使用示例详解

    Django 中的templates使用示例详解

    Django模板系统提供了一套丰富的工具集,能够帮助开发者将动态数据有效地渲染到HTML页面中,它通过特殊的语法支持变量插入、逻辑标签和过滤器的使用,本文给大家介绍Django 中的templates使用,感兴趣的朋友一起看看吧
    2024-10-10
  • javascript中encodeURI和decodeURI方法使用介绍

    javascript中encodeURI和decodeURI方法使用介绍

    encodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来
    2013-05-05
  • ES6代码转ES5详细教程(babel安装使用教程)

    ES6代码转ES5详细教程(babel安装使用教程)

    Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,从而在老版本的浏览器执行,这意味着,你可以用 ES6 的方式编写程序,又不用担心现有环境是否支持,这篇文章主要介绍了ES6代码转ES5教程(babel安装使用教程),需要的朋友可以参考下
    2023-01-01
  • 现代 JavaScript 开发编程风格Idiomatic.js指南中文版

    现代 JavaScript 开发编程风格Idiomatic.js指南中文版

    下面的章节描述的是一个 合理 的现代 JavaScript 开发风格指南,并非硬性规定。其想送出的核心理念是高度统一的代码风格(the law of code style consistency)。
    2014-05-05
  • 十分钟教你上手ES2020新特性

    十分钟教你上手ES2020新特性

    这篇文章主要介绍了十分钟教你上手ES2020新特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • javascript加载导出3mf文件

    javascript加载导出3mf文件

    3MF是一种开放标准的文件格式,专门用于三维制造和打印,这篇文章主要介绍了如何使用JavaScript实现加载导出3mf文件,感兴趣的可以了解下
    2024-11-11
  • JavaScript前端实现快照的示例代码

    JavaScript前端实现快照的示例代码

    snapshot 翻译为快照,用于直观获取页面在某个运行时的状态,本文主要为大家详细介绍 snapshot 工具实现的原理,以及其在项目中的使用,需要的可以参考下
    2023-11-11
  • js实现AI五子棋人机大战

    js实现AI五子棋人机大战

    这篇文章主要为大家详细介绍了js实现AI五子棋人机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • javascript 组合按键事件监听实现代码

    javascript 组合按键事件监听实现代码

    这篇文章主要介绍了javascript 组合按键事件监听实现代码的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论