Как написать поисковую строку на html. Раскрывающееся поле поиска. Выезжающее поле поиска

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

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

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

Поисковые расширения для Google Chrome

Search the current site

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

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

Search the current site внедряется с предустановленной поисковой системой Google, но в параметрах расширения можно установить другой поисковик – Яндекс, Yahoo или Bing. Для этого на кнопке расширения вызываем контекстное меню и выбираем команду «Параметры».

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

Альтернативный поиск Google

Поисковая система Яндекс изначально предусматривает возможность искать информацию в двух других поисковиках - Google и Bing – одним кликом, правда ссылки для перехода в эти поисковики вместе с введённым ключевые запросом ютятся в самом низу страницы результатов поиска.

А вот Google в этом плане более эгоистичен - в его результатах поиска нет никаких упоминаний о поисковиках-конкурентах. Исправить эту ситуацию можно, внедрив в Google Chrome расширение «Альтернативный поиск Google».

Чем постоянно за каждым разом вводить в довесок к ключевому слову «торрент», чтобы получить результаты поиска по торрент-трекерам, проще установить специальное расширение для этих целей TMS (Torrents MultiSearch).

Кнопка расширения внедряется в панель инструментов браузера, и при её нажатии откроется небольшое поисковое поле для ввода запроса.

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

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

Результаты поиска также можно смотреть отдельно по конкретным торрент-трекерам и отдельно по таким типам контента, как фильмы, музыка, программное обеспечение.

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

Контекстный поиск

В Google Chrome внедрена функция контекстного поиска с помощью одного поисковика, установленного в браузере по умолчанию. Увеличить число поисковых систем, с помощью которых можно искать любое выделенное слово на страницах сайтов, призвано расширение «Контекстный поиск».

В расширении изначально присутствует возможность поиска по популярнейшему торрент-трекеру RuTracker, по Википедии и по медийному порталу Kinopoisk.Ru.


Другие поисковики, чтобы через них можно было бы искать информацию прямо из контекстного меню браузера, добавляются в параметрах расширения. Откроем меню Google Chrome, выберем «Настройки» и перейдём в раздел расширений, установленных в браузере.

В перечне расширений выбираем нужное нам – «Контекстный поиск». Жмём ссылку «Параметры».

Поисковые расширения для Opera

Search within the site

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

Предустановленные Яндекс и Google в настройках расширения можно дополнить другими поисковиками. Вызовем на кнопке расширения контекстное меню и выбираем команду «Настройки».

Точно так же, как и в случае с расширением «Контекстный поиск» для Google Chrome, для добавления новой поисковой системы необходимо ввести её URL-строку.

Torrents MultiSearch

Similar image search

Similar image search добавляет в контекстное меню браузера Opera дополнительную команду поиска похожих изображений с помощью нескольких поисковиков.

Или будет представлен список публикаций с похожими картинками.

Поисковые расширения для Mozilla Firefox

Поиск по сайту

Как и в предыдущих двух случаях, специальное расширение для поиска внутри любого сайта в Интернете существует и для браузера Mozilla Firefox.

Только в случае с Огненным Лисом поиск по сайту встраивается в существующее поисковое поле браузера, добавляя перед значком обычного поиска свой значок в виде красного увеличительного стекла.

Смена поисковика по умолчанию для обычного поиска Mozilla Firefox влечёт за собой и смену поисковика и для поиска внутри сайтов.

Расширение «Поиск по сайту» интегрируется в контекстное меню Mozilla Firefox, и, выделив любое «попавшееся под руку» слово, в отдельных результатах поиска можно увидеть все страницы сайта, где это слово присутствует.

Поиск от byffox

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

И о том, что именно предлагает «Софтина от Васи» или «Репак игрули от Пети», приходится узнавать только при детальном ознакомлении с описанием. Тем не менее, за таким легкомысленным названием, как «Поиск от byffox», кроется полезный и толковый функционал. Это расширение позволяет пополнить контекстное меню браузера дополнительной командой поиска выделенного слова с помощью различных поисковиков.

The combined address and search bar allows you to query search engines or input web addresses to find what you’re looking for on the web. Opera uses the Google search engine by default.

To search the web:

  1. Click the Search or enter address field.
  2. Type key words for what you want to find. For example, type movies .
  3. Click one of the predictive search suggestions that appear or press Enter .

