I believe the best way is to wrap the radio / checkbox in a span, div (whatever) then have a label with the for attribute linking to the id of the input.
Then hiding the input using visibility:hidden and styling the label however you would like. (Note you can have multiple labels for one input).
You can use a before or after to add the check marks.
.styled-radio {
visibility:hidden;
position:absolute;
z-index:-2;
}
.styled-radio-label {
border:1px solid #ccc;
height:15px;
width:15px;
position:relative;
}
.styled-radio:checked + .styled-radio-label:after {
content:'\2713';
position:absolute;
left:50%;
top:50%;
transform:translateY(-50%) translateX(-50%);
}
label {
display:inline-block;
vertical-align:middle;
}
<span>
<input type='radio' id='html' value='html' class='styled-radio' name='lang'/>
<label for='html' class='styled-radio-label'></label>
<label for='html'>HTML</label>
</span>
<span>
<input type='radio' id='css' value='css' class='styled-radio' name='lang'/>
<label for='css' class='styled-radio-label'></label>
<label for='css'>CSS</label>
</span>
<span>
<input type='radio' id='JS' value='JS' class='styled-radio' name='lang'/>
<label for='JS' class='styled-radio-label'></label>
<label for='JS'>JS</label>
</span>