CSS Styling Radio Button and Checkboxes

The idea is simple. We want to change the look and feel of existing radio buttons into more of a push button. The above image pretty much tells what we want to achieve. Now we want to do this without using Javascript or JQuery. Just plain HTML and CSS. Nothing fancy. Lets dive into code.

1. The HTML

The HTML should looks pretty much like HTML. Nothing fancy here either. Just a bunch of radiobuttons following by labels.

<input type="radio" id="radio1" name="radios" value="all" checked> <label for="radio1">iPhone</label> <input type="radio" id="radio2" name="radios"value="false"> <label for="radio2">Galaxy S IV</label> <input type="radio" id="radio3" name="radios" value="true"> <label for="radio3">Nexus S</label>
Code language: HTML, XML (xml)

2. The CSS

Now the magic is in CSS. We want to change the look n feel of traditional radiobuttons into sexy pushbuttons. Before we see the CSS, lets check one important CSS selector which you might not know already. It is called Adjacent sibling selectors. The idea is to select an element next to another element using syntax E1 + E2. So if I write a CSS code like:

div + p { color: red; }
Code language: CSS (css)

This should select only those <p> elements which are adjacent (i.e. next to) <div> tags! This can come handy in lot of scenarios when you want to apply certain style to element based on their sequence. So now we got the idea and know how Adjacent selector is used, lets apply that in our problem at hand.

/* Hide radio button (the round disc) we will use just the label to create pushbutton effect */ input[type=radio] { display:none; margin:10px; } /* Change the look'n'feel of labels (which are adjacent to radiobuttons). Add some margin, padding to label */ input[type=radio] + label { display:inline-block; margin:-2px; padding: 4px 12px; background-color: #e7e7e7; border-color: #ddd; } /* Change background color for label next to checked radio button to make it look like highlighted button */ input[type=radio]:checked + label { background-image: none; background-color:#d0d0d0; }
Code language: CSS (css)

Demo

JSFiddle: http://jsfiddle.net/viralpatel/p499h/

Voilla!! That works!! Although they look different, these are basically radiobuttons at heart. You can create forms using these buttons and on submit, can handle values at server side as normal radiobuttons. No Javascript, no jquery hacks..

3. More CSS

Lets add some more style to these radiobuttons and make them look more pushbutton’ish. Style courtesy Twitter Bootstrap :D

input[type=radio] { display:none; } input[type=radio] + label { display:inline-block; margin:-2px; padding: 4px 12px; margin-bottom: 0; font-size: 14px; line-height: 20px; color: #333; text-align: center; text-shadow: 0 1px 1px rgba(255,255,255,0.75); vertical-align: middle; cursor: pointer; background-color: #f5f5f5; background-image: -moz-linear-gradient(top,#fff,#e6e6e6); background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6)); background-image: -webkit-linear-gradient(top,#fff,#e6e6e6); background-image: -o-linear-gradient(top,#fff,#e6e6e6); background-image: linear-gradient(to bottom,#fff,#e6e6e6); background-repeat: repeat-x; border: 1px solid #ccc; border-color: #e6e6e6 #e6e6e6 #bfbfbf; border-color: rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25); border-bottom-color: #b3b3b3; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); } input[type=radio]:checked + label { background-image: none; outline: 0; -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); background-color:#e0e0e0; }
Code language: CSS (css)

Demo

 JSFiddle: http://jsfiddle.net/viralpatel/p499h/

The Checkboxes

Same technique can be applied on checkboxes. Just replace type=radio with type=checkbox in above CSS and see how normal looking html checkbox changes into pushbutton checkbox.

Demo

The code is available on JSFiddle. 

Play on JSFiddle:http://jsfiddle.net/viralpatel/p499h/

View Comments

  • hey can u please tell me how to align the checkboxes in different rows with checkboxes properly match with upper row and moreover in JSP page the checkboxes data is fetched from DATABASE

  • How would you do this if the order of the [code language="html"]<input>[/code] and [code language="html"]<label>[/code] tags were in this type of structure?

    [code language="html"]
    <div id="male" class="male">
    <label for="male_0">
    <input id="male_0" value="male" type="radio" class="male_0" checked="checked" name="gender">Male
    </label>
    </div>

    <div id="female" class="female">
    <label for="female_1">
    <input id="female_1" value="female" type="radio" class="female_1" name="gender">
    Female
    </label>
    </div>
    [/code]

    Please realize that I can not change the structure of the code because it is being generated by a third party.

  • Hello,

    very nice feature, thanks very much.

    I have one little suggestion. Better than hiding radio, why don't you do this? ;-)

    [code language="css"]
    input[type=radio] {
    //display:none;
    margin:10px;
    position: absolute;
    z-index: -1;
    }
    [/code]

    Because you see, some apps need this radio to stay visible, because there can be event depencency etc.

    Great feature though, thanks! :-)

Share
Published by
Viral Patel
Tags: CSS

Recent Posts

  • Java

Java URL Encoder/Decoder Example

Java URL Encoder/Decoder Example - In this tutorial we will see how to URL encode/decode…

4 years ago
  • General

How to Show Multiple Examples in OpenAPI Spec

Show Multiple Examples in OpenAPI - OpenAPI (aka Swagger) Specifications has become a defecto standard…

4 years ago
  • General

How to Run Local WordPress using Docker

Local WordPress using Docker - Running a local WordPress development environment is crucial for testing…

4 years ago
  • Java

Create and Validate JWT Token in Java using JJWT

1. JWT Token Overview JSON Web Token (JWT) is an open standard defines a compact…

4 years ago
  • Spring Boot

Spring Boot GraphQL Subscription Realtime API

GraphQL Subscription provides a great way of building real-time API. In this tutorial we will…

5 years ago
  • Spring Boot

Spring Boot DynamoDB Integration Test using Testcontainers

1. Overview Spring Boot Webflux DynamoDB Integration tests - In this tutorial we will see…

5 years ago