简体   繁体   English

使用同级组合器创建动态内容的选项卡

[英]Using Sibling Combinator to create tabs for dynamic content

I'm basing my tab implementation on the following: 我将标签实现基于以下内容:

https://codepen.io/oknoblich/pen/tfjFl https://codepen.io/oknoblich/pen/tfjFl

Within this pen, we have the following structure: 在这支笔中,我们具有以下结构:

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

With tabbing made possible by sibling selectors: 通过同级选择器可以进行制表:

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

However I have several "panes" that each require their own tabs, so the name and id attributes are dynamic. 但是,我有几个“窗格”,每个窗格都需要自己的标签,因此nameid属性是动态的。

Within a foreach loop that renders the html, I have this: 在呈现html的foreach循环中,我有以下内容:

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

But I'm not sure how to modify the CSS to support this need for dynamic id s. 但是我不确定如何修改CSS来支持对动态id的需求。 Specifically this bit: 具体来说:

#tab1:checked ~ #content1,
#tab2:checked ~ #content2,
#tab3:checked ~ #content3,
#tab4:checked ~ #content4 {
  display: block;
}

I need some way to say: 我需要说些什么:

#tab1-*:checked ~ #content1-*{
  display: block;
}

Where the * s are equal. * s相等的地方。 Is there a CSS/HTML-only solution to this? 是否有针对此的CSS / HTML解决方案?

You could maybe try using the CSS attribute starts with selector ( ^= ) for the id . 您也许可以尝试使用以选择符( ^= )开头的CSS属性作为id

Like this: 像这样:

[id^="tab1"]:checked ~ [id^="content1"],
[id^="tab2"]:checked ~ [id^="content2"],
[id^="tab3"]:checked ~ [id^="content3"],
[id^="tab4"]:checked ~ [id^="content4"] {
  display: block;
}

Here is an updated CodePen . 这是更新的CodePen

You can also target them based in the order of ocurrence 您还可以根据出现的顺序来定位它们

 *, *: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> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM