纯CSS+HTML实现抽屉展开隐藏并有过渡动画

1,941 阅读2分钟

实现方案

隐藏抽屉

通过css属性translateleft设置为大于抽屉宽度的负值,使抽屉元素的位置在视窗之外。 为确保元素不可见,还可以设置visibility: hiddenopacity: 0使其完全不可见。

隐藏方法

  1. 通过一个和抽屉(class为drawer)同父的隐藏的checkbox(id为demo_show_check)z记录状态,通过label包裹的作为切换按钮。
<div id="demo">
    <input type="checkbox" id="demo_show_check" style="display: none;"/>
    <div class="show">
        <label for="demo_show_check"></label>
    </div>
    <div class="drawer">
        <h3>DrawerDemo</h3>
    </div>
</div>
  1. 设置抽屉的css,zIndex必须高于其他元素,保证其显示在最上面。
.drawer{
    display: flex;
    flex-direction: column;
    position: fixed;
    flex: 1 1 auto;
    top: 0;
    left: 0;
    width: 180px;
    z-index: 300;
}
.show {
    position: fixed;
    z-index: 301;
    top: 0;
    left: 175px;
    transition: all 1.2s;
}
  1. 设置抽屉和切换按钮的css过渡动画时间,二者的时间尽量一致,保证同步左移或右移。
.show {
    transition: all 1.2s;
}
.drawer {
    transition: all 1.2s;
}
  1. 通过css:checked选择器结合兄弟节点选择器控制抽屉的css。当checkbox被选中时设置translate属性为大于抽屉宽度的负值,并设置透明度为0以达到抽屉收缩的目的;当checkbox未选中时该css不起作用,抽屉将正常展示。同时切换按钮也同步移动并翻转
#demo_show_check:checked ~ .drawer {
    translate: -200px;
    visibility: hidden;
    opacity: 0;
}
#demo_show_check:checked ~ .show {
    left:0;
    transform: rotateY(180deg);
}

完整代码

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>纯CSS+HTML实现抽屉展开隐藏</title>
    <style>
        #demo .drawer{
            display: flex;
            flex-direction: column;
            position: fixed;
            flex: 1 1 auto;
            top: 0;
            left: 0;
            word-wrap: break-word;
            background-color: #ffffff78;
            background-clip: border-box;
            border-radius: .25rem;
            width: 180px;
            height: auto;
            border-width: 0;
            box-shadow: 0 2px 6px 0 rgba(114, 124, 245, .5);
            padding: 4px 4px 8px 4px;
            z-index: 300;
        }
        #demo .show {
            position: fixed;
            z-index: 301;
            top: 0;
            left: 175px;
            transition: all 1.2s;
            color: chocolate;
        }
        #demo .show label{
            height: 1em;
        }
        #demo_show_check:checked ~ .show {
            left:0;
            transform: rotateY(180deg);
        }
        #demo_show_check:checked ~ .drawer {
            translate: -200px;
            visibility: hidden;
            opacity: 0;
        }
        #demo_show_check {
            display: none;
        }
        #demo .drawer {
            transition: all 1.2s;
        }
        body {
            background:linear-gradient(bisque,burlywood);
            height: 100vh;
            max-height: 100%;
            margin: 0;
        }
    </style>
</head>
<body>
    <div id="demo">
        <input type="checkbox" id="demo_show_check"/>
        <div class="show">
            <label for="demo_show_check"></label>
        </div>
        <div class="drawer">
            <h3>DrawerDemo</h3>
            <ul style="padding-left: 22px;">
                <li>通过<code>#demo_show_check</code>的选中状态控制显示隐藏。</li>
                <li>当选中时,使<code>.drawer</code>左移到屏幕外隐藏。</li>
            </ul>
        </div>
    </div>
</body>
</html>

演示