期望实现
文字最多展示 N 行,超出部分截断,并在右下角显示 “…” + “更多”;
点击更多,文字展开全部内容,右下角显示“收起”。效果如下:
思路
尽量使用CSS控制样式,减少JS代码复杂度。
利用CSS中的浮动,实现文字环绕效果;利用伪元素浮动,将浮动文字撑到右下角,所以需要已知文字的行高(并且是固定行高),由此可以推算文字收起时,文字部分最大高度,以及伪元素的高度。
代码
下面例子设置最多展示3行,行高是20px。
codepan: css浮动实现展开收起效果
html:
<body><div class="text-box" id="TextBox"><span class="read-more" id="BtnReadMore"></span><p>中央财办表示,明年将实施提振消费专项行动,重点是把促消费和惠民生紧密结合起来。一方面,要在增强消费能力、提升消费意愿上下功夫,通过加大财政对终端消费直接投入、提升社会保障水平等方式,推动居民收入稳定增长。</p></div>
</body>
css:
* {padding: 0;margin: 0;
}body {width: 500px;padding: 10px 20px;box-sizing: border-box;margin: 20px auto;border: 1px solid #999;
}
.text-box {position: relative;max-height: 60px; /* 行高是M,最多展示N行,则最大高度是(M*N)px */overflow: hidden;font-size: 0;
}
.text-box p {font-size: 14px;line-height: 20px;
}
.text-box::before {content: "";display: inline;float: right;width: 0;height: 40px; /* 伪元素高度是 M*(N-1)px */
}
.text-box .read-more {float: right;clear: right;
}
.text-box .read-more::before {content: "...";font-size: 14px;line-height: 20px;margin-right: 6px;
}
.text-box .read-more::after {content: "展开";color: #0a6edb;font-size: 14px;line-height: 20px;
}.text-box.unfold {max-height: inherit;padding-bottom: 20px; /* 文字底部留一行高度, 展示“收起” */
}
.text-box.unfold::before {display: none;
}
.text-box.unfold .read-more {float: none;position: absolute;bottom: 0;right: 0;
}
.text-box.unfold .read-more::before {display: none;
}
.text-box.unfold .read-more::after {content: "收起";
}
js:
document.getElementById("BtnReadMore").onclick = function() {document.getElementById("TextBox").classList.toggle("unfold")
}