纯CSS折叠/展开div


91

我有一个纯CSS可折叠的div,它基于使用:targetpsuedoclass的其他人的代码。我要设置的页面是一个包含12个以上问题的页面,当您单击+按钮时,答案栏会在下面展开。我不知道如何在不编写大量额外CSS的情况下在此页面上制作多个折叠的div元素。任何人都有关于如何编写此代码的建议,以使我的CSS代码最小化?(即,所以我不必为12个以上的问题中的每一个输入一堆唯一的选择器)。

我无法使用Javascript,因为这是在不允许JS的wordpress.com网站上进行的。

这是我的jfiddle:http : //jsfiddle.net/dmarvs/94ukA/4/

<div class="FAQ">
    <a href="#hide1" class="hide" id="hide1">+</a>
    <a href="#show1" class="show" id="show1">-</a>
    <div class="question"> Question Question Question Question Question Question Question Question Question Question Question? </div>
        <div class="list">
            <p>Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer </p>
        </div>
</div>
/* source: http://www.ehow.com/how_12214447_make-collapsing-lists-java.html */

.FAQ { 
    vertical-align: top; 
    height:auto !important; 
}
.list {
    display:none; 
    height:auto;
    margin:0;
    float: left;
}
.show {
    display: none; 
}
.hide:target + .show {
    display: inline; 
}
.hide:target {
    display: none; 
}
.hide:target ~ .list {
    display:inline; 
}

/*style the (+) and (-) */
.hide, .show {
    width: 30px;
    height: 30px;
    border-radius: 30px;
    font-size: 20px;
    color: #fff;
    text-shadow: 0 1px 0 #666;
    text-align: center;
    text-decoration: none;
    box-shadow: 1px 1px 2px #000;
    background: #cccbbb;
    opacity: .95;
    margin-right: 0;
    float: left;
    margin-bottom: 25px;
}

.hide:hover, .show:hover {
    color: #eee;
    text-shadow: 0 0 1px #666;
    text-decoration: none;
    box-shadow: 0 0 4px #222 inset;
    opacity: 1;
    margin-bottom: 25px;
}

.list p{
    height:auto;
    margin:0;
}
.question {
    float: left;
    height: auto;
    width: 90%;
    line-height: 20px;
    padding-left: 20px;
    margin-bottom: 25px;
    font-style: italic;
}

6
对于任何不使用wordpress的人,我可以说“请不要这样做”。它是一个hack,它破坏了页面的后台功能,这非常烦人。
gbtimmon

Answers:


104

根据您要支持的浏览器/设备,或者准备为不兼容的浏览器准备的内容,您可能需要检出<summary>and<detail>标签。它们正是出于这个目的。完全不需要CSS,因为折叠和显示是标签定义/格式的一部分。

我在这里举了一个例子:

<details>
<summary>This is what you want to show before expanding</summary>
<p>This is where you put the details that are shown once expanded</p>
</details>

浏览器支持各不相同。尝试在Webkit中获得最佳效果。其他浏览器可能默认显示所有解决方案。您也许可以回退到上述的hide / show方法。


2
错误591737是跟踪Firefox支持的错误。
ShreevatsaR 2014年

9
快到2016年中期了,对此的支持还不存在。绝对不要使用此解决方案。
Dwayne Charrington

3
@DigitalSea支持“不存在”是不正确的,并且“绝对不使用此解决方案”是一个标准的好词,该标准已经稳定了好几年,并且自2010年以来就可以使用polyfill了。mathiasbynens.be/notes/html5-details- jQuery的。你提出论点的依据是什么?MS Edge可能会在Firefox已实现摘要/详细信息标签(但目前在标记后面)后不久实现这些标签。Webkit支持自chrome 12起的默认设置,就像OS X和iOS的Safari浏览器中的Safari一样(Chrome移动/桌面,歌剧默认支持它
Thurstan's

1
@Thurstan没有支持;IE8,IE9,IE10,IE11,Edge 13直到2016年8月才在Firefox中不受支持。因此,除非您完全放弃对IE的支持,并且目前还没有Edge和Firefox的支持,那就不能很好地支持它。实际上,polyfill可以高效地完成您使用Javascript(无需jQuery)已经可以完成的工作。这种易于实现的功能的polyfill实在是太过分了。您链接的解决方案使用jQuery,这是不必要的。如果有一天我们将其从规范中删除,我不会感到惊讶。
Dwayne Charrington

4
我仅针对现代浏览器进行开发,并且该技术非常适合我的用例,并且不需要使用CSS!
乔什·哈布达斯

39

使用<summary><details>

使用<summary><details>元素是最简单的方法,但是请参阅浏览器支持,因为当前的IE不支持它。但是,您可以进行polyfill(大多数都是基于jQuery的)。请注意,不支持的浏览器当然只会显示扩展版本,因此在某些情况下是可以接受的。

/* Optional styling */
summary::-webkit-details-marker {
  color: blue;
}
summary:focus {
  outline-style: none;
}
<details>
  <summary>Summary, caption, or legend for the content</summary>
  Content goes here.
</details>

另请参见如何设置<details>元素的样式(HTML5 Doctor)(有点棘手)。

纯CSS3

:target选择器具有相当不错的浏览器支持,它可用于在框架中制作单个可折叠元素。

.details,
.show,
.hide:target {
  display: none;
}
.hide:target + .show,
.hide:target ~ .details {
  display: block;
}
<div>
  <a id="hide1" href="#hide1" class="hide">+ Summary goes here</a>
  <a id="show1" href="#show1" class="show">- Summary goes here</a>
  <div class="details">
    Content goes here.
  </div>
</div>
<div>
  <a id="hide2" href="#hide2" class="hide">+ Summary goes here</a>
  <a id="show2" href="#show2" class="show">- Summary goes here</a>
  <div class="details">
    Content goes here.
  </div>
</div>


1
<summary>并且<details>还并不适用于所有主要的浏览器。
神经递质

4
@TranslucentCloud这就是我所说的。;)
星期六

