Как сделать ширину элемента: 100% минус отступ?

У меня есть ввод html.

На входе указано padding: 5px 10px;. Я хочу, чтобы он составлял 100% ширины родительского div (который является плавным).

Однако использование width: 100%; приводит к тому, что ввод будет 100% + 20px, как я могу обойти это?

Пример


person Hailwood    schedule 07.03.2011    source источник
comment
См. Этот ответ, который я опубликовал не более 15 минут назад: stackoverflow.com/questions/5219030/ Это должно отлично сработать для вас, если только вам не требуется это работать в IE7.   -  person thirtydot    schedule 07.03.2011
comment
Если вы использовали мой метод, посмотрите небольшое изменение, которое я только что внес в свой ответ. Это обеспечивает равномерное заполнение в некоторых браузерах.   -  person thirtydot    schedule 09.03.2011
comment
@Hailwood у меня есть решение, которое сохраняет отступы для input и поддерживает IE7   -  person Vladimir Starkov    schedule 28.06.2012
comment
См. Также ответ ниже, используя функцию calc.   -  person Daan    schedule 13.10.2014


Ответы (15)


box-sizing: border-box - это быстрый и простой способ исправить это:

Этот будет работать во всех современных браузерах и IE8 +.

Вот демонстрация: http://jsfiddle.net/thirtydot/QkmSk/301/

.content {
    width: 100%;
    box-sizing: border-box;
}

Версии с префиксом браузера (-webkit-box-sizing и т. Д.) Не нужны в современных браузерах.

person thirtydot    schedule 07.03.2011
comment
Я не думаю, что это так уж плохо. В общем, упаковка элементов в дополнительный div - это хороший способ дополнить элементы, не увеличивая общую ширину элемента за пределы его родительского контейнера. - person Jake Wilson; 24.08.2011
comment
Заполнение обертывающего div также дает не идентичные результаты прямому добавлению заполнения во входные данные. - person Felix Fung; 05.06.2012
comment
@thirtydot у меня есть более гибкие и элегантные решения, которые сохраняют ширину ввода - person Vladimir Starkov; 28.06.2012
comment
@thirtydot да, просто оставьте его сломанным для IE7 и позвольте M $ исправить это :) - person Petr Peller; 04.07.2013
comment
Это также сохраняет текстовые поля с автоматическим изменением размера для любого из вас, люди jQuery, по сравнению с изменением размера окна, если вы не примените это к скрытому div. - person Michael J. Calkins; 03.09.2013
comment
Вы можете просто использовать text-indent, если все, что вы хотите изменить, - это левое заполнение поля ввода. Это не изменит ширину элемента. - person m1.; 13.02.2014
comment
Это не работает, когда у ввода есть граница ... он смещается по ширине границы - person Flash Thunder; 12.03.2014
comment
См. Мой ответ ниже для более простого и лучшего решения или см. Здесь: stackoverflow.com/questions/651317/ - person Daan; 20.05.2014
comment
@FlashThunder Вы правы, но это касается элемента inputContainer. Этот элемент используется для определения границы и заполнения, которые вы хотите использовать для ввода. - person jakubiszon; 10.07.2014
comment
@thirtydot Не могли бы вы объяснить, почему display: block нужен для элемента input? - person jakubiszon; 10.07.2014
comment
См. Также ответ ниже, используя функцию calc. - person Daan; 13.10.2014
comment
Я не понимаю этого ответа - я удалил `box-sizing: border-box; , clicked Run`, и я получаю те же результаты, что и раньше. Используя Mozilla SeaMonkey. - person cnst; 08.03.2015
comment
Это был первый раз, когда я узнал, для чего нужен box-sizing, отличный ответ! - person Andy; 02.08.2015
comment
Если вам нужно, чтобы это работало в IE7, вы можете прочитать старую версию этого ответа. И мне очень жаль тебя. - person thirtydot; 28.06.2018

Вот почему у нас есть box-sizing в CSS.

Я отредактировал ваш пример, и теперь он работает в Safari, Chrome, Firefox и Opera. Проверьте это: http://jsfiddle.net/mathias/Bupr3/ Все, что я добавил:

