Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firefox/Safari setting height as [specified height - padding - border] for input[type=button]

When I use the following CSS:

input[type=button] {
  background-color: white;
  border: 1px solid black;
  font-size: 15px;
  height: 20px;
  padding: 7px;
}

with this HTML:

<input type="button" value="Foo" />

I expect to see this, so the total height becomes 36px:

1px  border
7px  padding
20px content (with 15px text)
7px  padding
1px  border

But instead both Firefox 3.6 and Safari 4 show this: (Haven't tested in other browsers)

Screenshot http://labs.spiqr.nl/upload/files/1223ef9cbae3ab6e43bd1f9215ebedb157ac7b22.png

1px border
7px padding
4px content (with 15px text) => height - 2 * border - 2 * padding
7px padding
1px border

Does anyone have any idea why this happens?

(Even if it's expected behavior, what's the logic behind it?)

like image 202
Douwe Maan Avatar asked Feb 14 '10 11:02

Douwe Maan


2 Answers

Form elements have traditionally had a width/height that includes their padding/border, because they were originally implemented by browsers as OS-native UI widgets, where CSS had no influence over the decorations.

To reproduce this behaviour, Firefox and others render some form fields (select, button/input-type-button) with the CSS3 box-sizing style set to border-box, so that the width property reflects the entire rendered area width including the border and padding.

You can disable this behaviour with:

select, button {
    box-sizing: content-box;
    -moz-box-sizing: content-box;
    -webkit-box-sizing: content-box;
}

(or, which is more common for liquid form layouts where you want to use ‘100%’ width, you can set the others to border-box.)

The -browser prefixed versions have to be there to catch browsers that implemented this before the standardisation process got so far. This will be ineffective on IE6-7, though.

like image 140
bobince Avatar answered Oct 15 '22 18:10

bobince


A few things you can try:

  • Set the doctype of the document (<!DOCTYPE html>)
  • Set the input to be display:block or display: inline-block
  • Use a reset stylesheet.
like image 27
Marius Avatar answered Oct 15 '22 16:10

Marius