This is, with caveats, possible entirely in CSS:
/* styling the <div> element with a class of "a",
the 'default' state and the state in which
one of the <input> elements are checked: */
div.a,
input:checked~div.a {
display: block;
}
/* styling the <div> element with the class of 'b',
and also the <div> element with the class of 'a'
when it's preceded by two <input> elements that
are checked: */
div.b,
input:checked~input:checked~div.a {
display: none;
}
/* finally we show the <div> with a class of 'b'
when it's preceded by two <input> elements
both of which are checked: */
input:checked~input:checked~div.b {
display: block;
}
div.a,
input:checked~div.a {
display: block;
}
div.b,
input:checked~input:checked~div.a {
display: none;
}
input:checked~input:checked~div.b {
display: block;
}
<input class="iput" type="checkbox" name="E33" value="33" stock="20" />
<input class="iput" type="checkbox" name="E34" value="33" stock="6" />
<input class="iput" type="checkbox" name="E646" value="33" stock="7" />
<input class="iput" type="checkbox" name="E46" value="33" stock="7" />
<input class="iput" type="checkbox" name="E626" value="33" stock="7" />
<input class="iput" type="checkbox" name="E656" value="33" stock="7" />
<div class="a"> Hello </div>
<div class="b"> BYE </div>
JS Fiddle demo.
With the CSS above I've used the tilde (~
) operator, the general-sibling combinator; this selects a following sibling element. The selector:
`input:checked ~ input:checked ~ div.b`
will match div.b
if two, or more, <input>
elements are checked.
This approach works. But, on to the caveats: if there are multiple groups of radio-buttons each group followed by the <div>
elements, checking <input>
elements in the first group – by virtue of the ~
combinator – will also select, and style, the <div>
elements in the second group:
div.a,
input:checked~div.a {
display: block;
}
div.b,
input:checked~input:checked~div.a {
display: none;
}
input:checked~input:checked~div.b {
display: block;
}
<input class="iput" type="checkbox" name="E33" value="33" stock="20" />
<input class="iput" type="checkbox" name="E34" value="33" stock="6" />
<input class="iput" type="checkbox" name="E646" value="33" stock="7" />
<input class="iput" type="checkbox" name="E46" value="33" stock="7" />
<input class="iput" type="checkbox" name="E626" value="33" stock="7" />
<input class="iput" type="checkbox" name="E656" value="33" stock="7" />
<div class="a"> Hello </div>
<div class="b"> BYE </div>
<input class="iput" type="checkbox" name="E33" value="33" stock="20" />
<input class="iput" type="checkbox" name="E34" value="33" stock="6" />
<input class="iput" type="checkbox" name="E646" value="33" stock="7" />
<input class="iput" type="checkbox" name="E46" value="33" stock="7" />
<input class="iput" type="checkbox" name="E626" value="33" stock="7" />
<input class="iput" type="checkbox" name="E656" value="33" stock="7" />
<div class="a"> Hello </div>
<div class="b"> BYE </div>
JS Fiddle demo.
To prevent this each of the 'groups' must be wrapped in an element to prevent the general-sibling combinator from matching elements in subsequent groups:
div.a,
input:checked~div.a {
display: block;
}
div.b,
input:checked~input:checked~div.a {
display: none;
}
input:checked~input:checked~div.b {
display: block;
}
<div>
<input class="iput" type="checkbox" name="E33" value="33" stock="20" />
<input class="iput" type="checkbox" name="E34" value="33" stock="6" />
<input class="iput" type="checkbox" name="E646" value="33" stock="7" />
<input class="iput" type="checkbox" name="E46" value="33" stock="7" />
<input class="iput" type="checkbox" name="E626" value="33" stock="7" />
<input class="iput" type="checkbox" name="E656" value="33" stock="7" />
<div class="a"> Hello </div>
<div class="b"> BYE </div>
</div>
<div>
<input class="iput" type="checkbox" name="E33" value="33" stock="20" />
<input class="iput" type="checkbox" name="E34" value="33" stock="6" />
<input class="iput" type="checkbox" name="E646" value="33" stock="7" />
<input class="iput" type="checkbox" name="E46" value="33" stock="7" />
<input class="iput" type="checkbox" name="E626" value="33" stock="7" />
<input class="iput" type="checkbox" name="E656" value="33" stock="7" />
<div class="a"> Hello </div>
<div class="b"> BYE </div>
</div>
JS Fiddle demo.
Further, a common UI approach for <input>
elements is to wrap them in a <label>
element in order for a click on the text/content of the <label>
to check/uncheck the check-box.
If these check-boxes are wrapped in a <label>
then, predictably, the general-sibling combinator will be unable to select the <div>
elements based on the state of the <input>
elements (see: "Is there a CSS parent selector?"). <label>
elements can, of course, appear as siblings (or any other relationship) to the <input>
elements; although this requires that each <input>
with a <label>
in the document must have an id
property in order for an association to be formed:
label {
display: inline-block;
width: 1.4em;
height: 1.4em;
text-align: center;
line-height: 1.4em;
box-shadow: 0 0 0 1px #000;
border-radius: 0.2em;
cursor: pointer;
margin: 0 0.2em;
}
div.a,
input:checked~div.a {
display: block;
}
div.b,
input:checked~input:checked~div.a {
display: none;
}
input:checked~input:checked~div.b {
display: block;
}
<form>
<fieldset>
<legend>All the labels</legend>
<fieldset>
<legend>One</legend>
<label for="a">a</label>
<label for="b">b</label>
<label for="c">c</label>
<label for="d">d</label>
<label for="e">e</label>
<label for="f">f</label>
</fieldset>
<fieldset>
<legend>Two</legend>
<label for="g">g</label>
<label for="h">h</label>
<label for="i">i</label>
<label for="j">j</label>
<label for="k">k</label>
<label for="l">l</label>
</fieldset>
</fieldset>
<fieldset>
<legend>Group 1</legend>
<input class="iput" type="checkbox" name="E33" value="33" stock="20" id="a">
<input class="iput" type="checkbox" name="E34" value="33" stock="6" id="b">
<input class="iput" type="checkbox" name="E646" value="33" stock="7" id="c">
<input class="iput" type="checkbox" name="E46" value="33" stock="7" id="d">
<input class="iput" type="checkbox" name="E626" value="33" stock="7" id="e">
<input class="iput" type="checkbox" name="E656" value="33" stock="7" id="f">
<div class="a"> Hello </div>
<div class="b"> BYE </div>
</fieldset>
<fieldset>
<legend>Group 2</legend>
<input class="iput" type="checkbox" name="E33" value="33" stock="20" id="g">
<input class="iput" type="checkbox" name="E34" value="33" stock="6" id="h">
<input class="iput" type="checkbox" name="E646" value="33" stock="7" id="i">
<input class="iput" type="checkbox" name="E46" value="33" stock="7" id="j">
<input class="iput" type="checkbox" name="E626" value="33" stock="7" id="k">
<input class="iput" type="checkbox" name="E656" value="33" stock="7" id="l">
<div class="a"> Hello </div>
<div class="b"> BYE </div>
</fieldset>
</form>
JS Fiddle demo.
More sensibly, and to allow styling of those <label>
elements to reflect the styling of the checked/unchecked nature of the <input>
elements they would follow the elements (although it's perfectly valid to associate one <input>
with multiple <label>
elements, and in this demo I'm leaving the badly-placed original group in place to demonstrate that multiple <label>
elements associated with a single <input>
works):
label {
display: inline-block;
width: 1.4em;
height: 1.4em;
text-align: center;
line-height: 1.4em;
box-shadow: 0 0 0 1px #000;
border-radius: 0.2em;
cursor: pointer;
margin: 0 0.2em;
}
/* styling the <label> adjacent to an <input>: */
input+label {
color: #000;
background-color: #fff;
}
/* styling the <label> adjacent to a checked <input>: */
input:checked+label {
color: #fff;
background-color: limegreen;
}
div.a,
input:checked~div.a {
display: block;
}
div.b,
input:checked~input:checked~div.a {
display: none;
}
input:checked~input:checked~div.b {
display: block;
}
<form>
<fieldset>
<legend>All the labels</legend>
<fieldset>
<legend>One</legend>
<label for="a">a</label>
<label for="b">b</label>
<label for="c">c</label>
<label for="d">d</label>
<label for="e">e</label>
<label for="f">f</label>
</fieldset>
<fieldset>
<legend>Two</legend>
<label for="g">g</label>
<label for="h">h</label>
<label for="i">i</label>
<label for="j">j</label>
<label for="k">k</label>
<label for="l">l</label>
</fieldset>
</fieldset>
<fieldset>
<legend>Group 1</legend>
<input class="iput" type="checkbox" name="E33" value="33" stock="20" id="a"><label for="a">a</label>
<input class="iput" type="checkbox" name="E34" value="33" stock="6" id="b"><label for="b">b</label>
<input class="iput" type="checkbox" name="E646" value="33" stock="7" id="c"><label for="c">c</label>
<input class="iput" type="checkbox" name="E46" value="33" stock="7" id="d"><label for="d">d</label>
<input class="iput" type="checkbox" name="E626" value="33" stock="7" id="e"><label for="e">e</label>
<input class="iput" type="checkbox" name="E656" value="33" stock="7" id="f"><label for="f">f</label>
<div class="a"> Hello </div>
<div class="b"> BYE </div>
</fieldset>
<fieldset>
<legend>Group 2</legend>
<input class="iput" type="checkbox" name="E33" value="33" stock="20" id="g"><label for="g">g</label>
<input class="iput" type="checkbox" name="E34" value="33" stock="6" id="h"><label for="h">h</label>
<input class="iput" type="checkbox" name="E646" value="33" stock="7" id="i"><label for="i">i</label>
<input class="iput" type="checkbox" name="E46" value="33" stock="7" id="j"><label for="j">j</label>
<input class="iput" type="checkbox" name="E626" value="33" stock="7" id="k"><label for="k">k</label>
<input class="iput" type="checkbox" name="E656" value="33" stock="7" id="l"><label for="l">l</label>
<div class="a"> Hello </div>
<div class="b"> BYE </div>
</fieldset>
</form>
JS Fiddle demo.
References: