«Резиновое» поле ввода в форме

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

Есть сервисы в интернете с полями ввода (например, поиском) у которых ширина задана фиксированно. Соответственно, если шаблон сайта резиновый, то поле ввода растягиваться не будет. Как правило такие сайты имеют фиксированную вёрстку. К примеру, если вы зайдёте на «Yahoo Answers» и с помощью Firebug (Firefox), Web Inspector (Safari, Chrome) или Developer Tools (Opera, IE8) отключите у элемента <div id=”y-ks-whole-page”> свойство «width: 750px;» в стилях, то сайт растянет на всю ширину, а поле поиска вопросов останется той же ширины. Конечно, кроме всего прочего, некоторые другие элементы останутся фиксированными, но мы говорим о полях ввода.

И вспомним работу студии Артемия Лебедева, поисковик «Яндекс» и его страницу ya.ru — облегчённую версию поисковика или посмотрим на давно забытый (мною) Рамблер. Вёрстка как видите «резиновая» и соответственно ширина поля ввода для поиска такая же растягивающаяся.

Как же они сделали так, чтобы ширина была динамичной? Очень просто: таблицы. Создаётся таблица из одной строки и нескольких ячеек, в одной из которых помещается поле ввода и растягивается на всю ширину.

yandex

Это простейший путь. Но не самый лучший.

Вариант получше

Начнём со структуры. особо наворачивать не будем. Чем проще, тем лучше.

<div class="form">
	<fieldset>
		<input class="text-input" type="text" />
		<input class="submit" type="submit" value="Continue →" />
	</fieldset>
</div>

Проще некуда. на самом деле можно было бы обойтись без лишнего div-а, если бы не Internet Explorer 6 и Firefox 2. Но об этом позже.

Перед описанием внешнего вида в CSS сначала нужно понять как предлагается решать задачу. Лучше всего показать схематически.

input-variable

Из схемы видно, что предлагается контейнеру элементов формы добавить боковую границу шириной примерно равной кнопке отправки формы, а растягиваемое поле ввода предлагается растянуть на 100%. Ну и чтобы кнопка не перенеслась на следующую строку, контейнеру нужно запретить перенос строк.

.form fieldset{
	border: none;
	border-right: 90px solid #fff;
	white-space: nowrap;
}
.form fieldset .text-input{
	width: 100%;
}

Этого достаточно, чтобы форма правильно работала в Firefox 3, Opera, Safari, Chrome и Internet Explorer 8.

Для IE 6 и 7 нужно подправить отображение кнопки:

.form fieldset .submit{
	overflow: visible;
}

А для того, чтобы в IE6 и FF2 контейнер не растягивался так, что появляется горизонтальная прокрутка, нужно внешнему div-у прописать следующие свойства:

.form{
	overflow: hidden;
	width: 100%;
}

Вот и всё, теперь у вас есть бестабличная вёрстка растягивающегося поля ввода.

Скачайте и посмотрите пример. Он немного приукрашен.

Пара нюансов:

  • Вам нужно точно знать ширину кнопки.
  • Для <div class=”form”> нельзя добавлять margin и padding по горизонтали, иначе будет сдвиг. Ну это вы и сами знаете.

Конечно же, никто не мешает вам добавить и левую границу и с отрицательным отступом поместить что-нибудь перед полем ввода (например логотип Яндекса).

Собственно, это я расписывать не буду, а просто посмотрите пример, как я сверстал ya.ru.

Дата: 31.07.2009
Категории: CSS
Google     

]]> Serhiy ]]>

Не плохо. Тоже стыкался с необходимостью растягивать поле поиска, на про border не додумался, видать через то что он не для этого предусмотрен ;) .

»

]]> Sam ]]>

На картинке второй px вместо %.

»

]]> Никита ]]>

Спасибо Sam, исправлю

»

]]> Sam ]]>

Да, ещё круто было бы примеры выкладывать в не запакованном виде. Чтобы можно было посмотреть не отходя от кассы.

»

]]> Alinaki ]]>

Спасибо! Я недавно как раз пытался решить точно такую же проблему, но остановился на табличном варианте. Переделаю :)

