I initially had some tabs created with radio buttons and labels which are linked to corresponding divs using their IDs and was working fine. But the problem is I am now creating the radio button tabs and their corresponding divs dynamically and wish to still allow my css to know which one should be open when a radio button is checked.
My CSS:
#tab-1:checked~.content #content-1, #tab-2:checked~.content #content-2, #tab-3:checked~.content #content-3, #tab-4:checked~.content #content-4, #tab-4:checked~.content #content-5 { display: block; }
With the above initially, when the radio button with id of tab-1
is checked, the div with id of content-1
is displayed but right now this will no longer work for me as I am now creating the radio buttons dynamically using incoming IDs from my DB like: #tab-100, #tab-101, #tab-102
and the divs as well #content-100, #content-101, #content-102
. I need my CSS to be dynamic as well so when #tab-100
is checked, it automatically displays #content-100
. I am aware I can do this with javascript but I want to believe that there is a way to do it with CSS.
Advertisement
Answer
I later resorted to using javascript and dynamically created a style element.
HTML:
<input type="radio" id="tab-231" class="tab" name="number" value="first"><label for="tab-231">First</label><br> <input type="radio" id="tab-232" class="tab" name="number" value="second"><label for="tab-232">Second</label><br> <input type="radio" id="tab-233" class="tab" name="number" value="third"><label for="tab-233">Third</label><br> <div class="tab-content" class="tabs">First content</div> <div class="tab-content" class="tabs">Second content</div> <div class="tab-content" class="tabs">Third content</div>
JS:
const tabs = $('.tabs') //getting all the inputs with class tab let css = ''; //dynamically select the tab elements for ( const tab of tabs ) { const split = tab.id.split('-'); const id = split[split.length - 1]; css += ` #tab-${id}:checked~.content #content-${id}, `; } css = css.trim().slice(0, -1) //make sure to remove the trailing ',' in the css text css += ` { display: block; } `; //create style element and append to document head const style = document.createElement('style'); document.head.appendChild(style); if (style.styleSheet) style.styleSheet.cssText = css; else style.appendChild(document.createTextNode(css));
this answer was helpful.