193

So, I can create an input button with an image using

<INPUT type="image" src="/images/Btn.PNG" value="">

But, I can't get the same behavior using CSS. For instance, I've tried

<INPUT type="image" class="myButton" value="">

where "myButton" is defined in the CSS file as

.myButton {
    background:url(/images/Btn.PNG) no-repeat;
    cursor:pointer;
    width: 200px;
    height: 100px;
    border: none;
}

If that's all I wanted to do, I could use the original style, but I want to change the button's appearance on hover (using a myButton:hover class). I know the links are good, because I've been able to load them for a background image for other parts of the page (just as a check). I found examples on the web of how to do it using JavaScript, but I'm looking for a CSS solution.

I'm using Firefox 3.0.3 if that makes a difference.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Baltimark
  • 9,052
  • 12
  • 37
  • 35

12 Answers12

123

If you're wanting to style the button using CSS, make it a type="submit" button instead of type="image". type="image" expects a SRC, which you can't set in CSS.

Note that Safari won't let you style any button in the manner you're looking for. If you need Safari support, you'll need to place an image and have an onclick function that submits the form.

ceejayoz
  • 176,543
  • 40
  • 303
  • 368
119

You can use the <button> tag. For a submit, simply add type="submit". Then use a background image when you want the button to appear as a graphic.

Like so:

<button type="submit" style="border: 0; background: transparent">
 <img src="https://i.imgur.com/tXLqhgC.png" width="90" height="90" alt="submit" />
</button>

More info

Teocci
  • 7,189
  • 1
  • 50
  • 48
Dimitry
  • 6,545
  • 2
  • 20
  • 21
  • 21
    Just remember that IE (5,6,7, & 8 (in non-standards mode) will submit the .innerHTML of the button, not the value attribute that you set on the button! – scunliffe Oct 25 '08 at 19:46
  • But the border of the – BJ Patel Jun 16 '11 at 09:13
  • @scunlife, Dimitry in additin posting the innerHtml causes for most webservers to not accept the posted data, since it smell's like an injection attack – Cohen Apr 19 '12 at 14:24
76

div.myButton input {
  background: url(https://i.imgur.com/tXLqhgC.png) no-repeat;
  background-size: 90px;
  width: 90px;
  height: 90px;
  cursor: pointer;
  border: none;
}
<div class="myButton">
  <INPUT type="submit" name="" value="">
</div>

This will work anywhere, even in Safari.

Teocci
  • 7,189
  • 1
  • 50
  • 48
SI Web Design
  • 785
  • 5
  • 3
25

This article about CSS image replacement for submit buttons could help.

"Using this method you'll get a clickable image when style sheets are active, and a standard button when style sheets are off. The trick is to apply the image replace methods to a button tag and use it as the submit button, instead of using input.

And since button borders are erased, it's also recommendable change the button cursor to the hand shaped one used for links, since this provides a visual tip to the users."

The CSS code:

#replacement-1 {
  width: 100px;
  height: 55px;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent url(image.gif) no-repeat center top;
  text-indent: -1000em;
  cursor: pointer; /* hand-shaped cursor */
  cursor: hand; /* for IE 5.x */
}

#replacement-2 {
  width: 100px;
  height: 55px;
  padding: 55px 0 0;
  margin: 0;
  border: 0;
  background: transparent url(image.gif) no-repeat center top;
  overflow: hidden;
  cursor: pointer; /* hand-shaped cursor */
  cursor: hand; /* for IE 5.x */
}
form>#replacement-2 { /* For non-IE browsers*/
  height: 0px;
}
splattne
  • 102,760
  • 52
  • 202
  • 249
  • The problem with this method is that, if the client disables images in their browser, they don't see a button at all! – Scott Mar 24 '15 at 16:41
13

Here's a simpler solution but with no extra surrounding div:

<input type="submit" value="Submit">

The CSS uses a basic image replacement technique. For bonus points, it shows using an image sprite:

<style>
    input[type="submit"] {
        border: 0;
        background: url('sprite.png') no-repeat -40px left;
        text-indent: -9999em;
        line-height:3000;
        width: 50px;
        height: 20px;
    }
</style>

Source: http://work.arounds.org/issue/21/using-css-sprites-with-input-type-submit-buttons/

