Прокладка всередині входів розбиває ширину 100%


130

Гаразд, тому ми знаємо, що встановлення накладки на об'єкт призводить до зміни його ширини, навіть якщо воно встановлено явно. Хоча можна стверджувати логіку цього, це спричиняє деякі проблеми з деякими елементами.

У більшості випадків ви просто додаєте дочірній елемент і додаєте до нього накладки замість одного, встановленого на 100%, але для введення форми це не можливий крок.

Погляньте на це: http://sandman.net/test/formcss.html

На другому вході встановлено 5px, що я дуже віддаю перевагу типовим параметрам. Але, на жаль, це змушує вхід зростати на 10 пікселів у всіх напрямках, включаючи додавання 10 пікселів до 100% ширини.

Проблема тут полягає в тому, що я не можу додати дочірній елемент всередину вводу, тому не можу його виправити. Тож питання:

Чи є спосіб додати прокладки всередині входу, зберігаючи ширину 100%? Це має бути на 100%, оскільки форми відображатимуться у батьків різної ширини, тому я заздалегідь не знаю ширини батьків.


3
Дивіться stackoverflow.com/questions/628500/… про використання box-sizingатрибуту CSS3
Daniel LeCheminant

15
Просто треба сказати, дякую, що весь цей час ви підтримували сторінку прикладу. Наштовхує мене, коли хтось публікує URL-адресу у запитанні, і він не працює після того, як відповідь отримано, або вони не використовують щось на зразок jsfiddle.
Джонатан Дюман

Що стосується використання атрибута розміру коробки; моя проблема була в тому ж самому питанні, але з висотою - встановлення висоти на 100% поодинці означає висоту + бордюр + набивання = висота контейнера. Щоб вхід мав фактичну висоту контейнера, мені просто потрібно було використовувати розміри коробки: content-box.
Скічан

За винятком того, що я щойно сказав, не працює в IE. IE11 з розміром поля: content-box зовсім не регулює висоту з висотою: 100%. Він поважає його з певною висотою px. Отже висота: розмір коробки 31px без розміру коробки на 6 пікс менше, ніж висота: 31px + розмір коробки: box-content. Але ідея полягає у використанні висоти: 100%, тому я не переживаю за конкретний розмір пікселів!
Скічан

Відповіді:


288

За допомогою CSS3 ви можете використовувати розмір поля властивості , щоб змінити, як браузер обчислює ширину вводу .

  input.input {
    width: 100%;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;         /* Opera/IE 8+ */
  }

Більше про це можна прочитати тут: http://css-tricks.com/box-sizing/


@ Víctor Dieppa Garriga Дякую, це чудове рішення.
sinanakyazici

1
Підтримка полягає в наступному: Chrome (будь-який): розміщення коробки Opera 8.5+: розмір коробки Firefox (будь-який): -moz-box-розмір Safari 3: -webkit-box-розмір (нефіксований у версіях 5.1+) IE8 +: box -розміри Також рекомендую це для прийнятої відповіді, це більш елегантне рішення.
Baconbeastnz

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

Чесно кажучи, box-sizing: border-box;це перше, що я подумав, але це абсолютно не працює для мене. Можливо, прабабуся і прабабуся display: flex;з цим возиться?
Коді

Схоже, він підтримується в усіх основних браузерах без префіксу, і він має кілька версій: caniuse.com/#feat=css3-boxsizing
Jason

7

Я не знаю, наскільки це сумісний веб-браузер (він працює у firefox та safari), але ви можете спробувати це рішення:

DIV.formvalue {
padding: 15px;
}
input.input {
margin: -5px;
}

(Опублікував лише зміни, які я змінив)


1
Це викликає проблеми в IE.
Тарік

Ну, це не дуже мене здивує :) Не думайте, що існує легке крос-браузерне рішення без зміни розмітки.
michaelk

Гаразд, я зараз голосую за це рішення, оскільки додав маржу: -5px, мабуть, не є порушенням. Я додав четвертий вхід на сторінку, яка використовує це, і, здається, це справді працює. jigsaw.w3.org/css-validator/…
Sandman

7

Один із варіантів - обгортання INPUT в DIVяке має набивання.

CSS:

div.formvalue {
    background-color: #eee;
    border: 1px solid red;
    padding: 10px;
    margin: 0px;
}

div.paddedInput {
    padding: 5px;
    border: 1px solid black;
    background-color: white;
}

div.paddedInput input {
    border: 0px;
    width: 100%;
}

HTML:

<div class="formvalue">
    <div class="paddedInput"><input type="text" value="Padded!" /></div>
</div>

8
Прошивка контейнера div дає неідентичні результати додавання прокладки у поле введення.
Фелікс Фунг

Додайте до того, що сказав Фелікс Фунг - Ви втрачаєте можливість клацання мишею в області прокладки і фокусуєте поле введення - серед інших більш помітних проблем. Просто хотілося вказати на цю менш помітну / відому проблему - Мене це дратує без кінця при використанні веб-сторінок, які використовують цей злом.
eselk

5

Тут часто calcна допомогу можуть прийти забуті :

input {
  width: calc(100% - 1em);
  padding: 0.5em;
}

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


4

У мене виникли проблеми з чимось подібним до цього. У мене є tds з введеннями 100% і невеликою прокладкою. Що я зробив, було компенсувати прокладку на td наступним чином:

.form td {
    padding-right:8px;
}

.form input, .form textarea {
    border: 1px solid black;
    padding:3px;
    width:100%;
}

прокладка 8 пікселів для включення рамки та прокладки вводу / текстової області. Сподіваюся, це допомагає!


Ця методика чудово підходить для вишикування шириною комірок, що містять вкладені входи, із клітинками, які не мають. Просто застосуйте вибірково-праворуч вибірково до будь-якого ТД, що містить вхід на 100% ширини.
Seb Barre

1

Можливо, зніміть кордон + фон з input, а замість цього вкладіть його у divрамку + рамка та ширина: 100% та встановіть маржу на input?


Це такий злом, який я зараз використовую для цієї проблеми, але я скоріше використовувати рамки на вході з "стильових причин" чи чогось іншого. Але так, саме зараз я це роблю, тому це є життєздатним рішенням
Sandman

1

Я знайшов одне рішення - абсолютно розташувати вхід із відносно розташованим батьківським тегом.

<p class="full-width-input">
    <input type="text" class="text />
</p>

Застосовуємо стиль:

p.full-width-input {
    position: relative;
    height: 35px;
}

p.full-width-input input.text {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    padding: 5px;
}

Єдине, про що слід пам’ятати, - тег абзацу потребує встановлення висоти, оскільки його абсолютно розташовані діти не розширять його висоту. Це дозволяє уникнути необхідності встановлення width: 100%, заблокувавши його в лівій і правій частині батьківського елемента.


0

Спробуйте використовувати відсотки для вашої оббивки:

.input { 

  // remove border completely
  border: none;

  // don't forget to use the browser prefixes
  box-shadow: 0 0 0 1px silver;

  // Use PERCENTAGES for at least the horizontal padding
  padding: 5%; 

  // 100% - (2 * 5%)
  width: 90%; 

}

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


-3

Єдине, що я знаю, щоб запобігти цьому, це присвоїти такі значення, як 100% -10. Але це має деякі проблеми сумісності.

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