100% -ная ширина при вводе типа ввода и текст типа ввода

У меня есть форма входа в систему, в которой текстовые поля и кнопка отправки растягиваются до 100% размера контейнера. Это для гибкой мобильной компоновки, но мой пример jsbin ниже имеет фиксированный размер контейнера для демонстрационных целей.

http://jsbin.com/ozutoq/9

В IE7, IE8, FF 4, Safari - все отображают кнопку отправки немного короче, чем текстовые поля. Инструмент компоновки Firebug показывает текстовые поля шириной 500 пикселей, а кнопка отправки - 498 пикселей. В моем реальном примере кнопка отправки 6px skinnier. Как я могу исправить это, чтобы он занимал всю ширину?

Обновление

Я сделал еще один тест, установив фиксированную ширину на входах. Кажется, что кнопка отправки не соответствует модели окна. Я использовал ширину 100 пикселей, и он показал 98px + 2px для границ, в то время как текстовые поля отображали ширину 100px + 2px для границ.

Итак, я думаю, вопрос в том, как я могу справиться с этим в жидком макете? -1px правое и левое дополнение на кнопках, похоже, не работает, и дизайн требует 1px границы на кнопке! Придется ли мне прибегать к js?

Ответы

Ответ 1

По какой-то причине mozilla устанавливает входы текста типа в -moz-box-sizing:content-box;, но кнопка отправки имеет значение -moz-box-sizing:border-box;

Настройка следующего даст вам предполагаемый рендеринг в FF.

.login-tb {
    border:1px solid red; 
    -moz-box-sizing:border-box;
    -webkit-box-sizing:border-box;
    box-sizing:border-box;
    margin: 0;
    padding: 0;
    width:100%; 
}

Update: Добавлена ​​поддержка Safari и IE8 +.

Ответ 2

Я считаю, что браузер вычисляет размеры ввода [type = submit]. Я попытался применить некоторые сбрасывания, но они тоже не работали. Я работаю на Macbook Air с Chrome и на вашем примере JSBin, просмотр в реальном времени выглядел отлично, но "Render" подтвердил вашу проблему.

Я попробовал jsfiddle.net, и он показал ту же проблему. Здесь обходной путь, если это будет летать для вашего приложения. Просто удалите границу и фон из кнопки отправки и создайте вместо этого оболочку div, затем добавьте прослушиватель кликов в div, чтобы отправить форму:

CSS

form { 
    width: 500px; 
    padding:0; 
    margin:0;
}
form div, form div input {
    height:20px;
    margin-bottom:4px;
}
input[type=text] { 
    width: 100%; 
    border: 1px solid red; 
    padding: 0; 
    margin: 0; 
}
#submit input{
    background:transparent; 
    margin:auto; 
    border:none;
}
#submit{ 
    text-align:center; 
    background-color:#CCC; 
    width: 100%; 
    border: 1px solid red; 
    padding: 0; 
    margin: 0;
    cursor:pointer;
} 

Jquery:

$('#submit').click(function(){
    $('#login').submit();
});

$('#login').submit(function(){
    alert('form submitted');
    return false;
});

http://jsfiddle.net/pZcx4/

АЛЬТЕРНАТИВНАЯ ЖИЗНЬ JS:

function submit_form()
{
    alert('form submitted');
    return false;

    // when you are ready, do this: document.forms['login'].submit();
}


document.getElementById('submit').addEventListener('click',submit_form,false);

http://jsfiddle.net/pZcx4/3/

Ответ 3

Это довольно странно. Я думаю, что граница 1px добавляется к внешней стороне ваших текстовых входов, поэтому она имеет ширину 500 пикселей.

В то время как на кнопке "Отправить" кнопка подсчитывается по бокам, но отображается внутри, так что вы получаете 500px - 1px - 1px = 498px wide...

Возможное решение, которое вы можете сделать, это просто создать следующий CSS:

.login-tb {
     border: 1px solid red;
     margin: 0;
     padding: 0;
     width: 500px;
}

#login-tb {
     border: 1px solid red;
     margin: 0;
     padding: 0;
     width: 502px;
}

Это исправляет вашу проблему, и она по-прежнему показывает вашу кнопку отправки размером 500 пикселей в Firebug. И так как ваша форма установлена ​​на ширину 500 пикселей, и это не меняется, использование ширины в процентах мало.

Ответ 4

Не уверен, что это сработает для вашей среды. Когда я играл с jsbin, настройка width работала...

.login-tb { width: 99.75%; border: 1px solid red; padding: 0; margin: 0; }

Проверено только на Chrome.