Пример верстки поисковой формы для сайта

Предлагаю один из возможных вариантов верстки поисковой формы для сайта, которая будет выглядеть вот так:

Ее особенность заключается в том, что вся видимая часть формы — это поле ввода текста и нужно учесть, что его оформление будет меняться при получении фокуса, т.е. когда мы ставим курсор в это поле. Выглядеть это будет так:

А кнопка отправки формы накладывается поверх поля ввода.

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

Готовый сверстанный пример можно посмотреть здесь.

HTML-код формы поиска

Выглядит он следующим образом:

<form action="" method="post" id="search">
	<input type="text" name="" value="поиск" onblur="if(this.value=='') this.value='поиск';" onfocus="if(this.value=='поиск') this.value='';" class="input" />
	<input type="submit" name="" value="" class="submit" />
</form>

CSS-код

Я приготовил вот такой спрайт, который и будет использоваться при смене фокуса у поля ввода:

Спрайт поисковой формы

Привожу весь CSS-код с комментариями:

#search {
	/* устанавливаем ширину формы,
	** равную ширине поля ввода (183 + 37 + 15)	*/
	width: 235px;
	height: 29px;
}

/* делаем инпуты плавающими, чтобы убрать лишние отступы,
** и отключаем бордюры */
#search input {
	float: left;
	border: none;
}

/* стили для поля ввода */
#search .input {
	width: 183px;
	height: 28px;
	/* внутренний отступ справа (37px) делаем больше левого,
	** т.к. там будет размещена кнопка отправки	*/
	padding: 0 37px 1px 15px;
	background: #EEE url(https://dimox.name/wp-content/uploads/2023/10/search.png) no-repeat;
	color: #555;
	font: 13px/28px Tahoma, Arial, sans-serif;
	outline: none;
}

/* приходится использовать хак для FireFox
** для вертикального выравнивания текста,
** т.к. у него свои особые представления об этом */
@-moz-document url-prefix() {
	#search .input {
		height: 27px;
		padding-bottom: 2px;
	}
}

/* меняем оформление поля ввода при фокусе */
#search .input:focus {
	background-color: #E8E8E8;
	background-position: 0 -29px;
	color: #333;
}

/* оформляем кнопку отправки */
#search .submit {
	width: 37px;
	height: 29px;
	cursor: pointer;

	/* смещаем кнопку влево на собственную ширину,
	** чтобы она оказалась над полем ввода */
	margin-left: -37px;

	/* по-нормальному, здесь достаточно было бы указать background: none;
	** но приходится указывать фон из-за бага в IE */
	background: url(dontexist.png);
}

Про баг в Internet Explorer

Internet Explorer как-то неожиданно для меня преподнес очередной сюрприз. Причем столкнулся я с ним совсем недавно. Суть в том, что, если у кнопки отправки убрать фон, то в IE она становится некликабельной, т.е. как будто прячется под поле ввода. И хоть добавляй к ней позиционирование (position), хоть повышай индекс слоя (z-index) — ни в какую не реагирует. Но стоит кнопке задать какую-нибудь фоновую картинку, даже несуществующую, проблема устраняется.

Данный баг наблюдается только в IE8 и IE9.