Predictive search suggestions appear as you type. If you want to view results from another search engine, such as Yahoo!, Amazon, or Bing, click the corresponding tab that appears in the lower-right part of the predictive search suggestion box.


If you already know the location of a page, type the web address directly into the combined address and search bar and press Enter to navigate to that page. For example, type www.opera.com and press Enter to navigate to the Opera Software homepage.

Default search engine

Opera’s default search engine is Google, but you may prefer to search using Ecosia, DuckDuckGo, Amazon, or Wikipedia. To change the default search engine:

  1. Go to Settings .
  2. Under Search engine , select your preferred search engine from the dropdown menu.

Custom search engines

In addition to Opera’s default search engines, you can set up the combined address and search bar to return results from other search engines. To do so:

  1. Right-click (Ctrl + click on Mac) on a site’s search bar and select Create Search Engine….
  2. Assign the engine a name and keyword.
  3. Click OK .

Create a custom search engine

To create a search in a custom search engine, type your engine’s assigned keyword first followed by a space and then enter your query.

You can edit keywords, and manage or remove search engines from the settings page. To do so:

  1. Go to Settings .
  2. Under Search engine , click the Manage Search Engine button.

Search with a custom search engine

To use a custom search engine in your search, type the keyword followed by a space before your query. For example, Bing has the keyword “b”. To search with Bing, type “b What is the capital of Idaho.” The results will open in a Bing search results page.

The space between the keyword and your search query is important for selecting a custom search engine.


Change search engines in the highlighted text context menu

With Opera’s search pop-up tool, you can highlight text on a web page and use the selected text as a search query. The search pop-up tool uses your default search engine. However, you may want results from another engine after highlighting text for a search query.

To search using the context menu, highlight some text on a web page and right-click (or CTRL + click) the selection.

In the pop-up window, hover your mouse over Search with , then select the search engine you wish to use.


The results of the search will open in a new tab.

Change search engines in Instant Search

How to use search pop-up:

  1. Highlight text on a web page.
  2. A pop-up will appear above the highlighted text, including the options Search and Copy (and Share if on a Mac). If a currency, unit, or time zone is highlighted, the converted value will appear in the pop-up.
  3. Select Search to query your default search engine with the highlighted text.
  4. Select Copy to copy the highlighted text to your clipboard.
  5. If there is a converted value in the pop-up, click the value to copy it to your clipboard.

To disable the search pop-up tool, including all of its functions:

  1. Go to Settings .
  2. Click Advanced on the left sidebar, and click Features .
  3. Under Search pop-up , turn off Enable the search pop-up when selecting text .

Пособие по тому, как сделать мобильно-ориентированную и адаптивную строку поиска

Сегодня мы бы хотели показать вам, как реализовать эффект, как на изображении сверху. Цель - улучшить совместимость с мобильными устройствами и старыми браузерами (IE 8+). Даже если на первый взгляд это кажется простой штукой, то скажу, что нам пришлось применить несколько трюков, чтобы заставить весь механизм работать, как задумывалось.

В общем, чего мы хотим добиться от строки поиска:

  • изначально отображать только кнопку с иконкой поиска
  • при клике на иконку нужно, чтобы поисковая строка выезжала в сторону
  • компонент должен быть гибким, в том смысле, чтобы его можно было использовать в адаптивном интерфейсе
  • когда пользователь печатает что-то в строке, нужно чтобы форму можно было отправить нажатием кнопки Enter или кликом по кнопке поиска
  • если поле раскрыто, и данные в него не введены, а мы нажимаем кнопку поиска - поле ввода должно закрыться
  • также нужно, чтобы поле ввода закрывалось, если мы нажимаем куда-то вне поля поиска, независимо от того, пустое оно или нет
  • если JavaScript отключен, поле поиска должно отображаться раскрытым
  • для лучшего взаимодействия с тач-устройствами также надо добавить поддержку тач-событий

Теперь мы определились со всем, что нам нужно сделать, давайте начнем с разметки.

Разметка

В разметке используем основной контейнер, форму, текстовое поле и кнопку отправки, а также span-элемент для иконки:

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

Теперь, когда все элементы на своих местах, стилизуем их.

