前段时间,我分享了一种文本展开收起的方法,并得到了广大朋友的积极反馈。其中,有热心的朋友特别提出一个建议,希望将展开收起的按钮放置在文本末尾。为此,我进行了多次调试与尝试,终于实现了这一功能,并在此与大家分享我的成果。
在着手实现之前,我查阅了百度上众多网友的做法,发现很多人都是通过input的checked属性来控制文本的展开与收起。我也采用了这种方式。
但在此基础上,我特别注重了兼容性的处理。因为有些写法在Chrome浏览器上运行得非常好,但在Firefox浏览器上却会出现样式混乱的问题。因此,我进行了相应的调整和优化,确保在各种主流浏览器上都能呈现出良好的效果。
话不多说,上效果展示
具体实现步骤
1. 先搭建基础页面
<div class="wrap"> <input type="checkbox" id="switch" class="input"> <div class="text"> <label class="btn" for="switch"></label> 在清晨的微光中,小镇被一层薄薄的雾气轻轻笼罩,仿佛披上了一层神秘的面纱。 街道两旁的梧桐树在微风中轻轻摇曳,发出沙沙的声响,像是在诉说着不为人知的故事。 远处,炊烟袅袅升起,带着家的温馨和生活的气息。偶尔,一阵清脆的鸟鸣划破寂静, 为这宁静的早晨增添了几分生机。人们开始陆续走出家门,迎接新的一天, 他们的脸上洋溢着期待和希望,仿佛在告诉世界,这里是一个充满活力和希望的地方。 </div> </div>
复制
*{ margin: 0; padding: 0; } .wrap{ max-width: 750px; display: flex; padding: 16px; border: 1px solid rgba(0,0,0,.2); margin: 20px 100px; overflow: hidden; border-radius: 12px; box-shadow: 0 0 10px rgba(0,0,0,.2); position: relative; } .text { line-height: 1.5; max-height: 4.5em; // 这里设置的是最大高度3行,超过隐藏 overflow: hidden; }
复制
2.利用float
属性巧妙地将“展开”和“收起”定位至文本右下角
虽然你们可能会觉得利用float
属性方式稍显“土”,但不可否认的是,它有独特的价值存在
第一步展开按钮和省略的三个点,运用伪元素即可轻松搞定!这并不难,相信大家都能够轻松驾驭。
.btn { float: right; clear: both; } .btn::before{ content: '...'; position: absolute; } .btn::after{ content:'展开' ; padding-left: 15px; }
复制
第二步要让展开按钮和省略的三个点乖乖待在右下角,确实得动动脑筋想想办法呢
为了给text文本容器添加一个伪元素,让它浮动在右边,我们尝试将高度设置为100%,结果不小心把“展开”文字挤下去了。不过别担心,我们稍微调整了下,给伪元素加了margin-bottom: -24px;
,这样“展开”文字就有空间显示啦。看,问题轻松解决!
.text::before{ content: ''; float: right; width: 0; height: 100%; margin-bottom: -24px; }
复制
margin-bottom:-12px;看一下效果
3.实现文字展开收起切换及高度调整
第一步 点击按钮更换文字
.input:checked+.text .btn::after{ content:'收起'; }
复制
第二步将text的max-height的最大高度设置为null,就可以实现基本效果
.input{ display: none; } .input:checked+.text{ max-height: none; }
复制
目前还有个问题要解决,如何在文本不到末尾时隐藏切换按钮,这里就要想点特殊的处理办法
给text添加一个伪元素,在文本后面,并将背景色设置白色,起到遮盖住‘展开收起’按钮的作用,需要注意的是,展开后需要把伪元素遮盖层隐藏,并且将省略号置为空,好了这就完成了。
.text::after { content: ''; width: 100%; height: 20px; position: absolute; transform: translateX(-11px); background: #fff; } .input:checked+.text::after{ visibility: hidden; // 不这样做收起按钮就被遮挡住了,回不去了,哈哈哈哈哈哈 } .input:checked+.text .btn::before{ content: ''; }
复制
完整代码如下
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> *{ margin: 0; padding: 0; } .wrap{ max-width: 750px; display: flex; padding: 16px; border: 1px solid rgba(0,0,0,.2); margin: 20px 100px; overflow: hidden; border-radius: 12px; box-shadow: 0 0 10px rgba(0,0,0,.2); position: relative; } .text { line-height: 1.5; max-height: 4.5em;// 这里设置的是最大高度3行,超过隐藏 overflow: hidden; } .text::before{ content: ''; float: right; width: 0; height: 100%; margin-bottom: -24px; } .text::after { content: ''; width: 100%; height: 100%; position: absolute; background-color: #fff; } .btn { float: right; clear: both; } .btn::before{ content: '...'; position: absolute; } .btn::after{ content:'展开' ; padding-left: 15px; } .input{ display: none; } .input:checked+.text{ max-height: none; } .input:checked+.text .btn::after{ content:'收起'; } .input:checked+.text::after{ visibility: hidden; } .input:checked+.text .btn::before{ content: ''; } </style> </head> <body> <div class="wrap"> <input type="checkbox" id="switch" class="input"> <div class="text"> <label class="btn" for="switch"></label> 在清晨的微光中,小镇被一层薄薄的雾气轻轻笼罩,仿佛披上了一层神秘的面纱。 街道两旁的梧桐树在微风中轻轻摇曳,发出沙沙的声响,像是在诉说着不为人知的故事。 远处,炊烟袅袅升起,带着家的温馨和生活的气息。偶尔,一阵清脆的鸟鸣划破寂静, 为这宁静的早晨增添了几分生机。人们开始陆续走出家门,迎接新的一天, 他们的脸上洋溢着期待和希望,仿佛在告诉世界,这里是一个充满活力和希望的地方。 </div> </div> </body> </html>
复制
结语
虽然看似是一个微不足道的小功能,但其背后的细节和要点却颇为丰富。
我衷心希望这次的分享能够为大家带来实质性的帮助,同时也非常期待大家能够继续提出宝贵的建议和意见,让我们在共同学习中不断进步。
感谢大家的点赞、收藏与转发,你们的支持与鼓励是我持续前行的最大动力。
另一版本请点击