Комментарии (56)

  1. 18 июля 2012 г. в 15:13

    Как-то не люблю я все эти картинки в бэкграундах. Лучше уж всё в CSS сделать, разве что иконку на кнопку поиска. Проблема тут и в фиксации размеров. Да таблицы CSS как-то глюкавят в разных браузерах и с резиновостью у меня лично ну никак, приходится всё ещё пользоваться таблицами.

  2. Александр
    18 июля 2012 г. в 15:39

    Еще бы написать про алгоритм поиска для сайта с подсказками, а то до сих пор не могу найти нормального решения

    1. jquery UI autocomplete

  3. nicroforus
    18 июля 2012 г. в 16:08

    А если задать

    input type="search"

    , ничего не изменится? (Сейчас проверять негде.) Я недавно столкнулся с тем, что Вебкит-браузеры по-разному отображают текстовые поля, если задан

    input type="search"

    , вместо

    input type="text"

    . При это у ФФ и Оперы такой проблемы нет.

    1. 18 июля 2012 г. в 16:19 / ответ на коммент nicroforus

      Да, на вебките сразу все портится. Так что не стоит.

  4. 18 июля 2012 г. в 18:17

    Детский сайт какой то, статья видимо запоздала на года 2-3:

    1. #search? А если 2 строки поиска на странице?

    2. input type=»search» — уже пора под это постраиваться, HTML5 как бы.

    3. Фиксированная ширина и высота? Очень не практично.

    4. Cтатичная картинка на фоне, причем в 2ух стейтах? а как же CSS3?

    5. Float? за что? :)

    1. 1. #search? А если 2 строки поиска на странице?

      Кто мешает поменять?

      2. input type=”search” — уже пора под это постраиваться, HTML5 как бы.

      Комментом выше написано про это.

      3. Фиксированная ширина и высота? Очень не практично.

      Слишком редко мне встречается необходимость растягивать форму. Все зависит от конкретного случая.

      4. Cтатичная картинка на фоне, причем в 2ух стейтах? а как же CSS3?

      Для простоты и кроссбраузерности. На CSS3 что, свет клином сошелся?

      5. Float? за что? :)

      А в чем проблема?

      1. 1. А зачем заведомо не правильны пример показывать людям? Имей ответственность, если учишь людей.

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

        4. На css3 проще, чем с картинкой, border-radius да box-shadow. Gracefull degradation никто не отменял.

        5. Флоты не для таких задачь были придумыны — они отрисовываются сложней, требуют клирфиксов и оверфловов…

        1. 1. А зачем заведомо не правильны пример показывать людям? Имей ответственность, если учишь людей.

          Я его не считаю неправильным, иначе бы не стал писать такой код.

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

          Не претендую на лучший вариант. И резиновый не лучше.

          5. Флоты не для таких задачь были придумыны — они отрисовываются сложней, требуют клирфиксов и оверфловов…

          Ширина и высота у формы служат клирфиксом, так что ничего тут не требуется, и не надо придираться.

    2. makregistr
      18 июля 2012 г. в 18:45 / ответ на коммент Роберт

      Согласен, не использовать input type=”search”, потому что в хроме и сафари появляется крестик глупо, ведь уже давно написано

      input[type=»search»] {
      -webkit-appearance: textfield;
      -webkit-box-sizing: content-box;
      -moz-box-sizing: content-box;
      box-sizing: content-box;
      }
      input[type=»search»]::-webkit-search-decoration {
      -webkit-appearance: none;
      }

      используйте более современный сброс стилей

      1. 18 июля 2012 г. в 18:57 / ответ на коммент makregistr

        Я предпочту и дальше использовать input type=”text”, нежели дописывать такой кусок кода.

        1. Алексей
          18 июля 2012 г. в 19:20 / ответ на коммент Dimox

          Вы слишком агрессивно отвечаете, совсем не распологаете к диалогу.

          Я предпочту и дальше использовать input type=”text”, нежели дописывать такой кусок кода.

          Пора развиваться и бросать писать привычный код времен динозавров.

          1. Код времен диназавров???
            Где он — в упор не вижу :)

            А вот ваш код напоминает стиль времен динозавров — когда надо было все захать до потери пульса.

            1. Ну как не видите? Фон картинкой, фиксировынные размеры, флоуты, отстутствие HTML5, очень даже диназаврово.

              1. Вот же вам картинки поперек горла стали :)
                И почему фиксированные размеры, флоуты и отсутсвие не полностью поддерживаемого языка — динозавтровы?

                Это где то утверждено? Можно ссылку?

                1. Это просто плохая вёрстка. Про фикс размеры — сетка сайта изменится, резиновое поле подтсроится, а все фиксированные элементы придётся править в ручную.

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

                  А HTML5 это будущее, зачем делать уже заведомо устаревшие сайты, когда можно делать со расчетом на будующие?

                  1. Ну так я и не говорю что это не будущее, просто у половины работать будет не так как надо.
                    Меня это беспокоит.

                2. Вот, наткнулся на пруфлинк, который вы просили — http://css-tricks.com/judging-css-spotting-bad-code/

                  Предпоследний пункт как раз про фиксированный размеры. Я думаю вам тоже стоит прислушаться к мнению Криса Койера.

                  1. СПС

      2. Я бы крести вообще оставил, это ведь удобно.

    3. Рановато еще совать в сайты CSS3 и HTML5.
      На отдельных элементах в качестве оформления можно использовать.
      Но панацею из этого делать еще рано.

      input type=”search” — уже пора под это постраиваться, HTML5 как бы.

      Это не поймет половина браузеров ;-)

      1. Алексей
        18 июля 2012 г. в 19:22 / ответ на коммент Серёга Кольт

        Не поймет, но и ничего не сломает. А последние поймут и добавят удобство. Прогресс не стоит на месте, почему бы не вводить постепенно удобства?

        1. Есть еще такое дело, как верстка на заказ. Если для своих сайтов можно пренебречь поддержкой современных фишек в старых браузерах, то с заказчиком это не пройдет (не с любым, конечно).

  5. 18 июля 2012 г. в 18:35

    вместо onblur и onfocus я сейчас всегда делаю так:

    (function($) {
        $(function() {
            $('input.textfield').each(function(){
                var text = $(this).val();
    				$(this)
    					.focusin(function(){
    						$(this).addClass('focus');
    						if ($(this).val() == text) $(this).val('');
    					})
    					.focusout(function(){
    						if ($(this).val() == '') $(this).val(text);
    						$(this).removeClass('focus');
    					});
            });
        })
    })(jQuery)
    
    1. 18 июля 2012 г. в 18:37 / ответ на коммент art

      Есть еще атрибут placeholder, работает из коробки, в современных браузерах.

      1. По моему и современные браузеры не все его понимают.
        Какой то один точно — просто не помню уже.

        Плюс обрабатывают его они вроде тоже по разному немного.

        1. Какой то один точно — просто не помню уже.

          Назови Internet Explorer, не ошибешься =)

          1. Это да :)

        2. Пользователи не смотрят 1 сайт в разных браузерах, нету смысла добиватся идентичного поведения во всех браузерах.

          1. Ну что за ерунда…
            При чем здесь пользователи не смотрят сайт в разных браузерах???

            По ходу на вашем сайте либо один пользователь, либо все ваши пользователи пользуются одним браузером…

            Бред.

            1. На нашем сайте за 150 миллионов пользователей :)

              1. :) Ну так тем более!
                Это я со своей бандой в пару сотен могу плюнуть на кроссбраузерность — но явно не вы.

                1. Мы за graceful degradation, в рамках разумного. И кроссбраузерность != одинаковое отображение во всех браузерах.

                  1. И я за «в рамках разумного» — но по ходу они у нас разные — эти рамки.

          2. Алексей
            18 июля 2012 г. в 19:28 / ответ на коммент Роберт

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

            В результате избавимся от скриптов, и избавим пользователей с отключенными скриптами от нужды стирать плейсхолдер вставленный текстом.

          3. Разные пользователи смотрят в разных браузерах, в том числе и старых. Так что, действительно, полный бред.

            1. Пользователь ие не знает что в соседнем браузере «уголки квадратные», но на доступность контента это не влияет.

    2. 18 июля 2012 г. в 18:41 / ответ на коммент art

      Ну это если на сайте используется jQuery для чего-то еще. Только ради поискового поля не стоит его подключать.

  6. 18 июля 2012 г. в 19:03

    Да, кстати, можно вполне обойтись и без хака под лисицу, правда кода будет больше :)

    И еще вопрос — а почему нельзя вообще отказаться от кнопки???

    1. Да, кстати, можно вполне обойтись и без хака под лисицу, правда кода будет больше :)

      Можно пример?

      И еще вопрос — а почему нельзя вообще отказаться от кнопки???

      Кнопку я по привычке использую. Иконка лупы ассоциируется с кнопкой.

      1. А я ее при таком дизайне удаляю.
        Ну а если использовать кнопку — то почему бы не сделать два спрайта — один обрезать для поля, другая сторона для кнопки???

        Код завтра выложу, сегодня бежать надо.

      2. Тут пример инпутов (логин, парот), с ровным выравниванием текста, без хака под фф.

        Специально готовил большую спеку по формам, приводя всё к одному стандарту и одинаковому отображению во всех браузерах.

        1. Я там не вижу ничего особенного, чтобы бы отличалось от моих стилей. Вообще, выравнивание в FF зависит и от размера шрифта, и от высоты поля, поэтому в одном случае все может быть в порядке, в другом случае текст может сместиться.

    2. Алексей
      18 июля 2012 г. в 19:33 / ответ на коммент Серёга Кольт

      Например потому что многие ленивы и вставляют текст правой кнопкой мыши, а потом левой кликают на кнопку поиска. А не продвинутые пользователи могут и не знать что по энтеру форма отправится и будут кликать по иконке.

      1. Вот именно — многие ленивы и тыцкают клавишу ентер.
        Да и статистики я не видел на эту тему.

  7. 27 августа 2012 г. в 20:52

    Почерпнул для себя информацию, как сделать кнопку как бы внутри, над окошком поиска)

  8. 5 сентября 2012 г. в 15:15

    А почему не использовать просто background:transparent; так не надо добавлять фон и работает нормально

    1. 5 сентября 2012 г. в 16:02 / ответ на коммент Ринат

      В IE кнопка станет некликабельной.

      1. 5 сентября 2012 г. в 16:08 / ответ на коммент Dimox

        По моему через IE вряд ли кто будет читать блоги )) Пустая трата времени на верстку под IE ))

        1. 5 сентября 2012 г. в 16:23 / ответ на коммент Ринат

          А при чем тут блоги? Поисковые формы ставятся, вообще-то, не только на блоги.

          1. 5 сентября 2012 г. в 17:34 / ответ на коммент Dimox

            А че к словам цепляешься? Я имел ввиду что все сайты

            1. Ваган
              21 сентября 2012 г. в 03:51 / ответ на коммент Ринат

              Мудак ты, Ринат. На IE (хоть и новом) сидят еще около 20-25%.

  9. Александр
    17 марта 2013 г. в 18:54

    Почему при сохранении подложки формы поиска к себе на пк и замене url
    c https://lh4.googleusercontent.com/-EllJnywnmlY/UAaKJYSYYMI/AAAAAAAABUU/IaRo-yUcRmc/s235/search.png
    на img/search.png

    перестает подгружаться подложка. В чем ошибка, добрые люди, подскажите?

    1. Скорее всего, неправильно указываете путь.

  10. Чай-ник такой
    2 сентября 2016 г. в 19:18

    так че в «актион» писать? хренли не дописать статью полностью для чайников. с джиквери кодом и всей прочей — чтоб работало

  11. Daulet
    26 января 2018 г. в 01:03

    А нету ли инструкция для вордпресс чтоб установить этот код?

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код