»

]]> gordi ]]>

Красиво :)
Но…
Хотелось бы пропорционального изменения размеров и поля ввода и самой кнопки.
При резиновых разметках это просто необходимо.
К тому же border не может быть “резиновым”.

»

]]> Sam ]]>

Кнопку тянуть? Зачем?!

»

]]> gordi ]]>

Sam: “Кнопку тянуть…”
Говорим о пропорциях :)
Скажем, есть у меня такая разметка http://trifler.ru/blog/i/layou....._lcr_c.htm
В колонках навигации может находится форма поиска по ресурсу.
Что будет поле ввода тянуться понятно, а вот кнопка останется прежнего размера и ни о каких пропорциях не и речи, а хотелось бы :)
Дискомфорт некий присуствует.

»

]]> Sam ]]>

У меня лично не будет никакого дискомфорта. Я знаю, что кнопка всегда справа. Там я её и ищу. По правому краю. А большая она или мелкая — не важно. Вот поле ввода — да, полезное пространство.

»

]]> gordi ]]>

Sam: “У меня лично…”
Александр, мы же не гворим у кого какие предпочтения :)
Вам может нравиться и так, и эдак, но хочется по возможности, идеального решения :)
Тем более, делаем в первую очередь для пользователя, а не для себя любимого :)

»

]]> Sam ]]>

А откуда известно, что пользователю надо растягивающуюся кнопку?

»

]]> gordi ]]>

Sam: “А откуда известно…”
Не знаю?
Также, как не знаю, а нужно ли ему растягивающееся поле ввода :)
Но если он растягивается, то пропорции, на мой взгляд, не плохо было бы соблюсти.

»

]]> Никита ]]>

gordi, Sam, это действительно интересный момент. Даже если не кнопку, а что-то другое. Можно подумать на эту тему. Конечно, идеально бы подошло display: table-cell, но к сожалению с его поддержкой слабовато…

»

]]> gordi ]]>

Никита: “…это действительно интересный момент…”
Сам на эту тему давно размышляю :)
Но тут есть засада – разметка резиновая, а как быть с размером шрифта,
чтобы и он адаптировался по разрешение и размер диагонали монитора “автоматом”
и под меняющуюся ширину колонок тоже.
Вот одна из моих попыток: http://trifler.ru/blog/i/control/lcr_b_font.htm

»

]]> Никита ]]>

gordi, кошмар, сколько у вас хакков.
На самом деле, вариант с растягивающейся кнопкой очень простой. Достаточно прописать ширину для первого input-a например 80%, а для второго — 20%. Здесь проблемы нет.

»

]]> gordi ]]>

Это черновик, но попытка сделать полную визуальную идентичность макета с плавющей шириной колонок, в популярнух браузерах, а тут только проценты рулят, приводит к этому кошмару :)
Тема вашей статьи, это частный случай, в случае глобальной разметки страницы, не все так просто :)

»

]]> gordi ]]>

Никита: “На самом деле…”
Ваша статья частный случай.
Приглобальной разметке страницы, где все колонки имеют плавающую ширину, не все так просто :)

»

]]> Никита ]]>

Ладно, попробую, дам знать.

»

]]> Dmitry Dulepov ]]>

Очень полезная статья. Люблю, когда сделано качественно.

Добавил в букмарки :)

»

]]> malevi4 ]]>

Благодарности! заюзал на http://picfor.me

»

]]> софт, хард & интERнет » Порция знаний о Wordpress ]]>

[...] Подсмотрел у Никиты Селецкого, как сделать поле ввода «резиновым». Принял на вооружение. Add to Social [...]

»

]]> Tim ]]>

>Благодарности! заюзал на http://picfor.me
классно
только поле и инпуты у вас не стандартной высоты … как следстивие кнопка search уезжает вверх

описанный подход не подходит , если вы собрались менять высоту поля и кнопки

»

]]> TRSteep ]]>

C этими дивами нужен мозг, который не всегда доступен.
И проще накатать таблицами.

Как говорил знакомый
дизайнеры на дивах все еще парятся
а дизайнеры на таблицах – давно пьют кофе :) ))

»

Напишите комментарий