philoye
  • 2,490
  • 28
  • 23
  • I would click +2 if there was a button for this answer for the attribute CSS selector (type="submit") and recommendation for sprites – Dylan Valade Sep 07 '11 at 17:49
  • 2
    I don't control that site. Good thing I put the solution in my answer. – philoye Mar 27 '14 at 04:49
  • Last saved version of the link: https://web.archive.org/web/20140112085651/http://work.arounds.org/issue/21/using-css-sprites-with-input-type-submit-buttons – Bernhard Wagner Aug 20 '16 at 10:29
  • The link is broken (404). Perhaps update your answer to reflect this fact? But ***without*** "Edit:", "Update:", or similar - the answer should appear as if it was written today. – Peter Mortensen May 12 '21 at 19:07
3

Here is what worked for me on Internet Explorer, a slight modification to the solution by Philoye.

>#divbutton
{
    position:relative;
    top:-64px;
    left:210px;
    background: transparent url("../../images/login_go.png") no-repeat;
    line-height:3000;
    width:33px;
    height:32px;
    border:none;
    cursor:pointer;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
user545376
  • 31
  • 1
2

I think the following is the best solution:

CSS:

.edit-button {
    background-image: url(edit.png);
    background-size: 100%;
    background-repeat: no-repeat;
    width: 24px;
    height: 24px;
}

HTML:

<input class="edit-button" type="image" src="transparent.png" />
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
inf3rno
  • 24,976
  • 11
  • 115
  • 197
2

You can use blank.gif (a one-pixel transparent image) as the target in your tag:

<input type="image" src="img/blank.gif" class="button">

And then style background in CSS:

.button {border:0;background:transparent url("../img/button.png") no-repeat 0 0;}
.button:hover {background:transparent url("../img/button-hover.png") no-repeat 0 0;}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
dafyk
  • 21
  • 1
2

A variation on the previous answers:

I found that opacity needs to be set, of course this will work in Internet Explorer 6 and on. There was a problem with the line-height solution in Internet Explorer 8 where the button would not respond. And with this you get a hand cursor as well!

<div id="myButton">
    <input id="myInputButton" type="submit" name="" value="">
</div>

#myButton {
    background: url("form_send_button.gif") no-repeat;
    width: 62px;
    height: 24px;
}

#myInputButton {
    background: url("form_send_button.gif") no-repeat;
    opacity: 0;
    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
    filter: alpha(opacity=0);
    width: 67px;
    height: 26px;
    cursor: pointer;
    cursor: hand;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Reed Richards
  • 4,178
  • 8
  • 41
  • 55
1

My solution without JavaScript and without images is this:

HTML:

<input type=Submit class=continue_shopping_2
       name=Register title="Confirm Your Data!"
       value="confirm your data">

CSS:

.continue_shopping_2: hover {
    background-color: #FF9933;
    text-decoration: none;
    color: #FFFFFF;
}


.continue_shopping_2 {
    padding: 0 0 3px 0;
    cursor: pointer;
    background-color: #EC5500;
    display: block;
    text-align: center;
    margin-top: 8px;
    width: 174px;
    height: 21px;
    border-radius: 5px;
    border-width: 1px;
    border-style: solid;
    border-color: #919191;
    font-family: Verdana;
    font-size: 13px;
    font-style: normal;
    line-height: normal;
    font-weight: bold;
    color: #FFFFFF;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
John
  • 499
  • 12
  • 20
  • 2
    It's not appropriate to post random links to your website in this manner. I see no 'example' of this at all there. If you wish to make an example to show, please make one that serves as an example by itself - not in the context of a whole, live site. – Andrew Barber Nov 20 '12 at 20:21
0

Perhaps you could just import a .js file as well and have the image replacement there, in JavaScript.

0

Let's assume you can't change the input type, or even the src. You only have CSS to play with.

If you know the height you want, and you have the URL of a background image you want to use instead, you're in luck.

Set the height to zero and padding-top to the height you want. That'll shove the original image out of sight, giving you a perfectly clean space to show your CSS background-image.

It works in Chrome. I don't have any idea if it works in Internet Explorer. Barely anything clever does, so probably not.

#daft {
  height: 0;
  padding-top: 100px;
  width: 100px;
  background-image: url(clever.jpg);
}
<input type="image" src="daft.jpg" id="daft">
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131