【问题标题】:Pure CSS collapse/expand div纯 CSS 折叠/展开 div
【发布时间】:2013-02-12 07:21:06
【问题描述】:

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

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

这是我的小提琴: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;
}

【问题讨论】:

  • 对于没有使用 wordpress 的任何人,我可以说请不要这样做。它是一种 hack,它破坏了非常烦人的页面的背面功能。

标签: css collapsable


【解决方案1】:

根据您希望支持的浏览器/设备,或者您准备忍受的不兼容浏览器,您可能需要查看&lt;summary&gt;&lt;detail&gt; 标签。他们正是为了这个目的。完全不需要 css,因为折叠和显示是标签定义/格式的一部分。

我做了一个例子here:

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

Browser support varies. 在 webkit 中尝试以获得最佳效果。其他浏览器可能默认显示所有解决方案。您或许可以回退到上述隐藏/显示方法。

【讨论】:

  • Bug 591737 是跟踪 Firefox 支持的错误。
  • 快到 2016 年年中了,不存在对此的支持。绝对不要使用这个解决方案。
  • @DigitalSea 支持“不存在”是不正确的,“绝对不要使用此解决方案”对于一个已经稳定了几年并且自 2010 年以来就有可用的 polyfill 的标准来说是强有力的词@987654324 @。你论证的依据是什么? MS edge 很可能很快就会实现这些标签 Firefox 已经实现了摘要/详细信息标签(但目前它在一个标志后面)Webkit 自 chrome 12 以来默认支持它,OS X 和 iOS Blink 衍生浏览器上的 safari 也支持它 - chrome 移动/桌面, Opera 默认支持它
  • @Thurstan 不支持; IE8、IE9、IE10、IE11、Edge 13,直到 2016 年 8 月才在 Firefox 中得到支持。所以除非你有幸完全放弃对 IE 的支持,而且目前 Edge 和 Firefox,是的,没有得到很好的支持。 polyfill 基本上完成了您已经可以使用 Javascript(没有 jQuery)并且非常有效地完成的工作。为这个易于实现自己的功能的 polyfill 是矫枉过正的。您链接的解决方案使用 jQuery,这是不必要的。如果有一天我们看到它从规范中删除,我不会感到惊讶。
  • 我只为现代浏览器开发,这种技术非常适合我的用例,不需要一点 CSS!
【解决方案2】:

使用&lt;summary&gt;&lt;details&gt;

使用&lt;summary&gt;&lt;details&gt; 元素是最简单的,但请参阅browser support,因为当前的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>

另见how to style the &lt;details&gt; element (HTML5 Doctor)(有点棘手)。

纯 CSS3

:target 选择器有一个相当不错的browser support,它可以用来在框架内制作一个单个可折叠元素。

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

【讨论】:

  • &lt;summary&gt;&lt;details&gt; 仍然不适用于所有主流浏览器。
  • @TranslucentCloud 我就是这么说的。 ;)
  • 这也是另一个答案的作者所说的。
  • 有没有办法给这个添加过渡动画?
  • 对于文本向下滑动并使用 CSS 过渡淡入的动画版本,请参阅blogpost
【解决方案3】:

@gbtimmon's answer 很棒,但是太复杂了。我已经尽可能地简化了他的代码。

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

【讨论】:

  • 这在同一页面上多次使用时不起作用:单击隐藏/显示会影响所有 div。任何人都知道如何修改它以使其在多次使用时起作用?
  • 更新:@Wernight 的 CSS 仅在下面回答(“纯 CSS3”,与此类似的 CSS,但使用类)。确实适用于同一页面上的多个 div。
  • @phhu 是的,如果您重复使用相同的 ID,它将无法正常工作。如果您将引入其他 ID 集(例如hide2show2answer2),它将起作用。还是上课,没关系。
【解决方案4】:

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

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

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

我还在常见问题解答电话中添加了一些空白以改进格式。

【讨论】:

  • 谢谢!我曾尝试过,但由于某种原因,它对我不起作用。一定有一个我从未发现的错误。
【解决方案5】:

或者一个几乎没有任何 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 选项。
  • 谢谢,这样干净多了。我们大约三分之一的潜在目标受众将使用 IE8。我正在考虑添加一些条件 CSS,它只会在加载时打开所有 div。
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2011-03-01
相关资源
最近更新 更多