Интересный вопрос создания поля поиска с кнопкой внутри.
Сейчас такой прием очень популярен в дизайне и используется повсеместно на сайтах. Почему популярен - просто очень красив такой способ передачи поля ввода в веб-приложении. Чтобы было более понятно, о чем идет речь, давайте посмотрим пример макета с подобной формой поиска:
Дизайн нарисован таким образом, что видим следующее. Поле ввода текста с текстом-заглушкой
, справа внутри поля находиться кнопка отправки запроса в виде текста “Send”.1
placeholder
Все вроде так и в чем же проблема? Трудность заключается в том, что на сегодняшний день возможности CSS не позволяют поместить кнопку внутри элемента
. Поэтому в данном случае выход один - разместить рядом два элемента: 1
input
и кнопку (1
input
или 1
button type="submit"
).1
input type="submit"
Оба эти элемента обернуть в родительский элемент
(благо он является блочным) которому придать внешние свойства поля ввода - фоновую заливку, границу, внутренние отступы 1
form
. А у настоящих элементов 1
padding
или 1
input
убрать все визуальные признаки их присутствия внутри 1
button
.1
form
На авторитетном для меня сайте htmlbook есть статья, посвященная подобному вопросу. Но в ней описывается способ, когда внутрь элемента форм вставляется дополнительный блок
. Которому назначаются все внешние атрибуты поля ввода.1
div
Мне такой подход не совсем понятен - зачем плодить лишнюю разметку, когда с подобной задачей прекрасно справляется сам элемент
.1
form
Мне более нравиться способ, представленный на сайте Speckyboy.com автором Catalin Rosu, в котором как раз и используются только три элемента:
, 1
form
, 1
input type="text"
. В самом конце статьи я приведу код этого примера также, ибо он мне понравился.1
button type="submit"
Приступаем к первому примеру и начнем создавать поле поиска с кнопкой, как на картинке. Для начала придадим элементу
внешние признаки поля ввода: зададим границу с радиусом скругления, фоновую заливку и внутренние поля отступа 1
form
.1
padding
Помимо этого, явно установим ширину и высоту нашего будущего “поля” ввода и немного приукрасим ее, анимировав цвет границы при наведении
:1
hover
Теперь уберем все, что делает
таковым в нашем случае - обнулим границу, переопределим 1
input
и установим в ноль 1
padding
.1
margin
Это основные свойства элемента
, назначаемые ему по умолчанию браузером. Затем немного поборемся с браузерами на WebKit (Chrome\Safari), которые создаются эффект свечения вокруг поля ввода при получении фокуса 1
input
и рисуют тонкую линию-границу 1
outline
несмотря на то, что мы убрали ее, обнулив 1
-webkit-appearance: none
.1
border
Фоновый цвет сделаем одинаковым с элементом
, чтобы создавалась иллюзия однородности. Все остальные свойства можно не упоминать - они очевидны (кегль, цвет текста, высота 1
form
и так далее).1
input
Практически также поступим для элемента
, за исключением характерных нюансов типа 1
button
или 1
text-transform: uppercase
.1
color: #4f432e
Кстати, у Catalin Rosu я перенял “фишку”, когда он применяет
вместо 1
button type="submit"
. Это делается для дополнительной функциональности кнопки, так как 1
input type="submit"
может перехватывать событие Enter (нажатие этой клавиши на клавиатуре) + событие мыши. А вот 1
button
- только нажатие мыши на самом себе:1
input type="submit"
Ну и в конце приукрасим текст-заглушку
. Здесь придется использовать браузерные префиксы, так как данное свойство не поддерживается в полной мере браузерами на сегодня:1
placeholder
Совсем забыл привести HTML-код, на основе которого создавались все вышеприведенные стили:
Результат создания поля поиска показан ниже:
Все хорошо.
Поле ввода и кнопка со стрелкой (псевдо-элемент) внутри.
На закуску привожу полный код (почти без объяснений - чего там объяснять) от Catalin Rosu, как и обещал.
Здесь есть интересный атрибут
, который делает значение в поле ввода обязательным. Если оно будет пустым и нажать кнопку отправки, то появиться сообщение о необходимости сначала ввести данные.1
required
Также автором статьи намеренно используется элемент
вместо нового элемента 1
input type="text"
, который еще не до конца поддерживается всеми браузерами:1
input type="search"
Довольно объемный, но это связано с теми эффектами, которые применены к данной форме:
И результат этого кода - красивое поле ввода с не менее красивой кнопкой отправки данных на сервер:
На этом все.