JSFiddle - React, Tailwind, and code Playground
HTML
<fieldset>
<legend>Radio Control Quality</legend>
<label for="accessible">
<input type="radio" value="accessible" name="quality" id="accessible"> <span>accessible</span>
</label>
<label for="pretty">
<input type="radio" value="pretty" name="quality" id="pretty"> <span>pretty</span>
</label>
<label for="accessible-and-pretty">
<input type="radio" value="pretty" name="quality" id="accessible-and-pretty" checked> <span>accessible and pretty</span>
</label>
</fieldset>
<p class="p">Demo by Heydon Pickering. <a href="http://www.sitepoint.com">See article</a>.</p>
CSS
/* HTML5 Boilerplate accessible hidden styles */
[type="radio"] {
border: 0;
clip: rect(0 0 0 0);
height: 1px; margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/* One radio button per line */
label {
display: block;
cursor: pointer;
line-height: 18px;
font-size: 1em;
}
[type="radio"] + span {
display: block;
}
/* the basic, unchecked style */
[type="radio"] + span:before {
content: '\2714';
color:white;
display: inline-block;
width: 1em;
height: 1em;
vertical-align: 18px;
border-radius: 1em;
border: 0.125em solid #fff;
box-shadow: 0 0 0 0.15em #000;
margin-right: 0.75em;
transition: 0.5s ease all;
}
/* the checked style using the :checked pseudo class */
[type="radio"]:checked + span:before {
background: blue;
box-shadow: 0 0 0 0.25em #000;
}
/* never forget focus styling */
[type="radio"]:focus + span:after {
content: '\2714';
font-size: 1em;
line-height: 1;
vertical-align: -0.125em;
}
/* Nothing to see here. */
body {
margin: 3em auto;
max-width: 30em;
font-family: Cabin, serif;
}
fieldset {
font-size: 1em;
border: 2px solid #000;
padding: 2em;
border-radius: 0.5em;
}
legend {
color: #fff;
background: #000;
padding: 0.25em 1em;
border-radius: 1em;
}
.p {
text-align: center;
font-size: 14px;
padding-top: 120px;
}