另一个答案的作者也这样说。
Neurotransmitter

1
无论如何,要为此添加过渡动画吗?
azizj1

1
对于动画版本,其中文本使用CSS过渡向下滑动并淡入淡出,请参见此博客文章
sketchyTech

25

@gbtimmon的答案很好,但是方法太复杂了。我已尽力简化了他的代码。

#answer,
#show,
#hide:target {
    display: none; 
}

#hide:target + #show,
#hide:target ~ #answer {
    display: inherit; 
}
<a href="#hide" id="hide">Show</a>
<a href="#/" id="show">Hide</a>
<div id="answer"><p>Answer</p></div>


3
使用CSS3有时会非常有意义:-)
mrmut

在同一页面上多次使用时,此功能将无效:单击“隐藏/显示”会影响所有div。任何人都知道如何对其进行修改,以使其在多次使用时可以正常工作吗?
phhu

更新:@Wernight的CSS仅在下面回答(“纯CSS3”,与此类似,但使用类)。可以在同一页面上使用多个div。
phhu

1
@phhu是的,如果您重复使用相同的ID,它将不起作用。它会工作,如果你将推出另一组ID的(hide2show2answer2例如)。还是上课,没关系。
神经递质

22

您只需要迭代两个链接中的锚点。

<a href="#hide2" class="hide" id="hide2">+</a>
<a href="#show2" class="show" id="show2">-</a>

看到这个jsfiddle http://jsfiddle.net/eJX8z/

我还为FAQ调用添加了一些边距以改进格式。


谢谢!我已经尝试过了,但是由于某种原因,它对我不起作用。一定有一个我从未发现过的错误。
dmarvs

18

或几乎没有任何CSS的超级简单版本:)

<style>   
.faq ul li {
    display:block;
    float:left;
    padding:5px;
}

.faq ul li div {
    display:none;
}

.faq ul li div:target {
    display:block;
}


</style>


<div class="faq">
   <ul>
   <li><a href="#question1">Question 1</a>   
   <div id="question1">Answer 1 </div>
   </li>


   <li><a href="#question2">Question 2</a>
   <div id="question2">Answer 2 </div>
   </li>
   <li><a href="#question3">Question 3</a>
   <div id="question3">Answer 3 </div>
   </li>
   <li><a href="#question4">Question 4</a>
   <div id="question4">Answer 4 </div>
   </li>
   <li><a href="#question5">Question 5</a>
   <div id="question5">Answer 5 </div>
   </li>
   <li><a href="#question6">Question 6</a>
   <div id="question6">Answer 6 </div>
   </li>
   </ul>  
</div>

http://jsfiddle.net/ionko22/4sKD3/


顺便说一句,忘记了:target在IE8或更早的版本中不起作用,惊喜!而且CSS PIE对此也无济于事,因此,如果您对浏览器的兼容性感兴趣,则可能要看一下jQuery选项。
Ionko Gueorguiev

谢谢您,这样更清洁。我们约有三分之一的潜在目标受众将使用IE8。我正在考虑只添加一些条件CSS,该CSS会在加载时打开所有div。
dmarvs

我认为选项卡式界面可能是适合您的解决方案。我做过一段时间,您可以在此处下载/查看:ionko.com/index.php/work/simple-and-flexible-tabs
Ionko Gueorguiev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.