【问题标题】:Collapse and expand elements with CSS使用 CSS 折叠和展开元素
【发布时间】:2015-04-19 12:57:14
【问题描述】:

我正在尝试构建一个加载时只有标题可见的页面,并且 当用户单击标题时,每个标题下方的表格会在隐藏和显示状态之间切换。 我的限制是只能在 CSS 中执行此操作。

这是我目前想出的:

https://jsfiddle.net/Argoron/c1ypx24c/6/

它没有按应有的方式工作,因为每次我点击一个标题时,其他标题下方的表格都被隐藏了。我想要完成的是每个部分的行为都是独立的,这意味着例如表 1 应该仅在单击标题 1 时更改其显示状态。

另外,不知道为什么在第 3 部分中显示了两个替代标题。

【问题讨论】:

  • 两个替代标题都显示在第 3 部分中,因为您将 #ThirdE 拼错为 #thirdE 。注意小写的“t”
  • @Weinz - 很好看,完全错过了那个。谢谢!

标签: html css


【解决方案1】:

我建议使用checkbox 输入和:checked 而不是a:target 标记来触发事件,因为目标会随着您点击另一个链接而改变。试试这个:

.tb {
    margin:10px 0;
}
.tb span+span, .collapsible {
    display:none;
}
.tb input[type="checkbox"]:checked ~ span {
    display:none;
}
.tb input[type="checkbox"]:checked ~ span+span{
    display:inline;
}
.tb input[type="checkbox"]:checked ~ .collapsible {
    display:table;
}
<div class="tb">
    <input type="checkbox"/>
    <span>Show</span><span>Hide</span>
    <table class="collapsible" id="collapsible1">
        <tr>
            <td>Hello 1</td>
        </tr>   
    </table>    
</div>
<div class="tb">
    <input type="checkbox"/>
    <span>Show</span><span>Hide</span>
    <table class="collapsible" id="collapsible1">
        <tr>
            <td>Hello 2</td>
        </tr>   
    </table>    
</div>
<div class="tb">
    <input type="checkbox"/>
    <span>Show</span><span>Hide</span>
    <table class="collapsible" id="collapsible1">
        <tr>
            <td>Hello 3</td>
        </tr>   
    </table>    
</div>

现在,如果您不想看到复选框,您可以使用 CSS。检查此片段

.tb {
  margin: 10px 0;
  position: relative;
}
input[type="checkbox"] {
  width: 100%;
  height: 23px;
  position: absolute;
  left: 0;
  top: 0;
  opacity: 0;
  z-index: 10;
  cursor: pointer;
}
input[type="checkbox"]:hover ~ span {
  background: black;
}
.tb span {
  position: relative;
  height: 23px;
  line-height: 23px;
  display: inline-block;
  background: red;
  color: white;
  transition: all .3s ease;
  padding: 0 10px;
  width: 100%;
}
.tb span+span,
.collapsible {
  display: none;
}
.tb input[type="checkbox"]:checked ~ span {
  display: none;
}
.tb input[type="checkbox"]:checked ~ span+span {
  display: inline-block;
}
.tb input[type="checkbox"]:checked ~ .collapsible {
  display: table;
}
<div class="tb">
  <input type="checkbox" />
  <span>Show</span><span>Hide</span>
  <table class="collapsible" id="collapsible1">
    <tr>
      <td>Hello 1</td>
    </tr>
  </table>
</div>
<div class="tb">
  <input type="checkbox" />
  <span>Show</span><span>Hide</span>
  <table class="collapsible" id="collapsible1">
    <tr>
      <td>Hello 2</td>
    </tr>
  </table>
</div>
<div class="tb">
  <input type="checkbox" />
  <span>Show</span><span>Hide</span>
  <table class="collapsible" id="collapsible1">
    <tr>
      <td>Hello 3</td>
    </tr>
  </table>
</div>

或者DemoFiddle

【讨论】:

  • 它确实按我期望的方式工作,不幸的是,在我面临这个问题的实际页面中使用复选框不是一个选项。 jsfiddle 只是问题的简化表示。
  • 所以你不能添加任何额外的元素? @Argoron 这样你发布的代码和:target 将是不可能的
  • 我可以添加额外的元素,但条件是它们与当前的“标题”元素在视觉上没有太大区别,因为我正在处理的页面是具有预定义“外观和感觉”图表。实际的标题元素看起来像一个“扁平”按钮,有点像没有阴影和圆角的 Stackoverflow 按钮。
  • 所以?用 CSS 设置样式有什么问题...检查我的第二个 sn-p 或 Fiddle @Argoron
  • 你需要的只是爱!!!您为漂亮的完全 CSS 动画下拉菜单提供了基础。谢谢!
【解决方案2】:

您的错误出现在 #FirstC:target + #First 中。你也拼错了选择器#ThirdE

https://jsfiddle.net/c1ypx24c/10/

table.collapsible {
    display: none;
}

#FirstE, #SecondE, #ThirdE {
    display: none;
}

#FirstC:target ~ #FirstE,
#SecondC:target ~ #SecondE,
#ThirdC:target ~ #ThirdE{
    display: inline;
}

#FirstC:target, 
#SecondC:target,
#ThirdC:target{
    display: none;
}

#FirstC:target ~ #collapsible1, 
#SecondC:target ~ #collapsible2,
#ThirdC:target ~ #collapsible3{
    display: inline;
}

【讨论】:

  • 不幸的是,这仍然不是我想要完成的,即点击只影响同一部分的表格。例如,当我单击标题 1 时,表 1 会展开,但是当我接下来单击标题 2 时,表 1 会再次隐藏,尽管它应该保持可见。
猜你喜欢
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 2018-12-13
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多