input {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

К сожалению, старые браузеры, такие как IE7, не поддерживают это. Если вы ищете решение, которое работает в старых IE, ознакомьтесь с другими ответами.

person Mathias Bynens    schedule 07.03.2011
comment
+1, но caniuse.com/#search=box-sizing IE 8? Кроме того, github.com/Schepp/box-sizing-polyfill, похоже, предлагает решение для IE 6-7. - person Alix Axel; 31.01.2012
comment
+1, это здорово, если вам наплевать на IE (например, при использовании PhoneGap) - person Luke B.; 10.09.2012
comment
Что это за волшебство? +1 за ответ и +1 за комментарий над мной (это именно то, для чего мне это нужно). - person Eduard Luca; 20.12.2012
comment
Это должно быть поведение по умолчанию .. вместо +20 к ширине. Иногда кажется, что CSS серьезно испорчен. - person Soth; 09.05.2013
comment
Чтобы прояснить поддержку размера коробки в IE, свойство размера коробки IE зависит от режима документа IE, оно работает в стандартном режиме IE8 и выше. Таким образом, он будет работать в версии браузера IE8 также, если режим документа - это режим стандартов IE8. Надеюсь это поможет. - person Sanjeev; 25.06.2014
comment
Это должен быть выбранный ответ. box-sizing решает все проблемы, связанные с отношениями padding-width / max-width. - person tolga; 25.07.2014
comment
@ К сожалению, оба значения по умолчанию в новых свойствах CSS означают, как это делали старые браузеры, верно? - person Andy; 02.08.2015

Также используйте отступы в процентах и ​​удалите их по ширине:

padding: 5%;
width: 90%;
person Alex    schedule 07.03.2011
comment
К сведению, это решение идеально подходит только для негибких макетов. - person muffs; 16.12.2011
comment
+1, Проблема с этим, наверное, в границах. Обычно они выглядят правильно только при максимальном разрешении от 1 до 3 пикселей. Результаты слишком непредсказуемы, учитывая несоответствия браузера в отношении округления субпикселей. - person Alix Axel; 31.01.2012

Вы можете сделать это без использования box-sizing и неясных решений, таких как width~=99%.

Демонстрация jsFiddle:
 введите описание изображения здесь

  • Оставить введенные padding и border
  • Добавить к входу отрицательное значение по горизонтали margin = border-width + horizontal padding
  • Добавить в оболочку ввода по горизонтали padding, равную margin из предыдущего шага

Разметка HTML:

<div class="input_wrap">
    <input type="text" />
</div>

CSS:

div {
    padding: 6px 10px; /* equal to negative input's margin for mimic normal `div` box-sizing */
}

input {
    width: 100%; /* force to expand to container's width */ 
    padding: 5px 10px;
    border: none;
    margin: 0 -10px; /* negative margin = border-width + horizontal padding */ 
}
person Vladimir Starkov    schedule 28.06.2012
comment
Это хороший трюк - использовать поля для ввода и отступы для оболочки, чтобы компенсировать отступы на входе. - person maulik13; 12.09.2012
comment
Полностью согласен !!! Я использовал это решение, и оно работает широко, без каких-либо подвохов! Это должно было быть решением для всех этих ответов. - person Andre Figueiredo; 11.09.2013
comment
Я не совсем понимаю, какую роль играет отрицательная граница - все, что я знаю, это то, что если значение неправильное, то поле заканчивается на одной стороне, но каким-то образом симметричный маржа исправляет это - person Casebash; 18.11.2013
comment
Почему бы не использовать размер коробки? он существует для этой цели. - person Ninthu; 22.07.2020
comment
@Ninthu, потому что размер окна не работал во всех подходящих браузерах еще в 2012 году - person Vladimir Starkov; 27.07.2020

Используйте css calc ()

Супер просто и круто.

input {
    width: -moz-calc(100% - 15px);
    width: -webkit-calc(100% - 15px);
    width: calc(100% - 15px);
}​

Как видно здесь: Ширина Div 100% минус фиксированное количество пикселей
Автор: webvitaly (https://stackoverflow.com/users/713523/webvitaly)
Первоисточник : http://web-profile.com.ua/css/dev/css-width-100prc-minus-100px/

Просто скопировал это сюда, потому что я почти пропустил это в другом потоке.

person Daan    schedule 14.03.2014
comment
Однако вам нужно вручную запрограммировать это. В идеале это должно было бы определяться автоматически. - person JackHasaKeyboard; 14.08.2017

Предполагая, что я нахожусь в контейнере с отступом 15 пикселей, это то, что я всегда использую для внутренней части:

width:auto;
right:15px;
left:15px;

Это растянет внутреннюю часть до любой ширины, которая должна быть меньше 15 пикселей с каждой стороны.

person Andology    schedule 29.11.2013
comment
Не могли бы вы опубликовать полный пример применения width:auto к полю input? - person jakubiszon; 10.07.2014
comment
это только половина ответа. положение элементов по умолчанию статично, поэтому left и right здесь ничего не делают. и ширина auto также является начальным значением, так что ... все, что делает этот ответ, ничего не делает :) - person honk31; 14.09.2017

Вот рекомендация от codeontrack.com, где есть хорошие примеры решений:

Вместо того, чтобы устанавливать ширину div на 100%, установите для нее значение auto и убедитесь, что для <div> установлено значение display: block (по умолчанию для <div>).

person M.YPC    schedule 21.09.2015
comment
Вы не должны размещать ссылку напрямую. Вы можете включить информацию по этой ссылке. Причина в том, что завтра эта ссылка будет недоступна, и ваш ответ станет недействительным. - person Amnesh Goel; 21.09.2015

Вы можете попробовать несколько уловок с позиционированием. Вы можете поместить вход в div с position: relative и фиксированной высотой, затем на входе position: absolute; left: 0; right: 0; и любое желаемое дополнение.

Живой пример

person Felix    schedule 07.03.2011
comment
В каких браузерах вы это тестировали? :( - person thirtydot; 07.03.2011
comment
Хм, работает только в Хроме. Но я знаю, что у меня есть что-то очень похожее на работу в FF и IE. - person Felix; 07.03.2011
comment
Похоже, что он не работает с <input> элементами в Firefox (idk насчет IE). Однако он работает с <div>s. И нет, display: block на <input> тоже не работает: - / - person Felix; 07.03.2011

Переместите отступ поля ввода в элемент оболочки.

<style>
div.outer{ background: red; padding: 10px; }
div.inner { border: 1px solid #888; padding: 5px 10px; background: white; }
input { width: 100%; border: none }
</style>

<div class="outer">
    <div class="inner">
       <input/>
    </div>
</div>

См. Пример здесь: http://jsfiddle.net/L7wYD/1/

person Martin Jespersen    schedule 07.03.2011

Просто поймите разницу между width: auto; и ширина: 100%; Ширина: авто; будет (АВТО) МАТИЧЕСКИ вычислить ширину, чтобы она соответствовала точному заданному параметру обертывающего div, включая отступы. Ширина 100% увеличивает ширину и добавляет отступ.

person user3849374    schedule 15.05.2017
comment
Можете ли вы включить пример, в котором это работает с ‹input›? В противном случае вы просто отправляете людей в погоню за дикими гусями. - person Mr Lister; 24.06.2018

А как насчет упаковки в контейнер. Контейнер должен иметь такой стиль:

{
    width:100%;
    border: 10px solid transparent;
}
person Vitali Protosovitski    schedule 21.08.2015

Попробуй это:

width: 100%;
box-sizing: border-box;
person Manolo Ramos    schedule 03.12.2015

Возможно, браузеры изменились с тех пор, как последний раз был дан ответ на этот вопрос, но это единственное, что у меня когда-либо надежно работало для этого:

    width: auto;
    left: 0;
    right: 0;

Затем вы можете сделать поля / отступы такими, какие захотите, и элемент не будет расширяться за пределы своей доступной ширины.

Это похоже на ответ @andology из прошлого, но если вы сделаете left / right как 0, вы можете сделать margin и / или padding все, что захотите. Так что это всегда по умолчанию div.

person Peter Moore    schedule 07.04.2021

Для меня, используя margin:15px;padding:10px 0 15px 23px;width:100%, результат был таким:

введите здесь описание изображения

Для меня решением было использовать width:auto вместо width:100%. Мой новый код был:

margin:15px;padding:10px 0 15px 23px;width:auto. Затем элемент правильно выровнен:

введите здесь описание изображения

person Jaime Montoya    schedule 14.10.2019

Ты можешь сделать это:

width: auto;
padding: 20px;
person MissHD    schedule 01.07.2012
comment
Это не те же 100% - маржа. - person James; 30.11.2012