Чи можу я зупинити розширення текстових полів 100% шириною за межі своїх контейнерів?


181

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

input.wide {display:block; width: 100%}

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

Наприклад, тут праворуч:

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

Чи є спосіб змусити текстове поле заповнити ширину контейнера, не виходячи за його межі?

Ось приклад HTML, щоб показати, що я маю на увазі:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <style type="text/css">
        #outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
        #inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
        input.wide {display:block; margin: 0px}
        input.normal {display:block; float: right}
    </style>
</head>
<body>
    <div id="outer">
        <div id="inner">
            <input type="text" class="wide" />
            <input type="text" class="normal" />
            <div style="clear:both;"></div>
        </div>
    </div>
</body>
</html>

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

Відповіді:


87

Що ви можете зробити, це видалити типові "додаткові" на input:

input.wide {display:block; width:100%;padding:0;border-width:0}

Це збереже inputвнутрішню частину контейнера. Тепер , якщо ви хочете кордону, обернути inputв div, з кордонами , встановленими на div(таким чином ви можете видалити display:blockз inputзанадто). Щось на зразок:

<div style="border:1px solid gray;">
 <input type="text" class="wide" />
</div>

Редагувати: Ще один варіант полягає в тому, щоб замість вилучення стилю з input, компенсувати його в загорнутому div:

input.wide {width:100%;}

<div style="padding-right:4px;padding-left:1px;margin-right:2px">
  <input type="text" class="wide" />
</div>

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


3
Це дуже творче рішення. Єдине питання, яке я маю з цим, - це те, що я не можу визначити контур текстового поля, коли він набуває фокусу, якщо я не використовую JavaScript для зміни межі оболонки діва.
Ден Герберт

@DanHerbert, ти маєш рацію, це головний недолік UX цього методу
Баумр,

275

Чи є спосіб змусити текстове поле заповнити ширину контейнера, не виходячи за його межі?

Так: використовуючи властивість CSS3 "box-sizing: border-box", ви можете переосмислити, що означає "width", щоб включити зовнішню прокладку та рамку.

На жаль, оскільки це CSS3, підтримка не дуже зріла, і оскільки специфікаційний процес ще не завершений, він тим часом має різні тимчасові імена в браузерах. Так:

