CSS展开收起
Published on Dec 18, 2024, with 29 view(s) and 0 comment(s)
Ai 摘要:本文展示了一个纯CSS实现的文本展开/收起功能案例。通过checkbox控制文本容器的max-height属性,结合伪元素和浮动布局实现右下角切换按钮。关键点包括:1) 使用line-clamp属性限制默认显示行数;2) 通过:checked选择器切换展开状态;3) 按钮采用浮动定位和渐变阴影优化视觉效果。注意事项:未处理短文本情况,微信小程序需改用变量替代:checked选择器。该方案无需JavaScript,仅用CSS实现响应式文本折叠功能。

Description

<div class="wrapper">
    <input id="input" type="checkbox">
    <div class="text" line-clamp="3">
        <label class="btn" for="input"></label>
        浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何定位的浮动元素是如何
    </div>
</div>
<style>
    .wrapper {
        display: flex;
        margin: 50px auto;
        max-width: 800px;
        overflow: hidden;
        border-radius: 8px;
        padding: 15px;
        box-shadow: 20px 20px 60px #bebebe,
            -20px -20px 60px #ffffff;
        line-height: 24px;
        box-sizing: border-box;
    }

    .text {
        position: relative;
        overflow: hidden;
    }

    /* 使用一个浮动的伪元素从而使浮动按钮能够置于右下角 */
    .text::before {
        content: '';
        float: right;
        width: 0px;
        height: 100%;
        margin-bottom: -24px;
    }

    /* 按钮样式 */
    .btn {
        float: right;
        clear: both;
        font-size: 16px;
        height: 24px;
        line-height: 24px;
        color: #4c8bf5;
        cursor: pointer;
        border: none;
        position: relative;
    }

    /* 属性选择器:方面设置其最大高度从而设置最多显示多少行,从而解决display: -webkit-box;的兼容性问题 */
    [line-clamp="3"] {
        max-height: 72px;
    }

    [line-clamp="5"] {
        max-height: 120px;
    }

    /* 输入框:用来表示文本的展开与收起状态 */
    #input {
        display: none;
    }

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

    /* 按钮前的阴影 */
    .text .btn::before {
        background-image: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.95) 70%, rgba(255, 255, 255, 0.95));
        content: '';
        display: block;
        position: absolute;
        width: 30px;
        height: 100%;
        left: -30px;
    }

    /* 按钮展开和收起文本切换 */
    .btn::after {
        content: '展开'
    }

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

    #input:checked+.text .btn::before {
        visibility: hidden;
    }
</style>

注意:1,没有对于文本少于最少行的情况处理。2,微信小程序中不支持input的checked选择器,可以使用定义变量处理