首页 前端知识 CSS 实现多行文本“展开收起”

CSS 实现多行文本“展开收起”

2024-06-21 00:06:29 前端知识 前端哥 1021 291 我要收藏

前段时间,我分享了一种文本展开收起的方法,并得到了广大朋友的积极反馈。其中,有热心的朋友特别提出一个建议,希望将展开收起的按钮放置在文本末尾。为此,我进行了多次调试与尝试,终于实现了这一功能,并在此与大家分享我的成果。

在着手实现之前,我查阅了百度上众多网友的做法,发现很多人都是通过input的checked属性来控制文本的展开与收起。我也采用了这种方式。

但在此基础上,我特别注重了兼容性的处理。因为有些写法在Chrome浏览器上运行得非常好,但在Firefox浏览器上却会出现样式混乱的问题。因此,我进行了相应的调整和优化,确保在各种主流浏览器上都能呈现出良好的效果。

话不多说,上效果展示

展开收尾1.gif

具体实现步骤

1. 先搭建基础页面

image.png

<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;
}

image.png

第二步要让展开按钮和省略的三个点乖乖待在右下角,确实得动动脑筋想想办法呢

开动脑筋.png

为了给text文本容器添加一个伪元素,让它浮动在右边,我们尝试将高度设置为100%,结果不小心把“展开”文字挤下去了。不过别担心,我们稍微调整了下,给伪元素加了margin-bottom: -24px;,这样“展开”文字就有空间显示啦。看,问题轻松解决!

.text::before{
    content: '';
    float: right;
    width: 0;
    height: 100%;
    margin-bottom: -24px;
}

margin-bottom:-12px;看一下效果

image.png

重点来袭.png

3.实现文字展开收起切换及高度调整

第一步 点击按钮更换文字

.input:checked+.text .btn::after{
    content:'收起';
}

image.png

第二步将text的max-height的最大高度设置为null,就可以实现基本效果

.input{
    display: none;
}
.input:checked+.text{
    max-height: none;
}

image.png

目前还有个问题要解决,如何在文本不到末尾时隐藏切换按钮,这里就要想点特殊的处理办法

image.png
下面说重点.png

给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: '';
}

展开收尾1.gif

完整代码如下

<!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>

结语

虽然看似是一个微不足道的小功能,但其背后的细节和要点却颇为丰富。

我衷心希望这次的分享能够为大家带来实质性的帮助,同时也非常期待大家能够继续提出宝贵的建议和意见,让我们在共同学习中不断进步。

感谢大家的点赞、收藏与转发,你们的支持与鼓励是我持续前行的最大动力。

另一版本请点击

在这里插入图片描述

转载请注明出处或者链接地址:https://www.qianduange.cn//article/13084.html
标签
评论
发布的文章

JQuery中的load()、$

2024-05-10 08:05:15

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!