Es ist relativ kompliziert einen Radio-Button bzw. eine Checkbox mit CSS zu stylen, aber mit Hilfe von JavaScript trotzdem kein Problem.
Das folgende Beispiel lässt sich dennoch gut einbauen und benötigt lediglich die Standard jQuery-Library.
Zuerst das HTML:
<form action="css-radio-demo.html" method="post"> <div> <label for="foo"> <span class="styled"><input type="radio" name="radiotest" id="foo" value="Foo" checked/></span> Foo </label> <label for="bar"> <span class="styled"><input type="radio" name="radiotest" id="bar" value="Bar"/></span> Bar </label> </div> <br/> <button type="submit">Absenden</button> </form> |
Um den Radio-Button kommt noch ein span-Tag mit der Klasse styled. Auf Grundlage dieser Klasse wird das folgende CSS und JavaScript aufgebaut.
Ebenfalls sehr wichtig ist der Label-Tag, damit der Browser den später versteckten original Radio-Button immer noch anwählen kann. Bitte beachten: Wenn das Label-Feld nicht um das input-Feld gelegt wurde, müssen das for-Attribut und die ID des Input-Elements identisch sein.
Der CSS-Code:
.styled { background: url(radio-sprite.png) 0 0 no-repeat scroll transparent; display: inline-block; vertical-align: middle; width: 32px; height: 32px; cursor: pointer; } .styled.checked { background-position: 0 -32px; } .styled input { position: absolute; z-index: -1; } |
Das span mit der Klasse styled bekommt ein austauschbares Hintergrundbild (dies sollte der gestylte Radio-Button sein) und das eigentliche input-Element wird versteckt. Mit absoluter Positionierung und einem negativen z-index wird das input-Element einfach unter dem übergeordneten Elementen platziert. Damit ist der Radio-Button zwar noch da, wird aber nicht mehr angezeigt und genau das ist wichtig, damit die Funktion des Elements für das Formular weiterhin gegeben ist.
Dazu kommt noch eine checked-Klasse mit der das Hintergrundbild bei einem angewählten Radio-Button geändert wird.
Der JavaScript-Code:
$(document).ready(function() { $(".styled input:checked").parent().addClass("checked"); $(document).on("change", ".styled input", function() { var $this = $(this); var form = $this.closest("form"); form.find("input[name='"+$this.attr("name")+"']").parent().removeClass("checked"); $this.parent().addClass("checked"); }); }); |
Mit dem ersten Befehl (Zeile 2), wird die checked-Klasse hinzugefügt, wenn der Radio-Button bereits vorausgewählt wurde. In dem darauffolgenden Codeblock wird ein neues onchange-Event auf das Input-Element gelegt, das die checked-Klassen entfernt bzw. bei dem neu ausgewählten Element hinzufügt.
Und hier geht’s zur Demo:
CSS Radio-Button Demo
Die Demo funktioniert übrigens in allen Browsern (sogar im IE6, wenn man gif-Bilder statt PNG verwendet).