input.wide {
    width: 100%;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

Альтернатива для старої школи полягає в тому, щоб просто помістити кількість "padding-right" на додаючий <div> або <td> елемент, рівний приблизно тому, скільки зайвих лівих та правих накладок / меж у "px", на вашу думку, браузери дати вхід. (Зазвичай 6 пікселів для IE <8.)


Це спрацювало б чудово, за винятком випадків, коли я не можу використовувати це, оскільки я націлений на мобільні пристрої, які, ймовірно, не підтримують це роками. : - \
Ден Герберт

20
Я думаю, що мобільні пристрої матимуть повну підтримку HTML5 перед комп'ютерами.
Маріано Кавалло

4
@Kindred: напевно, ні, якщо ви включите IEMobile та Blackberry до цього.
bobince

1
Це чудова підтримка веб-переглядачів: quirksmode.org/css/contents.html
logan

2
Як мені знадобилося так довго, щоб знайти цей дивовижний пюре ??? Чи можемо ми, будь ласка, зробити це прийнятою відповіддю?
streetlogics

14

Це вирішило для мене проблему!

Без потреби в зовнішньому діві. Просто застосуйте його до даного текстового поля.

box-sizing: border-box; 

За допомогою цього властивості "Властивості ширини та висоти (і властивості min / max) включають вміст, накладення та облямівку, але не межа"

Дивіться опис власності в w3schools .

Сподіваюся, це допоможе комусь!


Чудово просто! Дякую!
годувальник

10

Я просто натрапив на цю проблему, і єдине рішення, яке я міг знайти, що працював у всіх моїх тестових браузерах (IE6, IE7, Firefox), було таке:

  1. Оберніть поле введення в два окремих DIV
  2. Встановіть зовнішній DIV на ширину 100%, це запобігає переповненню нашого контейнера документа
  3. Покладіть прокладку у внутрішній DIV точної кількості, щоб компенсувати горизонтальний перелив вводу.
  4. Встановіть на вході спеціальну підкладку, щоб вона переповнювалася на ту саму суму, яку я допустив у внутрішньому DIV

Код:

<div style="width: 100%">
    <div style="padding-right: 6px;">
        <input type="text" style="width: 100%; padding: 2px; margin: 0;
                                  border : solid 1px #999" />
    </div>
</div>

Тут загальний горизонтальний перелив для вхідного елемента дорівнює 6 пікселів - 2х (обшивка + межа), тому ми встановлюємо підкладку-право для внутрішнього DIV 6 пікселів.


додайте до вхідного елемента 8px прокладку, і це більше не працює
JuHwon

7

Підтримка розмірів коробки насправді хороша: http://caniuse.com/#search=box-sizing

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


3

Власне, це тому, що CSS визначає 100% відносно всієї ширини контейнера, включаючи його поля, межі та прокладку; це означає, що простір корисний. до його вмісту - деяка кількість, менша за 100%, якщо тільки контейнер не має полів, меж або прокладки.

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

Зверніть увагу , що текстове поле в поля, межі та відступи будуть включені в розмір CSS , зазначеного для нього - це контейнер, який кидають речі.

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


EDIT: Я натрапив на подібне запитання - я ніколи не пробував відповіді , і не знаю точно, чи стосується вона вашої проблеми, але, здається, так і буде.


1

Одне з можливих рішень (працює для мене) - застосувати негативну маржу на вході (текстове поле) ... або фіксовану ширину для ie7 або скинути підтримку ie7. Це призводить до ідеальної ширини пікселів. Для мене його 7, тому я додав 3 та 4, але він все ще ідеальний для пікселів ..

У мене була така ж проблема, і я ненавидів зайвих дівок для кордону тощо!

Тож ось моє рішення, яке, здається, працює!

Ви повинні використовувати таблицю стилів тільки 7, щоб уникнути зірків.

input.text{
    background-color: #fbfbfb;
    border : solid #eee 1px;
    width: 100%;
    -box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    height: 32px;

    *line-height:32px;
    *margin-left:-3px;
    *margin-right:-4px;
    display: inline;   
    padding: 0px 0 0 5px;

}

1

Якщо ви не можете скористатися, box-sizing:border-boxви можете спробувати видалити елемент width:100%і ввести дуже великий sizeатрибут в <input>елемент, однак недолік - це ви повинні змінити html, і не можете це зробити лише за допомогою CSS:

<input size="1000"></input>

0

Якщо вам не потрібно робити це динамічно (наприклад, форма має фіксовану ширину), ви можете просто встановити ширину дочірніх <input>елементів на ширину їх контейнера за вирахуванням будь-яких прикрас, таких як набивання, поле, рамка тощо:

 // the parent div here has a width of 200px:
.form-signin input[type="text"], .form-signin input[type="password"], .form-signin input[type="email"], .form-signin input[type="number"] {
  font-size: 16px;
  height: auto;
  display: block;
  width: 280px;
  margin-bottom: 15px;
  padding: 7px 9px;
}

0

Якщо ви не можете використовувати розміри коробки (наприклад, при перетворенні HTML у PDF за допомогою iText). Спробуйте це:

CSS

.input-wrapper { border: 1px solid #ccc; padding: 0 5px; min-height: 20px; } 
.input-wrapper input[type=text] { border: none; height: 20px; width: 100%; padding: 0; margin: 0; }

HTML

<div class="input-wrapper">
     <input type="text" value="" name="city"/>
</div>

0

Це працює:

<div>
    <input type="text" 
        style="margin: 5px; padding: 4px; border: 1px solid; 
        width: 200px; width: calc(100% - 20px);">
</div>

Перше "ширина" - це резервне правило для старих браузерів.


0

Просто введіть вклад для зміщення для додаткової підкладки. У наступному прикладі накладка на вході складе 10 пікселів зліва та справа для загального зміщення оббивки 20 пікселів:

input[type=text]{
   width: calc(100% - 20px);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.