本网站只能被运行在支持JavaScript脚本的环境中

使用CSS 3制作手风琴面板

本文介绍如何只依靠CSS 3(不使用任何JavaScript代码)来制作手风琴面板,当用户展开或折叠面板时,将显示一个动画展开或动画折叠特效。

要制作一个手风琴面板,我们主要需要使用到元素的显示与隐藏特性,以及CSS 3中的:target伪类选择器。

页面HTML代码

在页面中,我们将使用一些复选框(input type="checkbox"),用于展开或折叠手风琴面板。当用户选取复选框时,展开手风琴面板,当用户取消选取复选框时,折叠手风琴面板。使用一个容器元素来容纳所有的手风琴面板,该容器元素使用ac-container样式类。在制作每一个手风琴面板时,我们需要使用到一个复选框,一个label元素及一个article元素,用于放置手风琴面板中的显示内容。

<section class="ac-container">
    <div>
        <input id="ac-1" name="accordion-1" type="checkbox" />
        <label for="ac-1">标题一</label>
        <article class="ac">
            <p>示例内容一...</p>
        </article>
    </div>
    <div>
        <input id="ac-2" name="accordion-1" type="checkbox" checked />
        <label for="ac-2">标题二</label>
        <article class="ac">
            <p>示例内容二... </p>
        </article>
    </div>
    <div><!--其他手风琴面板代码略--></div>
</section>

请注意,我们需要为每一个复选框指定一个id,并且将每一个手风琴面板中的label元素的for属性指定为该手风琴面板中的复选框id。

每个article都需要使用一个样式类,该样式类帮助我们决定将手风琴面板展开后的高度。

CSS 3样式代码

为了代码简洁明了起见,本文中在介绍CSS 3样式代码的时候,全部省略浏览器供应商前缀。在实际代码的书写过程中,你需要为不同的浏览器添加使用不同的浏览器供应商前缀。

首先,我们需要设定手风琴面板的宽度并使其居中显示。

.ac-container{
    width: 400px;
    margin: 10px auto 30px auto;
}

接下来,我们通过对label元素使用背景渐变色来使其看起来更像一个可被点击的按钮,通过多个盒阴影的使用,我们创建了边框及嵌入效果,我们同时将z-index属性值设置为20,以确保它始终处于手风琴面板的前端。

.ac-container label{
    padding: 5px 20px;
    position: relative;
    z-index: 20;
    display: block;
    height: 30px;
    cursor: pointer;
    color: #777;
    text-shadow: 1px 1px 1px rgba(255,255,255,0.8);
    line-height: 33px;
    font-size: 19px;
    background: linear-gradient(top, #ffffff 1%,#eaeaea 100%);
    box-shadow: 
        0px 0px 0px 1px rgba(155,155,155,0.3), 
        1px 0px 0px 0px rgba(255,255,255,0.9) inset, 
        0px 2px 2px rgba(0,0,0,0.1);
}

当label元素获取焦点时,我们使其变为白色。

.ac-container label:hover{
    background: #fff;
}

当用户点击一个label元素时,将复选框设为选取状态,同时为该label元素设置“选取”样式。

.ac-container input:checked + label,
.ac-container input:checked + label:hover{
    background: #c6e1ec;
    color: #3d7489;
    text-shadow: 0px 1px 1px rgba(255,255,255, 0.6);
    box-shadow: 
        0px 0px 0px 1px rgba(155,155,155,0.3), 
        0px 2px 2px rgba(0,0,0,0.1);
}

接下来,让我们添加指定一个元素获得焦点时所显示的向下箭头图标。由于我们简单使用after伪类选择器,所以我们不需将其书写在页面中。

.ac-container label:hover:after,
.ac-container input:checked + label:hover:after{
    content: '';
    position: absolute;
    width: 24px;
    height: 24px;
    right: 13px;
    top: 7px;
    background: transparent url(../images/arrow_down.png) no-repeat center center;  
}

当获取焦点的元素为“处于选取状态”的元素时,我们需要显示向上箭头。

.ac-container input:checked + label:hover:after{
    background-image: url(../images/arrow_up.png);
}

由于我们不想显示复选框,所以我们需要将它隐藏起来。

.ac-container input{
    display: none;
}

手风琴面板的内容区的初始高度应该为0,overflow属性值应该被设置为hidden。另外,我们需要为内容区的高度及盒阴影变化使用一个transaction动画。由于在面板展开与折叠时都需要使用动画,所以要分别使用两个transaction动画。

ac-container article{
    background: rgba(255, 255, 255, 0.5);
    margin-top: -1px;
    overflow: hidden;
    height: 0px;
    position: relative;
    z-index: 10;
    transition: 
        height 0.3s ease-in-out, 
        box-shadow 0.6s linear;
}
.ac-container input:checked ~ article{
    transition: 
        height 0.5s ease-in-out, 
        box-shadow 0.1s linear;
    box-shadow: 0px 0px 0px 1px rgba(155,155,155,0.3);
}

同时我们需要指定内容展示区所使用的样式:

.ac-container article p{
    color: #777;
    line-height: 23px;
    font-size: 14px;
    padding: 20px;
    text-shadow: 1px 1px 1px rgba(255,255,255,0.8);
}

实际运行结果

正文一.

正文二

正文三

正文四