前端實(shí)現(xiàn)文本溢出展開和收起功能
判斷文本溢出
眾所周知,單行文本溢出打點(diǎn)僅需要:
.ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}而單行文本判斷是否溢出的關(guān)鍵就是element.scrollWidth > element.clientWidth
需要注意的是,當(dāng)使用以上方式判斷的時(shí)候,不要給元素加上overflow: hidden的樣式,不然獲取的clientWidth一直都是等于scrollWidth。
示例
先看下元素結(jié)構(gòu):
<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的元素中,里面有展開、收起兩個(gè)按鈕
再寫點(diǎn)樣式:
.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去判斷文本是否溢出,關(guān)鍵需要給.text添加white-space: nowrap;
當(dāng)需要給.text元素添加單行文本溢出的3行代碼,不要直接添加到.text類名下(直接寫overflow: hidden就不能使用scrollWidth判斷文本溢出了)
另加一個(gè)類名,比如:.ellipsis,然后使用js判斷文本是否溢出,再給該元素添加該類名。
.text.ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}讓.more按鈕僅在.ellipsis下展示,再給.more按鈕寫點(diǎn)樣式,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");
}判斷文本溢出后,才會(huì)給文字添加overflow: hidden,為了避免頁(yè)面文字閃爍,給初始文本元素添加opacity: 0,在判斷完畢后,設(shè)置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");
}分別給展開、收起按鈕添加點(diǎn)擊事件,事件僅需要添加、刪除類名即可
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");
});這里又加了個(gè)新類名.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");
});
拓展
多行文本溢出
多行文本展開收起的思路一樣的
需要修改下文本溢出判斷函數(shù),使用clientHeight、scrollHeight判斷:
const isTextOverflowY = (elem) => {
return text.clientHeight < text.scrollHeight;
};.ellipsis溢出css修改為多行文本溢出打點(diǎn)即可
.ellipsis {
overflow : hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}以上就是前端實(shí)現(xiàn)文本溢出展開和收起功能的詳細(xì)內(nèi)容,更多關(guān)于前端文本溢出展開收起的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javascript中encodeURI和decodeURI方法使用介紹
encodeURI和decodeURI是成對(duì)來(lái)使用的,因?yàn)闉g覽器的地址欄有中文字符的話,可以會(huì)出現(xiàn)不可預(yù)期的錯(cuò)誤,所以可以encodeURI把非英文字符轉(zhuǎn)化為英文編碼,decodeURI可以用來(lái)把字符還原回來(lái)2013-05-05
ES6代碼轉(zhuǎn)ES5詳細(xì)教程(babel安裝使用教程)
Babel 是一個(gè)廣泛使用的 ES6 轉(zhuǎn)碼器,可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼,從而在老版本的瀏覽器執(zhí)行,這意味著,你可以用 ES6 的方式編寫程序,又不用擔(dān)心現(xiàn)有環(huán)境是否支持,這篇文章主要介紹了ES6代碼轉(zhuǎn)ES5教程(babel安裝使用教程),需要的朋友可以參考下2023-01-01
現(xiàn)代 JavaScript 開發(fā)編程風(fēng)格Idiomatic.js指南中文版
下面的章節(jié)描述的是一個(gè) 合理 的現(xiàn)代 JavaScript 開發(fā)風(fēng)格指南,并非硬性規(guī)定。其想送出的核心理念是高度統(tǒng)一的代碼風(fēng)格(the law of code style consistency)。2014-05-05
JavaScript前端實(shí)現(xiàn)快照的示例代碼
snapshot 翻譯為快照,用于直觀獲取頁(yè)面在某個(gè)運(yùn)行時(shí)的狀態(tài),本文主要為大家詳細(xì)介紹 snapshot 工具實(shí)現(xiàn)的原理,以及其在項(xiàng)目中的使用,需要的可以參考下2023-11-11
js實(shí)現(xiàn)AI五子棋人機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)AI五子棋人機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
javascript 組合按鍵事件監(jiān)聽實(shí)現(xiàn)代碼
這篇文章主要介紹了javascript 組合按鍵事件監(jiān)聽實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02

