html - 使用 Sibling Combinator 为动态内容创建选项卡
问题描述
我的标签实现基于以下内容:
https://codepen.io/oknoblich/pen/tfjFl
在这支笔中,我们有以下结构:
<input id="tab1" type="radio" name="tabs" checked>
<label for="tab1">Codepen</label>
<input id="tab2" type="radio" name="tabs">
<label for="tab2">Dribbble</label>
<input id="tab3" type="radio" name="tabs">
<label for="tab3">Dropbox</label>
<input id="tab4" type="radio" name="tabs">
<label for="tab4">Drupal</label>
<section id="content1">
content1
</section>
<section id="content2">
content2
</section>
<section id="content3">
content3
</section>
<section id="content4">
content4
</section>
通过同级选择器可以进行制表符:
section {
display: none;
padding: 20px 0 0;
border-top: 1px solid #ddd;
}
input {
display: none;
}
label {
display: inline-block;
margin: 0 0 -1px;
padding: 15px 25px;
font-weight: 600;
text-align: center;
color: #bbb;
border: 1px solid transparent;
}
#tab1:checked ~ #content1,
#tab2:checked ~ #content2,
#tab3:checked ~ #content3,
#tab4:checked ~ #content4 {
display: block;
}
但是,我有几个“窗格”,每个都需要自己的选项卡,因此name
andid
属性是动态的。
在foreach
呈现 html 的循环中,我有这个:
<div class="tabs-container">
<input data-bind="attr:{id: 'tab1-' + factorPaneId, name: 'tabs1-' + factorPaneId}" type="radio" checked>
<label data-bind="attr:{for: 'tab1-' + factorPaneId">Description</label>
<input data-bind="attr:{id: 'tab2-' + factorPaneId, name: 'tabs2-' + factorPaneId}" type="radio" checked>
<label data-bind="attr:{for: 'tab2-' + factorPaneId">Description</label>
<section data-bind="attr:{id: 'content1-' + factorPaneId">
<p data-bind="text: factor.factorDescription"></p>
</section>
<section data-bind="attr:{id: 'content2-' + factorPaneId">
<p data-bind="text: factor.factorDescription"></p>
</section>
</div>
但我不确定如何修改 CSS 以支持这种对动态id
s 的需求。特别是这一点:
#tab1:checked ~ #content1,
#tab2:checked ~ #content2,
#tab3:checked ~ #content3,
#tab4:checked ~ #content4 {
display: block;
}
我需要某种方式说:
#tab1-*:checked ~ #content1-*{
display: block;
}
其中*
s 相等。有没有 CSS/HTML-only 解决方案?
解决方案
您还可以根据出现的顺序定位它们
*, *:before, *:after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body {
height: 100vh;
}
body {
font: 14px/1 'Open Sans', sans-serif;
color: #555;
background: #eee;
}
h1 {
padding: 50px 0;
font-weight: 400;
text-align: center;
}
p {
margin: 0 0 20px;
line-height: 1.5;
}
main {
min-width: 320px;
max-width: 800px;
padding: 50px;
margin: 0 auto;
background: #fff;
}
section {
display: none;
padding: 20px 0 0;
border-top: 1px solid #ddd;
}
input {
display: none;
}
label {
display: inline-block;
margin: 0 0 -1px;
padding: 15px 25px;
font-weight: 600;
text-align: center;
color: #bbb;
border: 1px solid transparent;
}
label:before {
font-family: fontawesome;
font-weight: normal;
margin-right: 10px;
}
label[for*='1']:before { content: '\f1cb'; }
label[for*='2']:before { content: '\f17d'; }
label[for*='3']:before { content: '\f16b'; }
label[for*='4']:before { content: '\f1a9'; }
label:hover {
color: #888;
cursor: pointer;
}
input:checked + label {
color: #555;
border: 1px solid #ddd;
border-top: 2px solid orange;
border-bottom: 1px solid #fff;
}
input:nth-of-type(1):checked ~ section:nth-of-type(1),
input:nth-of-type(2):checked ~ section:nth-of-type(2),
input:nth-of-type(3):checked ~ section:nth-of-type(3),
input:nth-of-type(4):checked ~ section:nth-of-type(4) {
display: block;
}
<h1>Responsive CSS Tabs</h1>
<main>
<input id="tab1" type="radio" name="tabs" checked>
<label for="tab1">Codepen</label>
<input id="tab2" type="radio" name="tabs">
<label for="tab2">Dribbble</label>
<input id="tab3" type="radio" name="tabs">
<label for="tab3">Dropbox</label>
<input id="tab4" type="radio" name="tabs">
<label for="tab4">Drupal</label>
<section id="content1">
<p>
Bacon ipsum dolor sit amet beef venison beef ribs kielbasa. Sausage pig leberkas, t-bone sirloin shoulder bresaola. Frankfurter rump porchetta ham. Pork belly prosciutto brisket meatloaf short ribs.
</p>
<p>
Brisket meatball turkey short loin boudin leberkas meatloaf chuck andouille pork loin pastrami spare ribs pancetta rump. Frankfurter corned beef beef tenderloin short loin meatloaf swine ground round venison.
</p>
</section>
<section id="content2">
<p>
2Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin ball tip turducken. Pork belly meatball t-bone bresaola tail filet mignon kevin turkey ribeye shank flank doner cow kielbasa shankle. Pig swine chicken hamburger, tenderloin turkey rump ball tip sirloin frankfurter meatloaf boudin brisket ham hock. Hamburger venison brisket tri-tip andouille pork belly ball tip short ribs biltong meatball chuck. Pork chop ribeye tail short ribs, beef hamburger meatball kielbasa rump corned beef porchetta landjaeger flank. Doner rump frankfurter meatball meatloaf, cow kevin pork pork loin venison fatback spare ribs salami beef ribs.
</p>
<p>
Jerky jowl pork chop tongue, kielbasa shank venison. Capicola shank pig ribeye leberkas filet mignon brisket beef kevin tenderloin porchetta. Capicola fatback venison shank kielbasa, drumstick ribeye landjaeger beef kevin tail meatball pastrami prosciutto pancetta. Tail kevin spare ribs ground round ham ham hock brisket shoulder. Corned beef tri-tip leberkas flank sausage ham hock filet mignon beef ribs pancetta turkey.
</p>
</section>
<section id="content3">
<p>
3Bacon ipsum dolor sit amet beef venison beef ribs kielbasa. Sausage pig leberkas, t-bone sirloin shoulder bresaola. Frankfurter rump porchetta ham. Pork belly prosciutto brisket meatloaf short ribs.
</p>
<p>
Brisket meatball turkey short loin boudin leberkas meatloaf chuck andouille pork loin pastrami spare ribs pancetta rump. Frankfurter corned beef beef tenderloin short loin meatloaf swine ground round venison.
</p>
</section>
<section id="content4">
<p>
4Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin ball tip turducken. Pork belly meatball t-bone bresaola tail filet mignon kevin turkey ribeye shank flank doner cow kielbasa shankle. Pig swine chicken hamburger, tenderloin turkey rump ball tip sirloin frankfurter meatloaf boudin brisket ham hock. Hamburger venison brisket tri-tip andouille pork belly ball tip short ribs biltong meatball chuck. Pork chop ribeye tail short ribs, beef hamburger meatball kielbasa rump corned beef porchetta landjaeger flank. Doner rump frankfurter meatball meatloaf, cow kevin pork pork loin venison fatback spare ribs salami beef ribs.
</p>
<p>
Jerky jowl pork chop tongue, kielbasa shank venison. Capicola shank pig ribeye leberkas filet mignon brisket beef kevin tenderloin porchetta. Capicola fatback venison shank kielbasa, drumstick ribeye landjaeger beef kevin tail meatball pastrami prosciutto pancetta. Tail kevin spare ribs ground round ham ham hock brisket shoulder. Corned beef tri-tip leberkas flank sausage ham hock filet mignon beef ribs pancetta turkey.
</p>
</section>
</main>
推荐阅读
- postgresql - 我怎样才能拥有一个数据字典以及它是如何工作的?
- powershell - 从 shell 获取结果并导出到 Excel
- c - 安装/使用 GMP 库
- c - cbmc 如何与 c 标头一起使用?
- authentication - 在 .NET 核心中使用 Azure AD 身份验证时如何指定自定义注销 URL
- python - 反向传播计算的神经网络问题
- jquery - 将 ajaxstop 与 sweetalert2 一起使用的最佳方式
- javascript - Jquery自动完成:如何防止选择重复
- c - 通过指针访问相同的结构或将结构存储在局部变量中?
- c# - MEF ImportMany 接口的第一个实现屏蔽了任何后续实现