Not particularly liking the standard 'submit' and 'reset' buttons I recently decided to add image buttons on a site I've just finished. I wanted a rollover effect on the buttons, so of course that meant a little bit of javascript. No problem, I can live with a bit of well placed js where it's useful...the only problem was that while I was still feeling pretty pleased with my new pretty page, I realised that I had a major accessibility problem because if javascript wasn't enabled then precisely nothing would happen when the buttons were pressed....
...enter the lovely pure CSS (nearly) image button rollover!

This is the (x)html:
<form method="post" action="" class="contactForm">
<fieldset>
<label for="txtInp_txt_name_id0">Name:</label><br />
<input type="text" id="txtInp_txt_name_id0" name="txt_name" alt="Enter your name here" title="Text input: Name" size="50" /><span class="required"> * required</span> <br />
<label for="txtInp_txt_email_id0">Email:</label><br />
<input type="text" id="txtInp_txt_email_id0" name="txt_email" alt="Enter your email address here (required)" title="Text input: Email (required)" size="50" /><span class="required"> * required</span><br />
<label for="txtAr_textarea_enquiry_id0">Your message:</label><br />
<textarea id="txtAr_textarea_enquiry_id0" name="textarea_enquiry" cols="35" rows="6" title="Textarea: your enquiry"></textarea><br />
<!-- this is the clever bit with the button -->
<p style="display: none;"><input alt="Send the form" class="send-btn" type="submit" value="Send the form" src="btn.gif" /></p>
<p><input alt="Send the form" class="send-btn" type="image" src="btn.gif" onmouseover='this.classname=on' onmouseout='this.classname=off' /></p>
<p><a href="" type="reset">Clear the form</a></p>
</fieldset>
</form>
And here's the CSS:
input.send-btn {
width: 127px;
height: 22px;
background: #F7F7F7 url(sendbutton.gif) no-repeat;
border: 0;
outline: none;
}
input.send-btn:hover {
background: #F7F7F7 url(sendbutton.gif) no-repeat 0 -22px;
border: 0;
}
.on {background: url(clear_hover.gif);}
.off {background: url(clear_normal.gif);}
and
here's a basic form using the technique.
Of course the only problem with this method is that an input type "image" will always submit a form, so you need to use a workaround or a hyperlink (I stuck with the hyperlink because I was using this method precisely to get away from relying on javascript, so I didn't want to reintroduce more). There's also a problem in that you don't get the rollover on naughty < IE7 because it doesn't recognise the :hover attribute, but using the little snippet of js that doesn't affect the submission of the form gets round the problem.
This is the site where I got the code from, which also explains how the technique works.