Як зробити ширину елемента: 100% мінус прокладки?


396

У мене є HTML введення.

Вхідне повідомлення: padding: 5px 10px;Я хочу, щоб це було 100% ширини батьківського діва (що є рідиною).

Однак використання width: 100%;причини спричинює вхід, 100% + 20pxяк я можу це обійти?

Приклад


1
Дивіться цю відповідь, яку я опублікував не 15 хвилин тому: stackoverflow.com/questions/5219030/… Це повинно працювати для вас ідеально, якщо ви не вимагаєте, щоб він працював в IE7.
тридцятьдо

Якщо ви використовували мій метод, дивіться невелику редагування, яку я щойно зробив у своїй відповіді. Забезпечує "рівномірне вкладення" в деяких браузерах.
тридцятьдесят

@Hailwood У мене є рішення, яке зберігати прокладки для inputIE7 та підтримувати його
Володимир Старков

Будь ласка, дивіться відповідь нижче, використовуючи функцію calc
Даан

Відповіді:


485

box-sizing: border-box це швидкий і простий спосіб виправити це:

Це буде працювати у всіх сучасних браузерах та IE8 +.

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

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

Префікс-версії браузера ( -webkit-box-sizingтощо) в сучасних браузерах не потрібні.


5
Я не думаю, що це таке погане рішення. Взагалі, загортання елементів у додатковий розділ - це хороший спосіб набивання елементів, не висуваючи загальну ширину елемента за межі його батьківського контейнера.
Джейк Вілсон

1
Прокладка обгорткового діва також дає невідповідні результати для додавання прокладки безпосередньо на вхід.
Фелікс Фунг

@thirtydot У мене є кілька більш гнучких і елегантних рішень, які зберігають ширину введення
Володимир Старков,

8
@thirtydot так, просто залиште його зламаним для IE7 і нехай M $ це виправить :)
Петро Пеллер

Це також зберігає автоматичний розмір текстових зображень для будь-якого з вас, jQuery людей, порівняно з вимкненням розміру коробки, якщо ви не застосуєте це до прихованого розділу.
Майкл Дж. Калкінс

276

Ось чому ми маємо 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, це не підтримують. Якщо ви шукаєте рішення, яке працює у старих ІЕ, перегляньте інші відповіді.


3
+1, але caniuse.com/#search=box- розмір IE 8? Крім того, схоже , github.com/Schepp/box-sizing-polyfill пропонує рішення для IE 6-7.
Алікс Аксель

1
+1, це чудово, якщо вам не байдуже IE (наприклад, при використанні PhoneGap)
Лука Б.

3
Що це за чарівництво? +1 для відповіді та +1 для коментаря над мною (саме це мені і потрібно).
Едуард Лука

20
Це має бути поведінка за замовчуванням .. замість +20 до ширини. Іноді CSS здається серйозно заплутаним.
Soth

2
Щоб уточнити підтримку розміру коробки на IE, властивість розміру коробки IE залежить від режиму документу IE, вона працює в режимі стандартів IE8 і вище. Таким чином, він буде працювати у версії браузера IE8, також якщо режим документа "Режим стандартів IE8". Сподіваюсь, це допомагає.
Саньєєв,

40

Використовуйте прокладки в відсотках і вийміть із ширини:

підкладка: 5%;
ширина: 90%;

19
Фій, це рішення ідеально підходить лише для негнучких макетів.
приглушує

+1, Проблема з цим була б межами, я думаю. Зазвичай вони виглядають "правильно" лише з максимумом від 1 до 3 пікселів. Результати занадто непередбачувані, враховуючи невідповідність браузера щодо округлення субпікселів.
Алікс Аксель

27

Ви можете це зробити без використання 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 */ 
}

4
Це хороший трюк: використовувати запас для введення та прокладку для обгортки, щоб компенсувати вхідні прокладки.
maulik13

Погодьтесь повністю !!! Я використав це рішення, і воно працює широко, без брудних хитрощів! Це повинно було вирішити всілякі відповіді ..
Андре Фігейредо

Я не зовсім розумію, яку роль відіграє негативна маржа - все, що я знаю, це те, що якщо значення неправильне, то поле закінчується в одну сторону, але якимось чином симетричний запас фіксує це
Casebash

21

Використовувати 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 -ширина-100пр-мінус-100px /

Просто скопіював це сюди, бо я майже не пропустив його в іншій темі.


Це потрібно вручну запрограмувати. В ідеалі це було б визначено автоматично.
JackHasaKeyboard

11

Якщо припустити, що я в контейнері з накладкою 15 пікселів, це те, що я завжди використовую для внутрішньої частини:

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

Це розтягне внутрішню частину до будь-якої ширини, вона повинна бути меншою на 15 пікселів в обидві сторони.


Чи можете ви опублікувати повний приклад width:autoзастосованого до inputполя?
jakubiszon

ось лише половина відповіді. Позиція елементів за замовчуванням є статичною, тому ліві та праві тут нічого не роблять. і ширина авто - це також початкове значення, тому .. вся ця відповідь нічого не робить :)
honk31

5

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

Живий приклад


У яких браузерах ви тестували це? :(
тридцять до

Хм, працює лише в Chrome. Але я знаю, що я отримав щось дуже схоже на роботу у FF & IE.
Фелікс

Схоже, це не працює з <input>елементами в Firefox (idk про IE). Хоча це працює і з <div>s. І немає, display: blockна <input>не працює , або: - /
Фелікс

5

Ось рекомендація від codeontrack.com , яка має хороші приклади рішення:

Замість того, щоб встановити ширину ключа на 100%, встановіть його на автоматичне та переконайтесь, що значення <div>встановлено для відображення: блок (за замовчуванням для <div>).


3
Ви не повинні публікувати посилання безпосередньо. Ви можете включити інформацію за цим посиланням. Причина в тому, що завтра може бути те, що посилання буде недоступним, і ваша відповідь більше не буде дійсною.
Amnesh Goel

4

Перемістіть вкладку "вкладки" на елемент обгортки.

<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/


2

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


Чи можете ви включити приклад, коли це працює з <input>? Інакше ви просто відправляєте людей на погоню за дикими гусками.
Містер Лістер



-1

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

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

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

margin:15px;padding:10px 0 15px 23px;width:auto. Потім елемент вирівнюється належним чином:

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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.