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>