CSS

Исходя из наших требований, сперва убедимся, что у нас есть кнопка с видимой иконкой поиска. Все остальное должно быть спрятано. Но также подумаем на шаг вперед и представим, что случится, когда мы расширим строку поиска (с основным контейнером). Как нам это сделать? Используем свойство overflow: hidden , а изменение ширины контейнера sb-search должно проявить поле ввода.

Так что в первую очередь стилизуем контейнер sb-search. Заставим его находиться в плавающем состоянии справа, и зададим ему overflow: hidden . Его исходная ширина будет равняться 60px, но так как мы хотим анимировать до ширины 100%, это вызовет проблемы в мобильных браузерах (iOS). Они не любят переходы из пиксельной ширины в процентную. В этом случае они просто не осуществят переход. Так что вместо этого зададим минимальную ширину в 60px, а ширину в 0%.

Также добавим переход для ширины свойством -webkit-backface-visibility: hidden, что избавит от нежелательных “хвостов” на мобильных браузерах (iOS):

Sb-search { position: relative; margin-top: 10px; width: 0%; min-width: 60px; height: 60px; float: right; overflow: hidden; -webkit-transition: width 0.3s; -moz-transition: width 0.3s; transition: width 0.3s; -webkit-backface-visibility: hidden; }

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

Теперь, давайте спозиционируем поле ввода. Мы используем процентную ширину, так что когда мы раздвинем родительский элемент, поле ввода расширится вместе с ним. Выставление правильной высоты, размера шрифта и полей гарантирует, что текст будет отцентрирован (line-height не отработает в IE8 как могло бы ожидаться, так что вместо этого используем поля). Абсолютное позиционирование поля ввода не обязательно, но оно решает противную проблемку с тем, что иногда при закрытии поля поиска на короткий период времени оно отображается справа от кнопки.

Sb-search-input { position: absolute; top: 0; right: 0; border: none; outline: none; background: #fff; width: 100%; height: 60px; margin: 0; z-index: 10; padding: 20px 65px 20px 20px; font-family: inherit; font-size: 20px; color: #2c3e50; } input.sb-search-input { -webkit-appearance: none; -webkit-border-radius: 0px; }

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

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

Sb-search-input::-webkit-input-placeholder { color: #efb480; } .sb-search-input:-moz-placeholder { color: #efb480; } .sb-search-input::-moz-placeholder { color: #efb480; } .sb-search-input:-ms-input-placeholder { color: #efb480; }

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

Sb-icon-search, .sb-search-submit { width: 60px; height: 60px; display: block; position: absolute; right: 0; top: 0; padding: 0; margin: 0; line-height: 60px; text-align: center; cursor: pointer; }

В изначальном положении мы хотим, чтобы кликабельной была иконка поиска, а когда мы раскроем поле поиска, мы хотим чтобы кликабельной была кнопка отправки формы. Так что изначально зададим кнопке отправки формы z-index=-1, и сделаем ее прозрачной, так чтобы мы всегда видели span с иконкой поиска:

Sb-search-submit { background: #fff; /* для IE */ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* IE 8 */ filter: alpha(opacity=0); /* IE 5-7 */ opacity: 0; color: transparent; border: none; outline: none; z-index: -1; }

Почему бы просто не сделать её фон прозрачным? Да потому, что это не работает в IE, так как элемент не является кликабельным. Так что вместо этого мы используем сплошной фон, и выставляем элементу прозрачность в 0.

Иконка поиска изначально будет иметь высокий z-index, так как нам надо, чтобы она выводилось поверх всего. Используем псевдо-элемент :before , чтобы добавить иконку поиска:

Sb-icon-search { color: #fff; background: #e67e22; z-index: 90; font-size: 22px; font-family: "icomoon"; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; -webkit-font-smoothing: antialiased; } .sb-icon-search:before { content: "\e000"; }

Не забудьте подключить иконочный шрифт в самом начале нашего CSS:

@font-face { font-family: "icomoon"; src:url("../fonts/icomoon/icomoon.eot"); src:url("../fonts/icomoon/icomoon.eot?#iefix") format("embedded-opentype"), url("../fonts/icomoon/icomoon.woff") format("woff"), url("../fonts/icomoon/icomoon.ttf") format("truetype"), url("../fonts/icomoon/icomoon.svg#icomoon") format("svg"); font-weight: normal; font-style: normal; }

С теми стилями, которые мы только что определили, можно просто изменить ширину контейнера sb-search на 100%, присвоив класс sb-search-open. Без JavaScript поле поиска будет открыто по умолчанию:

Sb-search.sb-search-open, .no-js .sb-search { width: 100%; }

Давайте сменим цвет иконки поиска и выставим его за кнопкой отправки формы, задав z-index меньшее значение:

Sb-search.sb-search-open .sb-icon-search, .no-js .sb-search .sb-icon-search { background: #da6d0d; color: #fff; z-index: 11; }

И, наконец, зададим кнопке отправки формы z-index более высокое значение, чтобы мы могли на него кликнуть:

Sb-search.sb-search-open .sb-search-submit, .no-js .sb-search .sb-search-submit { z-index: 90; }

Итак, все стили описаны, давайте займемся JavaScript.

JavaScript

Начнем с переключения класса sb-search-open. Будем добавлять класс тогда, когда будет производиться клик на основной контейнер (sb-search) и убирать его тогда, когда будет произведен клик по кнопке отправки формы, но только, если в поле ничего не записано. Иначе мы просто отправим форму. Чтобы не удалять класс при клике на поле ввода (так как наши триггеры заданы для всего контейнера), нужно предотвратить всплывание события click на этом элементе. Это означает, что при клике на поле ввода не будет вызвано событие click для родительских элементов.

;(function(window) { function UISearch(el, options) { this.el = el; this.inputEl = el.querySelector("form > input.sb-search-input"); this._initEvents(); } UISearch.prototype = { _initEvents: function() { var self = this, initSearchFn = function(ev) { if(!classie.has(self.el, "sb-search-open")) { // открываем ev.preventDefault(); self.open(); } else if(classie.has(self.el, "sb-search-open") && /^\s*$/.test(self.inputEl.value)) { // закрываем self.close(); } } this.el.addEventListener("click", initSearchFn); this.inputEl.addEventListener("click", function(ev) { ev.stopPropagation(); }); }, open: function() { classie.add(this.el, "sb-search-open"); }, close: function() { classie.remove(this.el, "sb-search-open"); } } // заносим в глобальное пространство имен window.UISearch = UISearch; })(window);

Далее нужно добавить события для удаления класса sb-search-open, если мы кликаем куда-то за пределами нашей строки поиска. Для того, чтобы это работало также надо позаботиться о всплывании событий при клике на основной контейнер.

;(function(window) { function UISearch(el, options) { this.el = el; this.inputEl = el.querySelector("form > input.sb-search-input"); this._initEvents(); } UISearch.prototype = { _initEvents: function() { var self = this, initSearchFn = function(ev) { ev.stopPropagation(); if(!classie.has(self.el, "sb-search-open")) { // открываем ev.preventDefault(); self.open(); } else if(classie.has(self.el, "sb-search-open") && /^\s*$/.test(self.inputEl.value)) { // закрываем self.close(); } } this.el.addEventListener("click", initSearchFn); this.inputEl.addEventListener("click", function(ev) { ev.stopPropagation(); }); }, open: function() { var self = this; classie.add(this.el, "sb-search-open"); // закрываем поле поиска, если был клик где-то вне контейнера var bodyFn = function(ev) { self.close(); this.removeEventListener("click", bodyFn); }; document.addEventListener("click", bodyFn); }, close: function() { classie.remove(this.el, "sb-search-open"); } } // заносим в глобальное пространство имен window.UISearch = UISearch; })(window);

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

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

;(function(window) { // http://stackoverflow.com/a/11381730/989439 function mobilecheck() { var check = false; (function(a){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez(0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(|\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg(g|\/(k|l|u)|50|54|\-)|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v)|mwbp|mywa|n10|n20|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-(|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|)|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); return check; } // http://www.jonathantneal.com/blog/polyfills-and-prototypes/ !String.prototype.trim && (String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); }); function UISearch(el, options) { this.el = el; this.inputEl = el.querySelector("form > input.sb-search-input"); this._initEvents(); } UISearch.prototype = { _initEvents: function() { var self = this, initSearchFn = function(ev) { ev.stopPropagation(); // удаляем лишние пробельные символы self.inputEl.value = self.inputEl.value.trim(); if(!classie.has(self.el, "sb-search-open")) { // открываем ev.preventDefault(); self.open(); } else if(classie.has(self.el, "sb-search-open") && /^\s*$/.test(self.inputEl.value)) { // закрываем self.close(); } } this.el.addEventListener("click", initSearchFn); this.inputEl.addEventListener("click", function(ev) { ev.stopPropagation(); }); }, open: function() { var self = this; classie.add(this.el, "sb-search-open"); // переносим фокус на поле ввода if(!mobilecheck()) { this.inputEl.focus(); } // закрываем поле поиска, если был клик где-то вне контейнера var bodyFn = function(ev) { self.close(); this.removeEventListener("click", bodyFn); }; document.addEventListener("click", bodyFn); }, close: function() { this.inputEl.blur(); classie.remove(this.el, "sb-search-open"); } } // заносим в глобальное пространство имен window.UISearch = UISearch; })(window);

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

;(function(window) { // http://stackoverflow.com/a/11381730/989439 function mobilecheck() { var check = false; (function(a){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez(0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(|\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg(g|\/(k|l|u)|50|54|\-)|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v)|mwbp|mywa|n10|n20|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-(|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|)|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); return check; } // http://www.jonathantneal.com/blog/polyfills-and-prototypes/ !String.prototype.trim && (String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); }); function UISearch(el, options) { this.el = el; this.inputEl = el.querySelector("form > input.sb-search-input"); this._initEvents(); } UISearch.prototype = { _initEvents: function() { var self = this, initSearchFn = function(ev) { ev.stopPropagation(); // удаляем лишние пробельные символы self.inputEl.value = self.inputEl.value.trim(); if(!classie.has(self.el, "sb-search-open")) { // открываем ev.preventDefault(); self.open(); } else if(classie.has(self.el, "sb-search-open") && /^\s*$/.test(self.inputEl.value)) { // закрываем ev.preventDefault(); self.close(); } } this.el.addEventListener("click", initSearchFn); this.el.addEventListener("touchstart", initSearchFn); this.inputEl.addEventListener("click", function(ev) { ev.stopPropagation(); }); this.inputEl.addEventListener("touchstart", function(ev) { ev.stopPropagation(); }); }, open: function() { var self = this; classie.add(this.el, "sb-search-open"); // переносим фокус на поле ввода if(!mobilecheck()) { this.inputEl.focus(); } // закрываем поле поиска, если был клик где-то вне контейнера var bodyFn = function(ev) { self.close(); this.removeEventListener("click", bodyFn); this.removeEventListener("touchstart", bodyFn); }; document.addEventListener("click", bodyFn); document.addEventListener("touchstart", bodyFn); }, close: function() { this.inputEl.blur(); classie.remove(this.el, "sb-search-open"); } } // заносим в глобальное пространство имен window.UISearch = UISearch; })(window);

И, наконец, для браузеров, которые не поддерживают addEventListener и removeEventListener , будем использовать EventListener от Jonathan Neal.

// EventListener | @jon_neal | //github.com/jonathantneal/EventListener !window.addEventListener && window.Element && (function () { function addToPrototype(name, method) { Window.prototype = HTMLDocument.prototype = Element.prototype = method; } var registry = ; addToPrototype("addEventListener", function (type, listener) { var target = this; registry.unshift({ __listener: function (event) { event.currentTarget = target; event.pageX = event.clientX + document.documentElement.scrollLeft; event.pageY = event.clientY + document.documentElement.scrollTop; event.preventDefault = function () { event.returnValue = false }; event.relatedTarget = event.fromElement || null; event.stopPropagation = function () { event.cancelBubble = true }; event.relatedTarget = event.fromElement || null; event.target = event.srcElement || target; event.timeStamp = +new Date; listener.call(target, event); }, listener: listener, target: target, type: type }); this.attachEvent("on" + type, registry.__listener); }); addToPrototype("removeEventListener", function (type, listener) { for (var index = 0, length = registry.length; index < length; ++index) { if (registry.target == this && registry.type == type && registry.listener == listener) { return this.detachEvent("on" + type, registry.splice(index, 1).__listener); } } }); addToPrototype("dispatchEvent", function (eventObject) { try { return this.fireEvent("on" + eventObject.type, eventObject); } catch (error) { for (var index = 0, length = registry.length; index < length; ++index) { if (registry.target == this && registry.type == eventObject.type) { registry.call(this, eventObject); } } } }); })();

И вот оно! Надеюсь, вам понравилось данное руководство, и вы почерпнули из него что-то полезное для себя!

Октябрь 25, 2019 Запись была обновлена

Выдвигающаяся форма поиска на сайт

Стиль Flat обрел немалую популярность при дизайне сайтов. И в этом уроке мы рассмотрим еще один элемент сайта, который сделан в этом стиле. Это элемент — форма поиска. Но не простая , а форма поиска которая появляется при нажатии и «сворачивается» если ее не используют. Что касается иконки поиска, то она берется из SVG-файла и является масштабируемой при различных разрешениях экрана(как на мобильных устройствах, так и на больших мониторах).

Пример можно увидеть здесь:

Скачать

Выдвигающаяся форма поиска

Как использовать?

HTML

Сперва определимся с разметкой, которая будет на HTML странице:

1 2 3 4 5 6 7 <div id = "sb-search" class = "sb-search" > <form > <input class = "sb-search-input" placeholder= "Что будет искать?" type = "text" value = "" name = "search" id = "search" > <input class = "sb-search-submit" type = "submit" value = "" > <span class = "sb-icon-search" > </ form > </ div >

В форме поиска ничего необычного нет: текстовое поле для ввода, кнопка поиска и элемент для иконки.

CSS

Теперь добавим стилей, чтобы форма поиска красиво смотрелась на странице.

Так как будет появляться при клике, то изначально она скрыта. Это делается с помощью свойства overflow и его значением hidden , в результате чего скрывается всё что находится за пределами иконки(в итоге мы видим только иконку, а текстовое поле нет):

.sb-search { position : relative ; margin-top : 10px ; width : 0% ; min-width : 60px ; height : 60px ; float : right ; overflow : hidden ; -webkit-transition : width 0.3s; -moz-transition : width 0.3s; transition : width 0.3s; -webkit-backface-visibility : hidden ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 .sb-search-input { position : absolute ; top : 0 ; right : 0 ; border : none ; outline : none ; background : #fff ; width : 100% ; height : 60px ; margin : 0 ; z-index : 10 ; padding : 20px 65px 20px 20px ; font-family : inherit ; font-size : 20px ; color : #2c3e50 ; } input[ type= "search" ] .sb-search-input { -webkit-appearance: none ; -webkit-border-radius : 0px ; }

Определяем цвет текста, который находится на фоне запроса(текста, который мы вводим при поиске):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .sb-search-input : :-webkit-input-placeholder { color : #efb480 ; } .sb-search-input :-moz-placeholder { color : #efb480 ; } .sb-search-input : :-moz-placeholder { color : #efb480 ; } .sb-search-input :-ms-input-placeholder { color : #efb480 ; }

Кнопка поиска находится всегда над остальными блоками и элементами на странице, поэтому задаем ей большое значение z-index :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .sb-icon-search { color : #fff ; background : #e67e22 ; z-index : 90 ; font-size : 22px ; font-family : "icomoon" ; speak : none ; font-style : normal ; font-weight : normal ; font-variant : normal ; text-transform : none ; -webkit-font-smoothing : antialiased; } .sb-icon-search :before { content : "\e000 " ; }

Также не забываем подключить специальные иконки(SVG). Для того чтобы вставить иконку в кнопке поиска:

1 2 3 4 5 6 7 8 9 10 @font-face { font-family : "icomoon" ; src: url ("../fonts/icomoon/icomoon.eot" ) ; src: url ("../fonts/icomoon/icomoon.eot?#iefix" ) format("embedded-opentype" ) , url ("../fonts/icomoon/icomoon.woff" ) format("woff" ) , url ("../fonts/icomoon/icomoon.ttf" ) format("truetype" script > <script src = "js/uisearch.js" > <script > new UISearch(document.getElementById("sb-search")); </ script >

Вывод

Симпатичная форма поиска, которая занимает очень мало места на сайте и красиво появляется при нажатии на иконку с поиском.